shopbot/bot/dialogs/admin.py

147 lines
4.9 KiB
Python
Raw Normal View History

2024-12-25 01:30:33 +00:00
from typing import Any
2024-12-24 18:08:03 +00:00
from aiogram_dialog import Dialog, Window
from aiogram_dialog.widgets.input import TextInput
2024-12-25 01:30:33 +00:00
from aiogram_dialog.widgets.kbd import Next, Row, Start
from aiogram_dialog.widgets.text import Const, Format
2024-12-24 18:08:03 +00:00
2024-12-25 01:30:33 +00:00
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
2024-12-24 18:08:03 +00:00
ADMIN_PANEL_BACK_BUTTON = Start(
Const("🔙 Вернуться в админ-панель"), id="back", state=AdminSG.panel
)
ADMIN_PANEL_TEXT = "<b>🔧 Админ панель</b>"
class AdminDialogWindow(Window):
2024-12-25 01:30:33 +00:00
def __init__(
self, text: str, state: Any, input_id: str, type_factory: Any, **kwargs
):
2024-12-24 18:08:03 +00:00
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,
2024-12-25 01:30:33 +00:00
**kwargs,
2024-12-24 18:08:03 +00:00
)
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("<b>📈 Статистика Магазина</b>\n"),
Format(
"🔻 <b>Общие данные:</b>\n"
"Всего продано аккаунтов: <b>{total_sold}</b>\n"
"На продаже сейчас: <b>{currently_for_sale}</b>\n"
"Всего пользователей: <b>{total_users}</b>\n\n"
"💰 <b>Продажи:</b>\n"
"├ Сумма проданных аккаунтов: <b>{total_sales:.2f}₽</b>\n"
"├ Самая большая продажа: <b>{highest_sale:.2f}₽</b>\n"
"└ Средняя цена продажи: <b>{average_sale:.2f}₽</b>\n\n"
"📅 <b>Прибыль:</b>\n"
"За сегодня: <b>{profit_today:.2f}₽</b>\n"
"За неделю: <b>{profit_week:.2f}₽</b>\n"
"За месяц: <b>{profit_month:.2f}₽</b>\n\n"
"🔹 <b>Обновлено:</b> {current_time}"
),
ADMIN_PANEL_BACK_BUTTON,
state=AdminSG.stats,
getter=get_admin_statistics,
),
)
distribution_dialog = Dialog(
Window(
Const("<b>📨 Введите сообщение для рассылки:</b>"),
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="<b>💸 Выдача баланса</b>\n\nВведите ID пользователя:",
state=GiftBalanceSG.gift_balance_user_id,
input_id="user_id_input",
2024-12-25 01:30:33 +00:00
type_factory=int,
2024-12-24 18:08:03 +00:00
),
AdminDialogWindow(
text="Введите сумму для пополнения баланса:",
state=GiftBalanceSG.gift_balance_amount,
input_id="amount_input",
2024-12-25 01:30:33 +00:00
type_factory=float,
2024-12-24 18:08:03 +00:00
),
Window(
Format("{result}"),
ADMIN_PANEL_BACK_BUTTON,
state=GiftBalanceSG.gift_balance_confirmation,
getter=gift_balance_data,
),
)
take_balance_dialog = Dialog(
AdminDialogWindow(
text="<b>❌ Отнятие баланса</b>\n\nВведите ID пользователя:",
state=TakeBalanceSG.take_balance_user_id,
input_id="user_id_input",
2024-12-25 01:30:33 +00:00
type_factory=int,
2024-12-24 18:08:03 +00:00
),
AdminDialogWindow(
text="Введите сумму для вычета из баланса:",
state=TakeBalanceSG.take_balance_amount,
input_id="amount_input",
2024-12-25 01:30:33 +00:00
type_factory=float,
2024-12-24 18:08:03 +00:00
),
Window(
Format("{result}"),
ADMIN_PANEL_BACK_BUTTON,
state=TakeBalanceSG.take_balance_confirmation,
getter=take_balance_user,
),
2024-12-25 01:30:33 +00:00
)