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
|
|
|
|
)
|