mirror of
https://github.com/UiO-Gaming/ShiteMusicBot.git
synced 2026-11-05 13:56:51 +01:00
103 lines
3.4 KiB
Python
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
|