class Bot(commands.Bot): def __init__(self, *args, **kwargs): def prefix_manager(bot, message): """ Returns prefixes of the message's server if set. If none are set or if the message's server is None it will return the global prefixes instead. Requires a Bot instance and a Message object to be passed as arguments. """ return bot.settings.get_prefixes(message.server) self.counter = Counter() self.uptime = datetime.datetime.utcnow() # Refreshed before login self._message_modifiers = [] self.settings = Settings() self._intro_displayed = False self._shutdown_mode = None self.logger = set_logger(self) self._last_exception = None self.oauth_url = "" if 'self_bot' in kwargs: self.settings.self_bot = kwargs['self_bot'] else: kwargs['self_bot'] = self.settings.self_bot if self.settings.self_bot: kwargs['pm_help'] = False super().__init__(*args, command_prefix=prefix_manager, **kwargs) async def send_message(self, *args, **kwargs): if self._message_modifiers: if "content" in kwargs: pass elif len(args) == 2: args = list(args) kwargs["content"] = args.pop() else: return await super().send_message(*args, **kwargs) content = kwargs['content'] for m in self._message_modifiers: try: content = str(m(content)) except: # Faulty modifiers should not pass # break send_message kwargs['content'] = content return await super().send_message(*args, **kwargs) async def shutdown(self, *, restart=False): """Gracefully quits Red with exit code 0 If restart is True, the exit code will be 26 instead The launcher automatically restarts Red when that happens""" self._shutdown_mode = not restart await self.logout() def add_message_modifier(self, func): """ Adds a message modifier to the bot A message modifier is a callable that accepts a message's content as the first positional argument. Before a message gets sent, func will get called with the message's content as the only argument. The message's content will then be modified to be the func's return value. Exceptions thrown by the callable will be catched and silenced. """ if not callable(func): raise TypeError("The message modifier function " "must be a callable.") self._message_modifiers.append(func) def remove_message_modifier(self, func): """Removes a message modifier from the bot""" if func not in self._message_modifiers: raise RuntimeError("Function not present in the message " "modifiers.") self._message_modifiers.remove(func) def clear_message_modifiers(self): """Removes all message modifiers from the bot""" self._message_modifiers.clear() async def send_cmd_help(self, ctx): if ctx.invoked_subcommand: pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand) for page in pages: await self.send_message(ctx.message.channel, page) else: pages = self.formatter.format_help_for(ctx, ctx.command) for page in pages: await self.send_message(ctx.message.channel, page) def user_allowed(self, message): author = message.author if author.bot: return False if author == self.user: return self.settings.self_bot mod_cog = self.get_cog('Mod') global_ignores = self.get_cog('Owner').global_ignores if self.settings.owner == author.id: return True if author.id in global_ignores["blacklist"]: return False if global_ignores["whitelist"]: if author.id not in global_ignores["whitelist"]: return False if not message.channel.is_private: server = message.server names = (self.settings.get_server_admin(server), self.settings.get_server_mod(server)) results = map( lambda name: discord.utils.get(author.roles, name=name), names) for r in results: if r is not None: return True if mod_cog is not None: if not message.channel.is_private: if message.server.id in mod_cog.ignore_list["SERVERS"]: return False if message.channel.id in mod_cog.ignore_list["CHANNELS"]: return False return True async def pip_install(self, name, *, timeout=None): """ Installs a pip package in the local 'lib' folder in a thread safe way. On Mac systems the 'lib' folder is not used. Can specify the max seconds to wait for the task to complete Returns a bool indicating if the installation was successful """ IS_MAC = sys.platform == "darwin" interpreter = sys.executable if interpreter is None: raise RuntimeError("Couldn't find Python's interpreter") args = [ interpreter, "-m", "pip", "install", "--upgrade", "--target", "lib", name ] if IS_MAC: # --target is a problem on Homebrew. See PR #552 args.remove("--target") args.remove("lib") def install(): code = subprocess.call(args) sys.path_importer_cache = {} return not bool(code) response = self.loop.run_in_executor(None, install) return await asyncio.wait_for(response, timeout=timeout)
class Bot(commands.Bot): def __init__(self, *args, **kwargs): def prefix_manager(bot, message): """ Returns prefixes of the message's server if set. If none are set or if the message's server is None it will return the global prefixes instead. Requires a Bot instance and a Message object to be passed as arguments. """ return bot.settings.get_prefixes(message.server) self.counter = Counter() self.uptime = datetime.datetime.utcnow() # Refreshed before login self._message_modifiers = [] self.settings = Settings() self._intro_displayed = False self._shutdown_mode = None self.logger = set_logger(self) self._last_exception = None self.oauth_url = "" try: self._cog_registry = dataIO.load_json("data/red/cogs.json") except Exception: self._cog_registry = {} if 'self_bot' in kwargs: self.settings.self_bot = kwargs['self_bot'] else: kwargs['self_bot'] = self.settings.self_bot if self.settings.self_bot: kwargs['pm_help'] = False super().__init__(*args, command_prefix=prefix_manager, **kwargs) async def send_message(self, *args, **kwargs): if self._message_modifiers: if "content" in kwargs: pass elif len(args) == 2: args = list(args) kwargs["content"] = args.pop() else: return await super().send_message(*args, **kwargs) content = kwargs['content'] for m in self._message_modifiers: try: content = str(m(content)) except: # Faulty modifiers should not pass # break send_message kwargs['content'] = content return await super().send_message(*args, **kwargs) async def shutdown(self, *, restart=False): """Gracefully quits Red with exit code 0 If restart is True, the exit code will be 26 instead The launcher automatically restarts Red when that happens""" self._shutdown_mode = not restart await self.logout() def add_message_modifier(self, func): """ Adds a message modifier to the bot A message modifier is a callable that accepts a message's content as the first positional argument. Before a message gets sent, func will get called with the message's content as the only argument. The message's content will then be modified to be the func's return value. Exceptions thrown by the callable will be catched and silenced. """ if not callable(func): raise TypeError("The message modifier function " "must be a callable.") self._message_modifiers.append(func) def remove_message_modifier(self, func): """Removes a message modifier from the bot""" if func not in self._message_modifiers: raise RuntimeError("Function not present in the message " "modifiers.") self._message_modifiers.remove(func) def clear_message_modifiers(self): """Removes all message modifiers from the bot""" self._message_modifiers.clear() async def send_cmd_help(self, ctx): if ctx.invoked_subcommand: pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand) for page in pages: await self.send_message(ctx.message.channel, page) else: pages = self.formatter.format_help_for(ctx, ctx.command) for page in pages: await self.send_message(ctx.message.channel, page) def user_allowed(self, message): author = message.author if author.bot: return False if author == self.user: return self.settings.self_bot mod_cog = self.get_cog('Mod') global_ignores = self.get_cog('Owner').global_ignores if self.settings.owner == author.id: return True if author.id in global_ignores["blacklist"]: return False if global_ignores["whitelist"]: if author.id not in global_ignores["whitelist"]: return False if not message.channel.is_private: server = message.server names = (self.settings.get_server_admin( server), self.settings.get_server_mod(server)) results = map( lambda name: discord.utils.get(author.roles, name=name), names) for r in results: if r is not None: return True if mod_cog is not None: if not message.channel.is_private: if message.server.id in mod_cog.ignore_list["SERVERS"]: return False if message.channel.id in mod_cog.ignore_list["CHANNELS"]: return False return True async def pip_install(self, name, *, timeout=None): """ Installs a pip package in the local 'lib' folder in a thread safe way. On Mac systems the 'lib' folder is not used. Can specify the max seconds to wait for the task to complete Returns a bool indicating if the installation was successful """ IS_MAC = sys.platform == "darwin" interpreter = sys.executable if interpreter is None: raise RuntimeError("Couldn't find Python's interpreter") args = [ interpreter, "-m", "pip", "install", "--upgrade", "--target", "lib", name ] if IS_MAC: # --target is a problem on Homebrew. See PR #552 args.remove("--target") args.remove("lib") def install(): code = subprocess.call(args) sys.path_importer_cache = {} return not bool(code) response = self.loop.run_in_executor(None, install) return await asyncio.wait_for(response, timeout=timeout) def set_cog(self, cog, value, save=True): self._cog_registry[cog] = value if save: self.save_cogs() def save_cogs(self): dataIO.save_json("data/red/cogs.json", self._cog_registry) @property def first_run(self): return self.settings.bot_settings == self.settings.default_settings
class Bot(commands.Bot): def __init__(self, *args, **kwargs): def prefix_manager(bot, message): """ Retourne les préfixes du message du serveur si défini. Si aucun n'est défini ou si le message du server est None cela renverra les préfixes globaux à la place. Nécessite une instance Bot et un objet Message passé en arguments. """ return bot.settings.get_prefixes(message.server) self.counter = Counter() self.uptime = datetime.datetime.utcnow() # Refreshed before login self._message_modifiers = [] self.settings = Settings() self._intro_displayed = False self._shutdown_mode = None self.logger = set_logger(self) self._last_exception = None self.oauth_url = "" self.printdebug = True if 'self_bot' in kwargs: self.settings.self_bot = kwargs['self_bot'] else: kwargs['self_bot'] = self.settings.self_bot if self.settings.self_bot: kwargs['pm_help'] = False super().__init__(*args, command_prefix=prefix_manager, **kwargs) async def check_is_command(self, message): _internal_channel = message.channel _internal_author = message.author view = commands.view.StringView(message.content) prefix = await bot._get_prefix(message) invoked_prefix = prefix if not isinstance(prefix, (tuple, list)): if not view.skip_string(prefix): return False else: invoked_prefix = discord.utils.find(view.skip_string, prefix) if invoked_prefix is None: return False invoker = view.get_word() # tmp = { # 'bot': self, # 'invoked_with': invoker, # 'message': message, # 'view': view, # 'prefix': invoked_prefix # } # ctx = commands.Context(**tmp) # del tmp if invoker in self.commands: return True # command = self.commands[invoker] # self.dispatch('command', command, ctx) # try: # yield from command.invoke(ctx) # except CommandError as e: # ctx.command.dispatch_error(e, ctx) # else: # self.dispatch('command_completion', command, ctx) elif invoker: return False # exc = CommandNotFound('Command "{}" is not found'.format(invoker)) # self.dispatch('command_error', exc, ctx) async def check_for_passthru_command(self, message): allowed_passthru_cmd = ('cleanup', 'mute', 'unmute', 'candidate') view = commands.view.StringView(message.content) # if self._skip_check(message.author, self.user): # return prefix = await bot._get_prefix(message) invoked_prefix = prefix if not isinstance(prefix, (tuple, list)): if not view.skip_string(prefix): return else: invoked_prefix = discord.utils.find(view.skip_string, prefix) if invoked_prefix is None: return invoker = view.get_word() if invoker in allowed_passthru_cmd: return True else: return False async def send_message(self, *args, **kwargs): if self._message_modifiers: if "content" in kwargs: pass elif len(args) == 2: args = list(args) kwargs["content"] = args.pop() else: return await super().send_message(*args, **kwargs) content = kwargs['content'] for m in self._message_modifiers: try: content = str(m(content)) except: # Faulty modifiers should not pass # break send_message kwargs['content'] = content return await super().send_message(*args, **kwargs) async def shutdown(self, *, restart=False): """Quitte le Bot gracieusement avec le code de sortie 0 Si restart a la valeur True, le code de sortie sera 26 Le lanceur redémarre automatiquement le Bot lorsque cela se produit""" self._shutdown_mode = not restart await self.logout() def add_message_modifier(self, func): """ Ajoute un modificateur de message au bot Un modificateur de message est un appelable qui accepte un message contenu comme premier argument positionnel. Avant qu'un message ne soit envoyé, la fonction sera appelé avec le contenu du message comme seul argument. Le contenu du message sera ensuite modifé pour être la seule valeur de retour de la fonction. Les exceptions lancées par l'appelable seront captées et réduites au silence. """ if not callable(func): raise TypeError("La fonction de modificataeur de message " "doit être un appelable.") self._message_modifiers.append(func) def remove_message_modifier(self, func): """Supprime un modificateur de message du bot""" if func not in self._message_modifiers: raise RuntimeError("Fonction non présente dans le " "modificateur de message.") self._message_modifiers.remove(func) def clear_message_modifiers(self): """Supprime tous les modificateurs de message du bot""" self._message_modifiers.clear() async def send_cmd_help(self, ctx): print("went here 1") if ctx.invoked_subcommand: print("went here 2") pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand) for page in pages: await self.send_message(ctx.message.channel, page) else: print("went here 3") pages = self.formatter.format_help_for(ctx, ctx.command) for page in pages: await self.send_message(ctx.message.channel, page) def user_allowed(self, message): author = message.author if author.bot: return False if author == self.user: return self.settings.self_bot mod_cog = self.get_cog('Mod') global_ignores = self.get_cog('Owner').global_ignores if self.settings.owner == author.id: return True if author.id in global_ignores["blacklist"]: return False if global_ignores["whitelist"]: if author.id not in global_ignores["whitelist"]: return False if not message.channel.is_private: server = message.server names = (self.settings.get_server_cocap(server), self.settings.get_server_admin(server), self.settings.get_server_mod(server), self.settings.get_server_sel(server)) results = map( lambda name: discord.utils.get(author.roles, name=name), names) for r in results: if r is not None: return True if mod_cog is not None: if not message.channel.is_private: if message.server.id in mod_cog.ignore_list["SERVERS"]: return False if message.channel.id in mod_cog.ignore_list["CHANNELS"]: return False return True async def pip_install(self, name, *, timeout=None): """ Installe un paquet pip dans le dossier local 'lib' dans un thread sécurisé. Sur les systèmes Mac, le dossier 'lib' n'est pas utilisé. Peut spécifier les secondes maximum à attendre pour que la tâche soit terminée Retourne un booléen indiquant si l'installation a réussi """ IS_MAC = sys.platform == "darwin" interpreter = sys.executable if interpreter is None: raise RuntimeError( "Impossible de trouver l'interpréteur de Python") args = [ interpreter, "-m", "pip", "install", "--upgrade", "--target", "lib", name ] if IS_MAC: # --target is a problem on Homebrew. See PR #552 args.remove("--target") args.remove("lib") def install(): code = subprocess.call(args) sys.path_importer_cache = {} return not bool(code) response = self.loop.run_in_executor(None, install) return await asyncio.wait_for(response, timeout=timeout)
class Bot(commands.Bot): def __init__(self, *args, **kwargs): def prefix_manager(bot, message): """ Zwraca prefixy serverowe, a jeśli nie istnieją, globalne wymaga instancji bota i wiadomości """ return bot.settings.get_prefixes(message.server) self.counter = Counter() self.uptime = datetime.datetime.utcnow( ) # Odświerzane przed logowaniem self._message_modifiers = [] self.settings = Settings() self._intro_displayed = False self._shutdown_mode = None self.logger = set_logger(self) self._last_exception = None self.oauth_url = "" if 'self_bot' in kwargs: self.settings.self_bot = kwargs['self_bot'] else: kwargs['self_bot'] = self.settings.self_bot if self.settings.self_bot: kwargs['pm_help'] = False super().__init__(*args, command_prefix=prefix_manager, **kwargs) async def send_message(self, *args, **kwargs): if self._message_modifiers: if "content" in kwargs: pass elif len(args) == 2: args = list(args) kwargs["content"] = args.pop() else: return await super().send_message(*args, **kwargs) content = kwargs['content'] for m in self._message_modifiers: try: content = str(m(content)) except: # złe modyfikatory pass # nie zepsują wiadomości kwargs['content'] = content return await super().send_message(*args, **kwargs) async def shutdown(self, *, restart=False): """wyłącza bota z kodem 1 jeśli restart=true bot spróbuje się zrestartować z kodem 26""" self._shutdown_mode = not restart await self.logout() def add_message_modifier(self, func): """ Dodaje modyfikator do wiadomości Można wywołać coś zawartością wiadomości przed wysłaniem wiadmości funkcja zostanie zawołana z treścią jako argumentem Excepcje wyrzucone zostaną wyciszone """ if not callable(func): raise TypeError("Funkcja modyfikatora wiadmości " "musi bć zdolna do bycia wywołaną.") self._message_modifiers.append(func) def remove_message_modifier(self, func): """Usuwa modyfikator wiadomości""" if func not in self._message_modifiers: raise RuntimeError( "Funkcja nie istnieje w modyfikatorach wiadomości") self._message_modifiers.remove(func) def clear_message_modifiers(self): """Usuwa wszystkie modyfikatory wiadmości""" self._message_modifiers.clear() async def send_cmd_help(self, ctx): if ctx.invoked_subcommand: pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand) for page in pages: await self.send_message(ctx.message.channel, page) else: pages = self.formatter.format_help_for(ctx, ctx.command) for page in pages: await self.send_message(ctx.message.channel, page) def user_allowed(self, message): author = message.author if author.bot: return False if author == self.user: return self.settings.self_bot mod_cog = self.get_cog('Mod') global_ignores = self.get_cog('Owner').global_ignores if self.settings.owner == author.id: return True if author.id in global_ignores["blacklist"]: return False if global_ignores["whitelist"]: if author.id not in global_ignores["whitelist"]: return False if not message.channel.is_private: server = message.server names = (self.settings.get_server_admin(server), self.settings.get_server_mod(server)) results = map( lambda name: discord.utils.get(author.roles, name=name), names) for r in results: if r is not None: return True if mod_cog is not None: if not message.channel.is_private: if message.server.id in mod_cog.ignore_list["SERVERS"]: return False if message.channel.id in mod_cog.ignore_list["CHANNELS"]: return False return True async def pip_install(self, name, *, timeout=None): """ Bezpiecznie instaluje pakiet pip w folderze lib Zwraca boolean jeśli się powiodło """ IS_MAC = sys.platform == "darwin" interpreter = sys.executable if interpreter is None: raise RuntimeError("Nie moge znaleźć interpretatora Pythona") args = [ interpreter, "-m", "pip", "install", "--upgrade", "--target", "lib", name ] if IS_MAC: # --target is a problem on Homebrew. See PR #552 args.remove("--target") args.remove("lib") def install(): code = subprocess.call(args) sys.path_importer_cache = {} return not bool(code) response = self.loop.run_in_executor(None, install) return await asyncio.wait_for(response, timeout=timeout)
class Bot(commands.Bot): def __init__(self, *args, **kwargs): def prefix_manager(bot, message): """ Returns prefixes of the message's server if set. If none are set or if the message's server is None it will return the global prefixes instead. Requires a Bot instance and a Message object to be passed as arguments. """ return bot.settings.get_prefixes(message.server) self.counter = Counter() self.uptime = datetime.datetime.utcnow() # Refreshed before login self._message_modifiers = [] self.settings = Settings() self._intro_displayed = False self.logger = set_logger(self) if 'self_bot' in kwargs: self.settings.self_bot = kwargs['self_bot'] else: kwargs['self_bot'] = self.settings.self_bot super().__init__(*args, command_prefix=prefix_manager, **kwargs) async def send_message(self, *args, **kwargs): if self._message_modifiers: if "content" in kwargs: pass elif len(args) == 2: args = list(args) kwargs["content"] = args.pop() else: return await super().send_message(*args, **kwargs) content = kwargs['content'] for m in self._message_modifiers: try: content = str(m(content)) except: # Faulty modifiers should not pass # break send_message kwargs['content'] = content return await super().send_message(*args, **kwargs) def add_message_modifier(self, func): """ Adds a message modifier to the bot A message modifier is a callable that accepts a message's content as the first positional argument. Before a message gets sent, func will get called with the message's content as the only argument. The message's content will then be modified to be the func's return value. Exceptions thrown by the callable will be catched and silenced. """ if not callable(func): raise TypeError("The message modifier function " "must be a callable.") self._message_modifiers.append(func) def remove_message_modifier(self, func): """Removes a message modifier from the bot""" if func not in self._message_modifiers: raise RuntimeError("Function not present in the message " "modifiers.") self._message_modifiers.remove(func) def clear_message_modifiers(self): """Removes all message modifiers from the bot""" self._message_modifiers.clear() async def send_cmd_help(self, ctx): if ctx.invoked_subcommand: pages = self.formatter.format_help_for(ctx, ctx.invoked_subcommand) for page in pages: await self.send_message(ctx.message.channel, page) else: pages = self.formatter.format_help_for(ctx, ctx.command) for page in pages: await self.send_message(ctx.message.channel, page) def user_allowed(self, message): author = message.author if author.bot: return False if author == self.user: return self.settings.self_bot mod = self.get_cog('Mod') if mod is not None: if self.settings.owner == author.id: return True if not message.channel.is_private: server = message.server names = (self.settings.get_server_admin(server), self.settings.get_server_mod(server)) results = map( lambda name: discord.utils.get(author.roles, name=name), names) for r in results: if r is not None: return True if author.id in mod.blacklist_list: return False if mod.whitelist_list: if author.id not in mod.whitelist_list: return False if not message.channel.is_private: if message.server.id in mod.ignore_list["SERVERS"]: return False if message.channel.id in mod.ignore_list["CHANNELS"]: return False return True else: return True