Files
ShiteMusicBot/cogs/utils/settingsmanager.py
T
Ev-1 d858bb4175 bugfix
fixed default arg for settingsmanager.
2020-09-12 21:20:51 +02:00

103 lines
3.4 KiB
Python

# Discord Packages
import discord
import codecs
import locale as localee
import os
import yaml
class Settings:
def __init__(self, datadir, **default_settings):
self._DATA_PATH = f"{datadir}/bot/"
self._SETTINGS_PATH = self._DATA_PATH + 'settings.yaml'
self.default_prefix = default_settings["prefix"]
self.default_mod = default_settings["moderator role"]
self.default_locale = default_settings["locale"]
self.default_threshold = default_settings["threshold"]
self.default_is_dynamic = default_settings["dynamic max duration"]
if not self.default_locale:
locale, codepage = localee.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.isfile(self._SETTINGS_PATH):
with codecs.open(self._SETTINGS_PATH, "w+", encoding='utf8') as f:
yaml.dump({}, f, indent=2)
with codecs.open(self._SETTINGS_PATH, "r", encoding='utf8') as f:
self.settings = yaml.load(f, Loader=yaml.SafeLoader)
def _set(self, d, keys, val):
key = keys[0]
if len(keys) == 1:
if val is None:
try:
d.pop(key)
except KeyError:
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:
d[key] = {}
self._set(d[key], keys[1:], val)
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 set(self, identifier, setting, value):
""" Set value in settings, will overwrite any existing values. """
guild_name = None
if isinstance(identifier, discord.Guild):
guild_name = identifier.name
identifier = str(identifier.id)
if identifier not in self.settings.keys():
self.settings[identifier] = {}
if guild_name:
self.settings[identifier]["_servername"] = guild_name
self._set(self.settings[identifier], setting.split('.'), value)
with codecs.open(self._SETTINGS_PATH, 'w', encoding='utf8') as f:
yaml.dump(self.settings, f, indent=2)
def get(self, identifier, 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 an
attribute of the settings class, the value of the attribute will get returned."""
if isinstance(identifier, discord.Guild):
identifier = str(identifier.id)
if default and isinstance(default, str) and hasattr(self, default):
default = getattr(self, default)
elif default == '':
default = None
if identifier not in self.settings.keys():
return default
value = self._get(self.settings[identifier], setting.split('.'))
if value is not None:
return value
else:
return default