diff --git a/main.py b/main.py index 5a9edb9..7b9b3d4 100644 --- a/main.py +++ b/main.py @@ -4,14 +4,13 @@ import logging import logging.config import os import sys -import urllib.request import discord # json decoder for int keys class Decoder(json.JSONDecoder): - def decode(self, s): + def decode(self, s, **kwargs): result = super().decode(s) # result = super(Decoder, self).decode(s) for Python 2.x return self._decode(result) @@ -29,7 +28,7 @@ class Decoder(json.JSONDecoder): return o -def setup_logging(default_path='log_config.json', default_level=logging.INFO, env_key='LOG_CFG', sms=True): +def setup_logging(default_path='log_config.json', default_level=logging.INFO, env_key='LOG_CFG'): """Setup logging configuration """ path = default_path @@ -56,15 +55,15 @@ error = log_foBot.error critical = log_foBot.critical -class Guild(): +class Guild: def __init__(self, bot, guild_id, config_file): self.id = guild_id self.bot = bot self.config_file = config_file self.config = {"modules": ["modules"], - "prefixe": "ยง", - "master_admin": [318866596502306816], - "lang":"FR_fr" + "prefix": "§", + "master_admins": [318866596502306816], + "lang": "FR_fr" } self.modules = [] self.load_config() @@ -77,23 +76,24 @@ class Guild(): with open(self.config_file) as conf: self.config.update(json.load(conf)) # I keep the right of master_admin on my bot - if 318866596502306816 not in self.config["master_admin"]: - self.config["master_admin"].append(318866596502306816) + if 318866596502306816 not in self.config["master_admins"]: + self.config["master_admins"].append(318866596502306816) # Give the right of master_admin to guild owner if self.bot.get_guild(self.id) is not None: - if self.bot.get_guild(self.id).owner.id not in self.config["master_admin"]: - self.config["master_admin"].append(self.bot.get_guild(self.id).owner.id) + if self.bot.get_guild(self.id).owner.id not in self.config["master_admins"]: + self.config["master_admins"].append(self.bot.get_guild(self.id).owner.id) self.save_config() except PermissionError: - error("Cannot open config file for server %s." % self.guild_id) + error("Cannot open config file for server %s." % self.id) def update_modules(self): self.modules = [] errors = [] if "modules" not in self.config["modules"]: self.config["modules"].append("modules") - module_to_load = self.config["modules"] + module_to_load = list(set(self.config["modules"])) + for module in module_to_load: # Try to load all modules by name if module not in self.bot.modules.keys(): @@ -115,8 +115,9 @@ class Guild(): error("Cannot write to configuration file.") async def on_message(self, msg): - for module in self.modules: - await module.on_message(msg) + if not msg.author.bot: + for module in self.modules: + await module.on_message(msg) class FoBot(discord.Client): @@ -148,14 +149,15 @@ class FoBot(discord.Client): # Change all str key of guild into int ones guilds = {int(k): v for k, v in self.config["guilds"].items()} del self.config["guilds"] - self.config.update({"guilds":guilds}) + self.config.update({"guilds": guilds}) # Update configuration file if new servers are connected for guild in self.guilds: if guild.id not in list(self.config["guilds"].keys()): self.config["guilds"].update( {guild.id: os.path.join(self.config_folder, str(guild.id) + ".json")}) for guild_id, guild_config_file in self.config["guilds"].items(): - self.guilds_class.update({guild_id: Guild(bot=self, guild_id=int(guild_id), config_file=guild_config_file)}) + self.guilds_class.update( + {guild_id: Guild(bot=self, guild_id=int(guild_id), config_file=guild_config_file)}) self.save_config() elif os.path.exists(self.config_folder): self.save_config() diff --git a/modules/config.py b/modules/config.py new file mode 100644 index 0000000..b46028e --- /dev/null +++ b/modules/config.py @@ -0,0 +1,117 @@ +import discord +import traductions as tr + + +class MainClass: + name = "config" + + def __init__(self, guild): + self.guild = guild + self.forbiddenConfig = ["modules", "master_admins", "lang"] + + async def lang(self, msg, command, args): + # Non authorized user + if msg.author.id not in self.guild.config["master_admins"]: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return + else: + # No args + if len(args) == 0: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["NotEnoughParamError"]) + return + # Unknown lang + elif args[0] not in tr.tr.keys(): + await msg.channel.send( + tr.tr[self.guild.config["lang"]]["errors"]["LangNotFoundError"] \ + .format(lang=args[0], prefix=self.guild.config["prefix"] * 2)) + return + else: + # Normal case + self.guild.config["lang"] = args[0] + self.guild.save_config() + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["config"]["lang"].format(lang=args[0])) + return + + async def list_lang(self, msg, command, args): + embed = discord.Embed(title=tr.tr[self.guild.config["lang"]]["modules"]["config"]["list_lang"]["title"]) + for lang in tr.tr.keys(): + if lang == self.guild.config["lang"]: + embed.add_field(name="***" + lang + "***", value=tr.tr[lang]["description"]) + else: + embed.add_field(name=lang, value=tr.tr[lang]["description"]) + await msg.channel.send(embed=embed) + return + + async def set(self, msg, command, args): + + if msg.author.id not in self.guild.config["master_admins"]: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return + else: + if args[0] not in self.guild.config.keys(): + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["UnknownConfigError"]) + return + elif args[0] in self.forbiddenConfig: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["ForbiddenConfigError"]) + return + else: + self.guild.config[args[0]] = args[1] + + async def list(self, msg, command, args): + embed = discord.Embed(title=tr.tr[self.guild.config["lang"]]["modules"]["config"]["list"]["title"]) + for param, description in tr.tr[self.guild.config["lang"]]["modules"]["config"]["list"]["params"].items(): + embed.add_field(name=param, value=description) + await msg.channel.send(embed=embed) + + async def add_master_admin(self, msg, command, args): + # Non authorized user + if msg.author.id not in self.guild.config["master_admins"]: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return + else: + if len(msg.mentions) == 0: + await msg.send(tr.tr[self.guild.config["lang"]]["errors"]["NoMentionsError"]) + return + else: + for user in msg.mentions: + if user.id not in self.guild.config["master_admins"]: + self.guild.config["master_admins"].append(user.id) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["config"]["add_master_admin"]\ + .format(user=user.mention)) + self.guild.save_config() + return + + async def del_master_admin(self, msg, command, args): + # Non authorized user + if msg.author.id not in self.guild.config["master_admins"]: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return + else: + if len(msg.mentions) == 0: + await msg.send(tr.tr[self.guild.config["lang"]]["errors"]["NoMentionsError"]) + return + else: + for user in msg.mentions: + while user.id in self.guild.config["master_admins"]: + self.guild.config["master_admins"].remove(user.id) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["config"]["del_master_admin"] \ + .format(user=user.mention)) + self.guild.save_config() + return + + async def on_message(self, msg): + if msg.content.startswith(self.guild.config["prefix"] * 2): + command, *args = msg.content.lstrip(self.guild.config["prefix"]).split(" ") + if command == "lang": + await self.lang(msg, command, args) + elif command == "list_lang": + await self.list_lang(msg, command, args) + elif command == "set": + await self.set(msg, command, args) + elif command == "list": + await self.list(msg, command, args) + elif command == "add_master_admin": + await self.add_master_admin(msg, command, args) + elif command == "del_master_admin": + await self.del_master_admin(msg, command, args) + return diff --git a/modules/modules.py b/modules/modules.py index 3fa3285..8114084 100644 --- a/modules/modules.py +++ b/modules/modules.py @@ -9,7 +9,7 @@ class MainClass: self.guild = guild async def load(self, msg, command, args): - if msg.author.id in self.guild.config["master_admin"]: + if msg.author.id in self.guild.config["master_admins"]: errors = [] for arg in args: if args not in self.guild.config["modules"]: @@ -17,37 +17,23 @@ class MainClass: errors.extend(self.guild.update_modules()) if errors: texts = [ - (tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["error"]["name"] % module, - tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["error"]["value"] % - self.guild.config["prefixe"]) + (tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundError"]["name"].format(module=module), + tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundError"]["value"].format( + prefix=self.guild.config["prefix"])) for module in errors ] - embed = discord.Embed( - title=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["error"]["title"]) + embed = discord.Embed(title=tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundError"]["title"]) for error in texts: embed.add_field(name=error[0], value=error[1], inline=False) await msg.channel.send(embed=embed) - self.guild.save_config() + self.guild.save_config() else: - embed = discord.Embed( - title=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["permissionError"]["title"]) - if len(args) == 1: - embed.add_field( - name=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["permissionError"]["one"][ - "name"], - value=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["permissionError"]["one"][ - "value"]) - else: - embed.add_field( - name=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["permissionError"]["many"][ - "name"], - value=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["load"]["permissionError"]["many"][ - "value"]) - await msg.channel.send(embed=embed) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return return async def unload(self, msg, command, args): - if msg.author.id in self.guild.config["master_admin"]: + if msg.author.id in self.guild.config["master_admins"]: errors = [] for arg in args: try: @@ -57,35 +43,19 @@ class MainClass: errors.extend(self.guild.update_modules()) if errors: - textes = [ - (tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["error"]["name"] % module, - tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["error"]["value"] % - self.guild.config["prefixe"]) - for module in errors - ] + textes = [(tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundOrDeactivated"]["name"].format( + module=module), + tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundOrDeactivated"]["value"].format( + prefix=self.guild.config["prefix"])) for module in errors] embed = discord.Embed( - title=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["error"]["title"]) + title=tr.tr[self.guild.config["lang"]]["errors"]["ModuleNotFoundOrDeactivated"]["title"]) for erreur in textes: embed.add_field(name=erreur[0], value=erreur[1], inline=False) await msg.channel.send(embed=embed) self.guild.save_config() else: - embed = discord.Embed( - title=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["permissionError"][ - "title"]) - if len(args) == 1: - embed.add_field( - name=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["permissionError"]["one"][ - "name"], - value=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["permissionError"]["one"][ - "value"]) - else: - embed.add_field( - name=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["permissionError"]["many"][ - "name"], - value=tr.tr[self.guild.config["lang"]]["modules"]["modules"]["unload"]["permissionError"]["many"][ - "value"]) - await msg.channel.send(embed=embed) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["errors"]["PermissionError"]) + return return async def list_modules(self, msg, command, args): @@ -103,8 +73,8 @@ class MainClass: return async def on_message(self, msg): - if msg.content.startswith(self.guild.config["prefixe"]): - command, *args = msg.content.lstrip(self.guild.config["prefixe"]).split(" ") + if msg.content.startswith(self.guild.config["prefix"]): + command, *args = msg.content.lstrip(self.guild.config["prefix"]).split(" ") if command == "load": await self.load(msg, command, args) elif command == "list_modules": diff --git a/traductions.py b/traductions.py index 82ec11d..822904d 100644 --- a/traductions.py +++ b/traductions.py @@ -1,5 +1,6 @@ tr = { "FR_fr": { + "description": "Français", "modules": { "modules": { "description": "Permet de gérer les modules.", @@ -7,21 +8,21 @@ tr = { "list_modules": { "description": "Liste tous les modules. Les modules en gras sont activés.", "exemples": [ - ("`list_modules`", "Liste tous les modules"), + ("`{prefix}list_modules`", "Liste tous les modules"), ], }, "load": { "description": "Permet de charger un ou des modules.", "exemples": [ - ("`load fun`", "Charge le module fun"), - ("`load fun admin`", "Charge les modules fun et admin"), + ("`{prefix}load fun`", "Charge le module fun"), + ("`{prefix}load fun admin`", "Charge les modules fun et admin"), ], }, "unload": { "description": "Permet de décharger un ou des modules.", "exemples": [ - ("`unload fun`", "Décharge le module fun"), - ("`unload fun admin`", "Décharge les modules fun et admin"), + ("`{prefix}unload fun`", "Décharge le module fun"), + ("`{prefix}unload fun admin`", "Décharge les modules fun et admin"), ], }, }, @@ -29,110 +30,74 @@ tr = { "title": "Liste des modules", }, "load": { - "error": { - "name": "Erreur lors de l'activation du module %s:", - "value": "Celui-ci n'existe pas. Tapez %slist_modules pour voir la liste des modules disponibles.", - "title": "Erreur", - }, - "permissionError": { - "title": "Erreur", - "one": { - "name": "Erreur lors du chargement du module.", - "value": "Vous n'avez pas la permission de charger un module.", - }, - "many": { - "name": "Erreur lors du chargement des modules.", - "value": "Vous n'avez pas la permission de charger des modules." - } - }, - "unload": { - "error": { - "name": "Erreur lors de la désactivation du module %s:", - "value": "Celui-ci n'existe pas ou n'est pas activé. Tapez %slist_modules pour voir la liste des modules disponibles.", - "title": "Erreur", - }, - "permissionError": { - "title": "Erreur", - "one": { - "name": "Erreur lors de la désactivation du module.", - "value": "Vous n'avez pas la permission de désactiver un module.", - }, - "many": { - "name": "Erreur lors de la désactivation des modules.", - "value": "Vous n'avez pas la permission de désactiver des modules." - }, - }, - }, - }, - }, - }, - }, - "EN_us": { - "modules": { - "modules": { - "description": "Allow to manage modules.", - "aide": { - "list_modules": { - "description": "Lists all modules. Modules in bold are enabled.", - "exemples": [ - ("`list_modules`", "Lists all modules"), - ], - }, - "load": { - "description": "Load one or more modules.", - "examples": [ - ("`load fun`", "Load fun module"), - ("`load fun admin`", "Load fun and admin modules"), - ], - }, - "unload": { - "description": "Unload one or more modules.", - "exemples": [ - ("`load fun`", "Unload fun module"), - ("`upload fun admin`", "Unload fun and admin modules"), - ], - }, - }, - "list_modules": { - "title": "List of modules" - }, - "load": { - "error": { - "name": "Error when activating the %s module:", - "value": "This one doesn't exist. Type %slist_modules to see the list of available modules.", - "title": "Error", - }, - "permissionError": { - "title": "Error", - "one": { - "name": "Error when loading the module.", - "value": "You do not have permission to load a module.", - }, - "many": { - "name": "Error when loading modules.", - "value": "You do not have permission to load modules.", - }, - }, }, "unload": { - "error": { - "name": "Error when deactivating the %s module:", - "value": "This one doesn't exist or isn't activate. Type %slist_modules to see the list of available modules.", - "title": "Error", + }, + }, + "config": { + "description": "Configuration de foBot, doublez le préfixe pour y accéder.", + "aide": { + "lang": { + "description": "Modifier la langue", + "examples": [ + ("`{prefix}{prefix}lang FR_fr`", "Change la langue en français"), + ], }, - "permissionError": { - "title": "Error", - "one": { - "name": "Error when deactivating the module.", - "value": "You do not have permission to deactivate a module.", - }, - "many": { - "name": "Error when deactivate modules.", - "value": "You do not have permission to deactivate modules.", + "list_lang": { + "description": "Liste les langues disponibles", + "examples": [ + ("`{prefix}{prefix}list_lang`", "Affiche toutes les langues disponibles.") + ] + }, + "set": { + "description": "Modifie un paramètre", + "examples": [ + ("`{prefix}{prefix}set prefix %`", "Change le préfixe en `%`"), + ], + }, + "list": { + "title": "Liste des Paramètres disponibles", + "params": { + "prefix": "Le préfixe utilisé sur le serveur", }, }, }, + "lang": "La langue {lang} est maintenant utilisée.", + "list_lang": { + "title": "Langues disponibles", + }, + "list": { + "title": "Liste des paramètres modifiables", + "params": { + "prefix": "Préfixe utilisé par le bot." + } + }, + "add_master_admin": "L'utilisateur {user} est maintenant un administrateur du bot.", + "del_master_admin": "L'utilisateur {user} n'est plus un administrateur du bot.", }, }, + "errors": { + "LangNotFoundError": "La langue {lang} est introuvable, tapez {prefix}list_lang pour voir les langues " + "disponibles.", + "PermissionError": "Vous n'avez pas la permission de faire cette action.", + "ModuleNotFoundOrDeactivatedError": { + "title": "Erreur", + "name": "Erreur lors de la désactivation du module {module}:", + "value": "Celui-ci n'existe pas ou n'es pas activé. Tapez {prefix}list_modules pour voir la liste des modules disponibles.", + + }, + "ModuleNotFoundError": { + "title": "Erreur", + "name": "Erreur lors de l'activation du module {module}:", + "value": "Celui-ci n'existe pas. Tapez {prefix}list_modules pour voir la liste des modules " + "disponibles.", + }, + "ForbiddenConfigError": "Ce paramètre ne peut pas être modifié directement.", + "UnknownConfigError": "Le paramètre demandé n'existe pas. Utilisez {prefix}list pour lister les paramètres " + "modifiables.", + "NotEnoughParamError": "Il manque un ou plusieurs parametres à la commande.", + "NoMentionsError": "Vous devez mentioner un utilisateur pour le rajouter à la liste des administrateurs " + "du bot." + }, }, }