from aiogram import Router, F from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.fsm.state import StatesGroup, State from aiogram.types import Message, CallbackQuery, InlineKeyboardButton from aiogram.utils.i18n import I18n from aiogram.utils.keyboard import InlineKeyboardBuilder from logging import getLogger from sqlmodel.ext.asyncio.session import AsyncSession from ....main import QBotApp from ....model.settings import Settings from ....model.user import UserBase from ..context import ContextData, CallbackCommand, CommandContext from ..common import get_send_message, get_value_repr, get_callable_str, authorize_command from ..navigation import save_navigation_context, pop_navigation_context logger = getLogger(__name__) router = Router() @router.callback_query(ContextData.filter(F.command == CallbackCommand.MENU_ENTRY_PARAMETERS)) async def menu_entry_parameters(message: CallbackQuery, **kwargs): await clear_state(state = kwargs["state"]) stack = await save_navigation_context(callback_data = kwargs["callback_data"], state = kwargs["state"]) await parameters_menu(message = message, navigation_stack = stack, **kwargs) async def parameters_menu(message: Message | CallbackQuery, user: UserBase, callback_data: ContextData, navigation_stack: list[ContextData], **kwargs): if not await authorize_command(user = user, callback_data = callback_data): await message.answer(await Settings.get(Settings.APP_STRINGS_FORBIDDEN)) settings = await Settings.get_params() keyboard_builder = InlineKeyboardBuilder() for key, value in settings.items(): if not key.is_visible: continue if key.caption_value_btn: caption = get_callable_str(callable_str = key.caption_value_btn, descriptor = key, entity = None, value = value) else: if key.caption_btn: caption = get_callable_str(callable_str = key.caption_btn, descriptor = key, entity = None, value = value) else: caption = key.name if key.type_ == bool: caption = f"{"【✔︎】" if value else "【 】"} {caption}" else: caption = f"{caption}: {get_value_repr(value = value, field_descriptor = key, locale = user.lang)}" keyboard_builder.row(InlineKeyboardButton(text = caption, callback_data = ContextData( command = CallbackCommand.FIELD_EDITOR, context = CommandContext.SETTING_EDIT, field_name = key.name).pack())) context = pop_navigation_context(navigation_stack) if context: keyboard_builder.row(InlineKeyboardButton(text = (await Settings.get(Settings.APP_STRINGS_BACK_BTN)), callback_data = context.pack())) send_message = get_send_message(message) await send_message(text = (await Settings.get(Settings.APP_STRINGS_PARAMETERS)), reply_markup = keyboard_builder.as_markup()) from ..navigation import pop_navigation_context, get_navigation_context, clear_state