from typing import Any from aiogram_dialog import Dialog, Window from aiogram_dialog.widgets.input import TextInput from aiogram_dialog.widgets.kbd import Next, Row, Start from aiogram_dialog.widgets.text import Const, Format from shopbot.bot.services import broadcast_message, get_admin_statistics from shopbot.bot.services.user import gift_balance_data, take_balance_user from shopbot.bot.states import AdminSG, DistributionSG, GiftBalanceSG, TakeBalanceSG from shopbot.bot.validations import error_number_handler ADMIN_PANEL_BACK_BUTTON = Start( Const("🔙 Вернуться в админ-панель"), id="back", state=AdminSG.panel ) ADMIN_PANEL_TEXT = "🔧 Админ панель" class AdminDialogWindow(Window): def __init__( self, text: str, state: Any, input_id: str, type_factory: Any, **kwargs ): super().__init__( Const(text), TextInput( id=input_id, type_factory=type_factory, on_success=Next(), on_error=error_number_handler, ), ADMIN_PANEL_BACK_BUTTON, state=state, **kwargs, ) admin_dialog = Dialog( Window( Const(ADMIN_PANEL_TEXT), Row( Start(Const("📊 Статистика"), id="stats", state=AdminSG.stats), Start( Const("📨 Рассылка"), id="distribution", state=DistributionSG.message_input, ), ), Row( Start( Const("💸 Выдать баланс"), id="gift_balance", state=GiftBalanceSG.gift_balance_user_id, ), Start( Const("❌ Отнять баланс"), id="take_balance", state=TakeBalanceSG.take_balance_user_id, ), ), state=AdminSG.panel, ), Window( Const("📈 Статистика Магазина\n"), Format( "🔻 Общие данные:\n" "├ Всего продано аккаунтов: {total_sold}\n" "├ На продаже сейчас: {currently_for_sale}\n" "└ Всего пользователей: {total_users}\n\n" "💰 Продажи:\n" "├ Сумма проданных аккаунтов: {total_sales:.2f}₽\n" "├ Самая большая продажа: {highest_sale:.2f}₽\n" "└ Средняя цена продажи: {average_sale:.2f}₽\n\n" "📅 Прибыль:\n" "├ За сегодня: {profit_today:.2f}₽\n" "├ За неделю: {profit_week:.2f}₽\n" "└ За месяц: {profit_month:.2f}₽\n\n" "🔹 Обновлено: {current_time}" ), ADMIN_PANEL_BACK_BUTTON, state=AdminSG.stats, getter=get_admin_statistics, ), ) distribution_dialog = Dialog( Window( Const("📨 Введите сообщение для рассылки:"), TextInput( id="message_input", type_factory=str, on_success=Next(), on_error=error_number_handler, ), ADMIN_PANEL_BACK_BUTTON, state=DistributionSG.message_input, ), Window( Format("{progress}"), ADMIN_PANEL_BACK_BUTTON, state=DistributionSG.progress, getter=broadcast_message, ), ) gift_balance_dialog = Dialog( AdminDialogWindow( text="💸 Выдача баланса\n\nВведите ID пользователя:", state=GiftBalanceSG.gift_balance_user_id, input_id="user_id_input", type_factory=int, ), AdminDialogWindow( text="Введите сумму для пополнения баланса:", state=GiftBalanceSG.gift_balance_amount, input_id="amount_input", type_factory=float, ), Window( Format("{result}"), ADMIN_PANEL_BACK_BUTTON, state=GiftBalanceSG.gift_balance_confirmation, getter=gift_balance_data, ), ) take_balance_dialog = Dialog( AdminDialogWindow( text="❌ Отнятие баланса\n\nВведите ID пользователя:", state=TakeBalanceSG.take_balance_user_id, input_id="user_id_input", type_factory=int, ), AdminDialogWindow( text="Введите сумму для вычета из баланса:", state=TakeBalanceSG.take_balance_amount, input_id="amount_input", type_factory=float, ), Window( Format("{result}"), ADMIN_PANEL_BACK_BUTTON, state=TakeBalanceSG.take_balance_confirmation, getter=take_balance_user, ), )