shopbot/bot/dialogs/admin.py
2024-12-25 04:30:33 +03:00

147 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = "<b>🔧 Админ панель</b>"
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("<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",
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="<b>❌ Отнятие баланса</b>\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,
),
)