Add settings display
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
from aiogram import Router
|
from aiogram import Router
|
||||||
from . import (
|
from . import (
|
||||||
full_menu,
|
full_menu,
|
||||||
|
on_home,
|
||||||
|
settings,
|
||||||
)
|
)
|
||||||
from bot.middlewares import PrivateButtonMiddleware
|
from bot.middlewares import PrivateButtonMiddleware
|
||||||
|
|
||||||
@@ -11,4 +13,6 @@ router.callback_query.middleware(PrivateButtonMiddleware())
|
|||||||
|
|
||||||
router.include_routers(
|
router.include_routers(
|
||||||
full_menu.router,
|
full_menu.router,
|
||||||
|
on_home.router,
|
||||||
|
settings.router,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
from aiogram import Router, F
|
from aiogram import Router, F, Bot
|
||||||
from aiogram.types import (
|
from aiogram.types import (
|
||||||
CallbackQuery
|
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 = Router()
|
||||||
|
|
||||||
|
|
||||||
@router.callback_query(FullMenuCallback.filter(F.action == 'settings'))
|
@router.callback_query(FullMenuCallback.filter(F.action == 'settings'))
|
||||||
async def on_close(callback_query: CallbackQuery):
|
async def on_settings(callback_query: CallbackQuery, bot: Bot):
|
||||||
await callback_query.answer('Settings are not available yet')
|
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
19
bot/callbacks/on_home.py
Normal 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
27
bot/callbacks/settings.py
Normal 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)
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -3,4 +3,4 @@ from aiogram.filters.callback_data import CallbackData
|
|||||||
|
|
||||||
|
|
||||||
class FullMenuCallback(CallbackData, prefix='full_menu'):
|
class FullMenuCallback(CallbackData, prefix='full_menu'):
|
||||||
action: Literal['settings']
|
action: Literal['home', 'settings']
|
||||||
9
bot/factories/open_setting.py
Normal file
9
bot/factories/open_setting.py
Normal 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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from aiogram.utils.keyboard import (InlineKeyboardMarkup, InlineKeyboardButton,
|
from aiogram.utils.keyboard import (InlineKeyboardMarkup, InlineKeyboardButton,
|
||||||
InlineKeyboardBuilder)
|
InlineKeyboardBuilder)
|
||||||
from bot.callbacks.factories.full_menu import FullMenuCallback
|
from bot.factories.full_menu import FullMenuCallback
|
||||||
|
|
||||||
|
|
||||||
def get_full_menu_kb() -> InlineKeyboardMarkup:
|
def get_full_menu_kb() -> InlineKeyboardMarkup:
|
||||||
|
|||||||
31
bot/keyboards/inline/setting.py
Normal file
31
bot/keyboards/inline/setting.py
Normal 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()
|
||||||
28
bot/keyboards/inline/settings.py
Normal file
28
bot/keyboards/inline/settings.py
Normal 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()
|
||||||
@@ -16,6 +16,7 @@ class Db(object):
|
|||||||
self.config = DBDict('config')
|
self.config = DBDict('config')
|
||||||
self.inline = DBDict('inline')
|
self.inline = DBDict('inline')
|
||||||
self.errors = DBDict('errors')
|
self.errors = DBDict('errors')
|
||||||
|
self.settings = DBDict('settings')
|
||||||
self.spotify = DBDict('spotify')
|
self.spotify = DBDict('spotify')
|
||||||
self.deezer = DBDict('deezer')
|
self.deezer = DBDict('deezer')
|
||||||
self.youtube = DBDict('youtube')
|
self.youtube = DBDict('youtube')
|
||||||
|
|||||||
1
bot/modules/settings/__init__.py
Normal file
1
bot/modules/settings/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .model import UserSettings, Setting, settings_strings
|
||||||
54
bot/modules/settings/model.py
Normal file
54
bot/modules/settings/model.py
Normal 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
|
||||||
Reference in New Issue
Block a user