From 7b2941ae2bb3a5a5c97e66864557b121c6b0637a Mon Sep 17 00:00:00 2001 From: Ev-1 <33662061+Ev-1@users.noreply.github.com> Date: Sat, 2 Feb 2019 14:17:51 +0100 Subject: [PATCH] Settings now has a single set/get instead of one set/get per setting. --- bot.py | 4 +- cogs/botsettings.py | 20 +++---- cogs/misc.py | 4 +- cogs/music.py | 2 +- cogs/utils/checks.py | 2 +- cogs/utils/settings.py | 120 ++++++++++++++++++++++------------------- 6 files changed, 82 insertions(+), 70 deletions(-) diff --git a/bot.py b/bot.py index 036acf5..cb68ff2 100644 --- a/bot.py +++ b/bot.py @@ -26,7 +26,7 @@ default_prefix = config["default_prefix"] def _get_prefix(bot, message): if not message.guild: return default_prefix - prefixes = bot.settings.get_prefix(message.guild.id) + prefixes = bot.settings.get(message.guild.id, 'prefixes', 'default_prefix') return commands.when_mentioned_or(*prefixes)(bot, message) @@ -36,7 +36,7 @@ class Bot(commands.Bot): description=config["description"]) self.settings = Settings(**config) - self.localizer = Localizer(self.settings.get_language_path(), "en_en") + self.localizer = Localizer(self.settings.default_lang_path, "en_en") self.debug = debug for extension in initial_extension: diff --git a/cogs/botsettings.py b/cogs/botsettings.py index b4e10d9..6cd3cae 100644 --- a/cogs/botsettings.py +++ b/cogs/botsettings.py @@ -20,8 +20,8 @@ class BotSettings: @commands.guild_only() @_set.command(name='serverlocale') async def _set_guild_locale(self, ctx, locale): - self.settings.set_locale(ctx.guild.id, locale) - locale = self.settings.get_locale(ctx.guild.id) + self.settings.set(ctx.guild.id, 'locale', locale) + locale = self.settings.get(ctx.guild.id, 'locale', 'default_lang') await ctx.send(f'Locale set to {locale}') @commands.guild_only() @@ -29,21 +29,21 @@ class BotSettings: async def _set_guild_prefix(self, ctx, *prefixes): prefixes = list(prefixes) if prefixes != []: - self.settings.set_prefix(ctx.guild.id, prefixes) - prefixes = self.settings.get_prefix(ctx.guild.id) - await ctx.send(self.format_prefixes(prefixes)) + self.settings.set(ctx.guild.id, 'prefixes', prefixes) + prefixes = self.settings.get(ctx.guild.id, 'prefixes') + await ctx.send(f'Server prefixes: {self.format_prefixes(prefixes)}') @commands.guild_only() @_set.command(name='resetprefix') async def _reset_prefix(self, ctx): - self.settings.set_prefix(ctx.guild.id, None) - prefixes = self.settings.get_prefix(ctx.guild.id) + self.settings.set(ctx.guild.id, 'prefixes', None) + prefixes = self.settings.get(ctx.guild.id, 'prefixes', 'default_prefix') await ctx.send(self.format_prefixes(prefixes)) def format_prefixes(self, prefixes): if prefixes is None: prefixes = [self.bot.settings.default_prefix] - formatted = 'Server prefixes: ' + formatted = '' for prefix in prefixes: formatted += f'`{prefix}`, ' return formatted[:-2] @@ -60,8 +60,8 @@ class BotSettings: embed.description = f'Current settings for {ctx.guild.name}' embed.set_thumbnail(url=ctx.guild.icon_url) - prefixes = self.bot.settings.get_prefix(ctx.guild.id) - locale = f'`{self.bot.settings.get_locale(ctx.guild.id)}`' + prefixes = self.bot.settings.get(ctx.guild.id, 'prefixes', 'default_prefix') + locale = f"{self.bot.settings.get(ctx.guild.id, 'locale', 'default_locale')}" embed.add_field(name='Locale', value=locale) embed.add_field(name='Prefix', value=self.format_prefixes(prefixes)) await ctx.send(embed=embed) diff --git a/cogs/misc.py b/cogs/misc.py index 453a47a..d986384 100644 --- a/cogs/misc.py +++ b/cogs/misc.py @@ -54,7 +54,7 @@ class Misc: embed.add_field(name='{info.music.players}', value=f'{len(lavalink.players)}') embed.add_field(name='{info.music.listeners}', value=f'{listeners}') - embed = self.bot.localizer.format_embed(embed, self.bot.settings.get_locale(ctx.guild.id)) + embed = self.bot.localizer.format_embed(embed, self.bot.settings.get(ctx.guild.id, 'locale', 'default_locale')) await ctx.send(embed=embed) @@ -105,7 +105,7 @@ class Misc: value=uptimetext) embed = self.bot.localizer.format_embed(embed, - self.bot.settings.get_locale(ctx.guild.id), + self.bot.settings.get(ctx.guild.id, 'locale', 'default_locale'), _python_v=platform.python_version(), _discord_v=discord.__version__, _lavalink_v=LavalinkVersion, diff --git a/cogs/music.py b/cogs/music.py index 0113d98..e6edc02 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -33,7 +33,7 @@ class Music: bot.add_listener(bot.lavalink.voice_update_handler, 'on_socket_response') def getLocalizer(self, guild_id): - lang = self.bot.settings.get_locale(guild_id) + lang = self.bot.settings.get(guild_id, 'locale', 'default_locale') return LocalizerWrapper(self.bot.localizer, lang, "music.response") diff --git a/cogs/utils/checks.py b/cogs/utils/checks.py index 247a817..cb51b08 100644 --- a/cogs/utils/checks.py +++ b/cogs/utils/checks.py @@ -50,7 +50,7 @@ def is_admin(): def is_mod(): async def pred(ctx): - modrole = ctx.bot.settings.get_mod_role(ctx.guild.id) + modrole = ctx.bot.settings.get(ctx.guild.id, 'roles.moderator', 'default_mod') return has_role(ctx, modrole) return commands.check(pred) diff --git a/cogs/utils/settings.py b/cogs/utils/settings.py index bd7c785..97b9406 100644 --- a/cogs/utils/settings.py +++ b/cogs/utils/settings.py @@ -3,79 +3,91 @@ import json import codecs import locale + class Settings: def __init__(self, **default_settings): - self.DATA_PATH = 'data/settings/' - self.SETTINGS_PATH = self.DATA_PATH + 'settings.json' + self._DATA_PATH = 'data/bot/' + self._SETTINGS_PATH = self._DATA_PATH + 'settings.json' + self.default_prefix = default_settings["default_prefix"] self.default_admin = default_settings["default_admin"] self.default_mod = default_settings["default_mod"] self.default_locale = default_settings["default_locale"] - self.default_lang_path = default_settings["default_lang_path"] or "./localization" + self.default_lang_path = default_settings["default_lang_path"] or \ + "./localization" + if not self.default_locale: locale, codepage = locale.getlocale() default_locale, default_codepage = locale.getdefaultlocale() self.default_locale = locale or default_locale - if not os.path.exists(self.DATA_PATH): - os.makedirs(self.DATA_PATH) + if not os.path.exists(self._DATA_PATH): + os.makedirs(self._DATA_PATH) - if not os.path.isfile(self.SETTINGS_PATH): - with codecs.open(self.SETTINGS_PATH, "w+", encoding='utf8') as f: - json.dump({"locale": {}, "prefixes": {}, - "roles": {}}, f, indent=4) + if not os.path.isfile(self._SETTINGS_PATH): + with codecs.open(self._SETTINGS_PATH, "w+", encoding='utf8') as f: + json.dump({}, f, indent=4) - with codecs.open(self.SETTINGS_PATH, "r", encoding='utf8') as f: + with codecs.open(self._SETTINGS_PATH, "r", encoding='utf8') as f: self.settings = json.load(f) - def get_prefix(self, guild_id): - guild_id = str(guild_id) - if guild_id in self.settings["prefixes"].keys(): - return self.settings["prefixes"][guild_id] - return self.default_prefix - - def set_prefix(self, guild_id, prefixes): - if prefixes is None: - self.settings["prefixes"].pop(str(guild_id), None) + def _set(self, d, keys, val): + key = keys[0] + if len(keys) == 1: + if val is None: + try: + d.pop(key) + except: + pass + else: + d[key] = val + return + if key in d.keys(): + if not isinstance(d[key], dict): + d[key] = {} + self._set(d[key], keys[1:], val) else: - self.settings["prefixes"][str(guild_id)] = prefixes - with codecs.open(self.SETTINGS_PATH, "w", encoding='utf8') as f: - json.dump(self.settings, f, indent=4) + d[key] = {} + self._set(d[key], keys[1:], val) - def get_mod_role(self, guild_id): - guild_id = str(guild_id) - if guild_id in self.settings["roles"].keys(): - if 'mod' in self.settings["roles"][guild_id].keys(): - return self.settings["roles"][guild_id]['mod'] - return self.default_mod + def _get(self, d, keys): + key = keys[0] + try: + if len(keys) > 1 and isinstance(d[key], dict): + return self._get(d[key], keys[1:]) + else: + return d[key] + except KeyError: + return None - def get_admin_role(self, guild_id): + def set(self, guild_id, setting, value): + """ Set value in settings, will overwrite any existing values. """ guild_id = str(guild_id) - if guild_id in self.settings["roles"].keys(): - if 'admin' in self.settings["roles"][guild_id].keys(): - return self.settings["roles"][guild_id]['admin'] - return self.default_admin - def set_mod_admin_role(self, guild_id, admin, mod): + if guild_id not in self.settings.keys(): + self.settings[guild_id] = {} + + self._set(self.settings[guild_id], setting.split('.'), value) + + with codecs.open(self._SETTINGS_PATH, 'w', encoding='utf8') as f: + json.dump(self.settings, f, indent=2) + + def get(self, guild_id, setting, default=''): + """ Gets a value from the settings if a default return value is specified + it will return the default if no setting is found. If that default is a + class attribute the value of the attribute will get returned.""" guild_id = str(guild_id) - if admin is None or mod is None: - self.settings["role"].pop(guild_id, None) + + if default and hasattr(self, default): + default = getattr(self, default) + elif not default: + default = None + + if guild_id not in self.settings.keys(): + return default + + value = self._get(self.settings[guild_id], setting.split('.')) + if value: + return value else: - self.settings["role"][guild_id]["mod"] = mod - self.settings["role"][guild_id]["admin"] = admin - - with codecs.open(self.SETTINGS_PATH, "w", encoding='utf8') as f: - json.dump(self.settings, f, indent=4) - - def set_locale(self, guild_id, locale): - guild_id = str(guild_id) - self.settings["locale"][guild_id] = locale - with codecs.open(self.SETTINGS_PATH, "w", encoding='utf8') as f: - json.dump(self.settings, f, indent=4) - - def get_locale(self, guild_id): - guild_id = str(guild_id) - return self.settings.get("locale", {}).get(guild_id, self.default_locale).lower() - - def get_language_path(self): - return self.settings.get("language_path", self.default_lang_path) \ No newline at end of file + return default