Files
AnyMusicBot/bot/modules/settings/model.py
2024-11-02 00:10:44 +02:00

73 lines
2.3 KiB
Python

from dataclasses import dataclass
from ..database import db
@dataclass
class Setting:
name: str
description: str
choices: dict[str, str]
value: str | None = None
settings_strings: dict[str, Setting] = {
"search_preview": Setting(
name="Search preview",
description="Show only covers (better display), "
"or add 30 seconds of track preview whenever possible?",
choices={"cover": "Cover picture", "preview": "Audio preview"},
),
"recode_youtube": Setting(
name="Recode YouTube (and Spotify)",
description="Recode when downloading from YouTube (and Spotify) to "
"more compatible format (may take some time)",
choices={"no": "Send original file", "yes": "Recode to libmp3lame"},
),
"exact_spotify_search": Setting(
name="Only exact Spotify matches",
description="When searching on Youtube from Spotify, show only exact matches, "
"may protect against inaccurate matches, but at the same time it "
"can lose reuploaded tracks. Should be enabled always, except in "
"situations where the track is not found on both YouTube and "
"Deezer",
choices={"yes": "Only exact matches", "no": "Fuzzy matches also"},
),
"default_search_provider": Setting(
name="Default search provider",
description="Which service to use when searching without service filter",
choices={"d": "Deezer", "c": "SoundCloud", "y": "YouTube", "s": "Spotify"},
),
}
@dataclass
class UserSettings:
user_id: str | int
def __post_init__(self):
if type(self.user_id) is int:
self.user_id = str(self.user_id)
if db.settings.get(self.user_id) is None:
db.settings[self.user_id] = dict(
(setting, list(settings_strings[setting].choices)[0])
for setting in settings_strings
)
def __getitem__(self, item):
s = settings_strings.get(item)
if s is None:
return None
try:
s.value = db.settings[self.user_id][item]
except KeyError:
s.value = list(s.choices)[0]
self[item] = s.value
return s
def __setitem__(self, key, value):
h = db.settings[self.user_id]
h[key] = value
db.settings[self.user_id] = h