From dc0bf207b8c2b14c142b40ae73b920d99920b289 Mon Sep 17 00:00:00 2001 From: Twentysix Date: Sat, 13 Feb 2016 14:52:26 +0100 Subject: [PATCH] Added !server, !join and some general improvements Audio's task now properly checks if the audio module is still loaded Added !server to cogs.general for server info Added !join (owner only) to make Red join other servers settings.json now gets deleted if login fails --- cogs/audio.py | 6 +--- cogs/general.py | 44 +++++++++++++++++++++-------- cogs/mod.py | 1 - red.py | 75 +++++++++++++++++++++++++++++++++++-------------- 4 files changed, 87 insertions(+), 39 deletions(-) diff --git a/cogs/audio.py b/cogs/audio.py index 6c4a8ebc5..f1568d63a 100644 --- a/cogs/audio.py +++ b/cogs/audio.py @@ -41,7 +41,6 @@ class Audio: self.playlist = [] self.current = -1 #current track index in self.playlist self.downloader = {"DONE" : False, "TITLE" : False, "ID" : False, "URL" : False, "DURATION" : False, "DOWNLOADING" : False} - self.quit_manager = False self.skip_votes = [] self.sing = ["https://www.youtube.com/watch?v=zGTkAVsrfg8", "https://www.youtube.com/watch?v=cGMWL8cOeAU", @@ -422,7 +421,7 @@ class Audio: return False async def queue_manager(self): - while not self.quit_manager: + while "Audio" in self.bot.cogs: if self.queue and not self.music_player.is_playing(): new_link = self.queue[0] self.queue.pop(0) @@ -453,10 +452,7 @@ class Audio: async def incoming_messages(self, msg): # Workaround, need to fix if msg.author.id != self.bot.user.id: - cmds = ("unload cogs.audio", "reload cogs.audio") - if msg.content in cmds: - self.quit_manager = True if msg.channel.is_private and msg.attachments != []: await self.transfer_playlist(msg) if not msg.channel.is_private: diff --git a/cogs/general.py b/cogs/general.py index 58210f3b7..aef8a356b 100644 --- a/cogs/general.py +++ b/cogs/general.py @@ -133,30 +133,50 @@ class General: await self.bot.say("http://lmgtfy.com/?q=" + text) @commands.command(no_pm=True, hidden=True) - async def hug(self, member : discord.Member = None): + async def hug(self, user : discord.Member = None): """Because everyone likes hugs""" - await self.bot.say("(っ´▽`)っ" + " *" + member.name + "*") + await self.bot.say("(っ´▽`)っ" + " *" + user.name + "*") @commands.command(pass_context=True, no_pm=True) - async def info(self, ctx, member : discord.Member = None): - """Shows member's information""" + async def info(self, ctx, user : discord.Member = None): + """Shows users's informations""" author = ctx.message.author - if not member: - member = author + if not user: + user = author roles = [] - for m in member.roles: + for m in user.roles: if m.name != "@everyone": roles.append('"' + m.name + '"') #.replace("@", "@\u200b") if not roles: roles = ["None"] data = "```\n" - data += "Name: " + member.name + "\n" - data += "ID: " + member.id + "\n" - data += "Joined: " + str(member.joined_at) + "\n" + data += "Name: " + user.name + "\n" + data += "ID: " + user.id + "\n" + data += "Joined: " + str(user.joined_at) + "\n" data += "Roles: " + " ".join(roles) + "\n" - data += "Avatar: " + member.avatar_url + "\n" + data += "Avatar: " + user.avatar_url + "\n" data += "```" await self.bot.say(data) + @commands.command(pass_context=True, no_pm=True) + async def server(self, ctx): + """Shows server's informations""" + server = ctx.message.server + online = str(len([m.status for m in server.members if str(m.status) == "online" or str(m.status) == "idle"])) + total = str(len(server.members)) + + data = "```\n" + data += "Name: " + server.name + "\n" + data += "ID: " + server.id + "\n" + data += "Region: " + server.region.name + "\n" + data += "Users: " + online + "/" + total + "\n" + data += "Channels: " + str(len(server.channels)) + "\n" + data += "Roles: " + str(len(server.roles)) + "\n" + data += "Created: " + str(server.owner.joined_at) + "\n" + data += "Owner: " + server.owner.name + "\n" + data += "Icon: " + str(server.icon_url) + "\n" + data += "```" + await self.bot.say(data) + @commands.command() async def urban(self, *, search_terms : str): """Urban Dictionary search""" @@ -275,4 +295,4 @@ class NewPoll(): def setup(bot): n = General(bot) bot.add_listener(n.check_poll_votes, "on_message") - bot.add_cog(n) + bot.add_cog(n) \ No newline at end of file diff --git a/cogs/mod.py b/cogs/mod.py index a293ad175..cfd329c53 100644 --- a/cogs/mod.py +++ b/cogs/mod.py @@ -2,7 +2,6 @@ import discord from discord.ext import commands from .utils import checks from .utils.dataIO import fileIO -import __main__ import os class Mod: diff --git a/red.py b/red.py index b8368e1cb..5e2445362 100644 --- a/red.py +++ b/red.py @@ -9,6 +9,7 @@ import copy import glob import os import time +import sys # # Red, a Discord bot by Twentysix, based on discord.py and its command extension @@ -175,6 +176,18 @@ async def shutdown(): """Shuts down Red""" exit(1) +@bot.command() +@checks.is_owner() +async def join(invite_url : discord.Invite): + """Joins new server""" + try: + await bot.accept_invite(invite_url) + await bot.say("Server joined.") + except discord.NotFound: + await bot.say("The invite was invalid or expired.") + except discord.HTTPException: + await bot.say("I wasn't able to accept the invite. Try again.") + @bot.command() @checks.is_owner() async def setprefix(*text): @@ -244,9 +257,6 @@ def check_configs(): settings_path = "data/red/settings.json" settings = {"EMAIL" : "EmailHere", "PASSWORD" : "PasswordHere", "OWNER" : "id_here", "PREFIXES" : [], "ADMIN_ROLE" : "Transistor", "MOD_ROLE" : "Process"} if not os.path.isfile(settings_path): - print("Creating new settings.json...") - with open(settings_path, "w") as f: - f.write(json.dumps(settings)) print("Red - First run configuration") print("If you don't have one, create a NEW ACCOUNT for Red. Do *not* use yours. (https://discordapp.com)") @@ -262,7 +272,7 @@ def check_configs(): print("\nChoose a prefix (or multiple ones, one at once) for the commands. Type exit when you're done. Example prefix: !") settings["PREFIXES"] = [] new_prefix = "" - while new_prefix.lower() != "exit": + while new_prefix.lower() != "exit" and settings["PREFIXES"] != []: new_prefix = input("Prefix> ") if new_prefix.lower() != "exit" and new_prefix != "": settings["PREFIXES"].append(new_prefix) @@ -310,6 +320,14 @@ def set_cog(cog, value): f.write(json.dumps(data)) def load_cogs(): + try: + if sys.argv[1] == "--no-prompt": + no_prompt = True + else: + no_prompt = False + except: + no_prompt = False + with open('data/red/cogs.json', "r") as f: data = json.load(f) register = tuple(data.keys()) #known cogs @@ -327,17 +345,18 @@ def load_cogs(): print(e) failed.append(extension) else: - print("\nNew extension: " + extension) - print("Load it?(y/n)") - if get_answer(): - data[extension] = True - try: - bot.load_extension(extension) - except Exception as e: - print(e) - failed.append(extension) - else: - data[extension] = False + if not no_prompt: + print("\nNew extension: " + extension) + print("Load it?(y/n)") + if get_answer(): + data[extension] = True + try: + bot.load_extension(extension) + except Exception as e: + print(e) + failed.append(extension) + else: + data[extension] = False if extensions: with open('data/red/cogs.json', "w") as f: @@ -349,12 +368,26 @@ def load_cogs(): print(m + " ", end="") print("\n") -check_folders() -check_configs() -settings = load_settings() - -if __name__ == '__main__': +def main(): + global settings + check_folders() + check_configs() + settings = load_settings() checks.owner = settings["OWNER"] load_cogs() bot.command_prefix = settings["PREFIXES"] - bot.run(settings['EMAIL'], settings['PASSWORD']) + yield from bot.login(settings["EMAIL"], settings["PASSWORD"]) + yield from bot.connect() + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + try: + loop.run_until_complete(main()) + except discord.LoginFailure: + print("Invalid login credentials. Restart Red and configure it properly.") + os.remove('data/red/settings.json') # Hopefully this won't backfire in case of discord servers' problems + except Exception as e: + print(e) + loop.run_until_complete(bot.logout()) + finally: + loop.close()