Add settings display

This commit is contained in:
BarsTiger
2023-11-05 15:37:02 +02:00
parent ee0a0ff285
commit e5a4fc5384
13 changed files with 186 additions and 6 deletions

View File

@@ -1,6 +1,8 @@
from aiogram import Router
from . import (
full_menu,
on_home,
settings,
)
from bot.middlewares import PrivateButtonMiddleware
@@ -11,4 +13,6 @@ router.callback_query.middleware(PrivateButtonMiddleware())
router.include_routers(
full_menu.router,
on_home.router,
settings.router,
)

View File

@@ -1,13 +1,19 @@
from aiogram import Router, F
from aiogram import Router, F, Bot
from aiogram.types import (
CallbackQuery
)
from .factories.full_menu import FullMenuCallback
from bot.factories.full_menu import FullMenuCallback
from bot.keyboards.inline.settings import get_settings_kb
router = Router()
@router.callback_query(FullMenuCallback.filter(F.action == 'settings'))
async def on_close(callback_query: CallbackQuery):
await callback_query.answer('Settings are not available yet')
async def on_settings(callback_query: CallbackQuery, bot: Bot):
await bot.edit_message_text(
inline_message_id=callback_query.inline_message_id,
text='⚙️ Settings',
reply_markup=get_settings_kb()
)

19
bot/callbacks/on_home.py Normal file
View File

@@ -0,0 +1,19 @@
from aiogram import Router, F, Bot
from aiogram.types import (
CallbackQuery
)
from bot.factories.full_menu import FullMenuCallback
from bot.keyboards.inline.full_menu import get_full_menu_kb
router = Router()
@router.callback_query(FullMenuCallback.filter(F.action == 'home'))
async def on_home(callback_query: CallbackQuery, bot: Bot):
await bot.edit_message_text(
inline_message_id=callback_query.inline_message_id,
text='⚙️ Menu',
reply_markup=get_full_menu_kb()
)

27
bot/callbacks/settings.py Normal file
View File

@@ -0,0 +1,27 @@
from aiogram import Router, Bot
from aiogram.types import (
CallbackQuery
)
from bot.factories.open_setting import OpenSettingCallback
from bot.keyboards.inline.setting import get_setting_kb
from bot.modules.settings import settings_strings
router = Router()
@router.callback_query(OpenSettingCallback.filter())
async def on_settings(
callback_query: CallbackQuery,
callback_data: OpenSettingCallback,
bot: Bot
):
await bot.edit_message_text(
inline_message_id=callback_query.inline_message_id,
text=settings_strings[callback_data.s_id].description,
reply_markup=get_setting_kb(
callback_data.s_id,
str(callback_query.from_user.id)
)
)

View File

@@ -3,4 +3,4 @@ from aiogram.filters.callback_data import CallbackData
class FullMenuCallback(CallbackData, prefix='full_menu'):
action: Literal['settings']
action: Literal['home', 'settings']

View File

@@ -0,0 +1,9 @@
from aiogram.filters.callback_data import CallbackData
class OpenSettingCallback(CallbackData, prefix='setting'):
s_id: str
class SettingChoiceCallback(CallbackData, prefix='s_choice'):
choice: str

View File

@@ -1,6 +1,6 @@
from aiogram.utils.keyboard import (InlineKeyboardMarkup, InlineKeyboardButton,
InlineKeyboardBuilder)
from bot.callbacks.factories.full_menu import FullMenuCallback
from bot.factories.full_menu import FullMenuCallback
def get_full_menu_kb() -> InlineKeyboardMarkup:

View File

@@ -0,0 +1,31 @@
from aiogram.utils.keyboard import (InlineKeyboardMarkup, InlineKeyboardButton,
InlineKeyboardBuilder)
from bot.factories.open_setting import SettingChoiceCallback
from bot.factories.full_menu import FullMenuCallback
from bot.modules.settings import UserSettings
def get_setting_kb(s_id: str, user_id: str) -> InlineKeyboardMarkup:
setting = UserSettings(user_id)[s_id]
buttons = [
[
InlineKeyboardButton(
text=(
'' if setting.value == choice else ''
) + setting.choices[choice],
callback_data=SettingChoiceCallback(
choice=choice,
).pack()
)
] for choice in setting.choices.keys()
] + [[
InlineKeyboardButton(
text='🔙',
callback_data=FullMenuCallback(
action='settings'
).pack()
)
]]
return InlineKeyboardBuilder(buttons).as_markup()

View File

@@ -0,0 +1,28 @@
from aiogram.utils.keyboard import (InlineKeyboardMarkup, InlineKeyboardButton,
InlineKeyboardBuilder)
from bot.factories.open_setting import OpenSettingCallback
from bot.factories.full_menu import FullMenuCallback
from bot.modules.settings import settings_strings
def get_settings_kb() -> InlineKeyboardMarkup:
buttons = [
[
InlineKeyboardButton(
text=settings_strings[setting_id].name,
callback_data=OpenSettingCallback(
s_id=setting_id,
).pack()
)
] for setting_id in settings_strings.keys()
] + [[
InlineKeyboardButton(
text='🔙',
callback_data=FullMenuCallback(
action='home'
).pack()
)
]]
return InlineKeyboardBuilder(buttons).as_markup()

View File

@@ -16,6 +16,7 @@ class Db(object):
self.config = DBDict('config')
self.inline = DBDict('inline')
self.errors = DBDict('errors')
self.settings = DBDict('settings')
self.spotify = DBDict('spotify')
self.deezer = DBDict('deezer')
self.youtube = DBDict('youtube')

View File

@@ -0,0 +1 @@
from .model import UserSettings, Setting, settings_strings

View File

@@ -0,0 +1,54 @@
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'
},
)
}
@dataclass
class UserSettings:
user_id: str
def __post_init__(self):
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
s.value = db.settings[self.user_id][item]
return s
def __setitem__(self, key, value):
db.settings[self.user_id][key] = value