from aiogram import Router
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message
from bot.config import ADMIN_ID
from bot.states import AdminFlow
from bot.filters import AdminCallbackFilter, AdminFilter
from bot.ui.keyboards import admin_keyboard, back_keyboard, admin_profile_keyboard
from bot.services.balance import (
BalanceError,
change_user_balance,
get_bot_slot_price,
get_user_profile,
set_bot_slot_price,
)
router = Router()
@router.message(Command("admin"), AdminFilter())
async def admin_menu(message: Message, state: FSMContext) -> None:
await state.clear()
await message.answer("🤵 Админ-панель", reply_markup=admin_keyboard())
@router.callback_query(lambda c: c.data == "admin_panel", AdminCallbackFilter())
async def admin_panel(callback: CallbackQuery, state: FSMContext) -> None:
await state.clear()
await callback.answer()
await callback.message.edit_text(
"🤵 Админ-панель", reply_markup=admin_keyboard()
)
@router.callback_query(
AdminCallbackFilter(), lambda c: c.data.startswith("admin_lookup")
)
async def admin_lookup_prompt(callback: CallbackQuery, state: FSMContext) -> None:
user_id = None
try:
user_id = int(callback.data.split(":")[1])
except:
pass
if user_id:
try:
if user_id <= 0:
raise ValueError
_, balance, bot_count = await get_user_profile(user_id)
except (ValueError, TypeError):
await callback.message.edit_text("❌ Некорректный Telegram ID")
return
await callback.message.edit_text(
f"👤 Профиль\n\n"
f"🆔: {user_id}\n"
f"💰 Баланс: {balance} ₽\n"
f"🤖 Ботов: {bot_count}",
reply_markup=admin_profile_keyboard(user_id=user_id),
)
return
await callback.answer()
await callback.message.edit_text(
"🆔 Отправьте ID пользователя",
reply_markup=back_keyboard(callback_data="admin_panel"),
)
await state.set_state(AdminFlow.waiting_user_id)
await state.update_data(action="lookup")
@router.callback_query(
AdminCallbackFilter(), lambda c: c.data.startswith("admin_balance:")
)
async def admin_balance_prompt(callback: CallbackQuery, state: FSMContext) -> None:
user_id = int(callback.data.split(":")[1])
await callback.answer()
await callback.message.edit_text(
"💲 Отправьте сумму для изменения баланса пользователя",
reply_markup=back_keyboard(callback_data=f"admin_lookup:{user_id}"),
)
await state.set_state(AdminFlow.waiting_amount)
await state.update_data(action="balance", user_id=user_id)
@router.callback_query(AdminCallbackFilter(), lambda c: c.data == "admin_price")
async def admin_price_prompt(callback: CallbackQuery, state: FSMContext) -> None:
await callback.answer()
await callback.message.edit_text(
f"💲 Текущая цена слота: {await get_bot_slot_price()} ₽\n"
"Отправьте новую положительную цену.",
reply_markup=back_keyboard(callback_data="admin_panel"),
)
await state.set_state(AdminFlow.waiting_amount)
await state.update_data(action="price")
@router.message(AdminFlow.waiting_user_id, AdminFilter())
async def admin_lookup(message: Message, state: FSMContext) -> None:
try:
user_id = int((message.text or "").strip())
if user_id <= 0:
raise ValueError
_, balance, bot_count = await get_user_profile(user_id)
except (ValueError, TypeError):
await message.answer("❌ Некорректный Telegram ID")
return
await message.answer(
f"👤 Профиль\n\n"
f"🆔: {user_id}\n"
f"💰 Баланс: {balance} ₽\n"
f"🤖 Ботов: {bot_count}",
reply_markup=admin_profile_keyboard(user_id=user_id),
)
await state.clear()
@router.message(AdminFlow.waiting_amount, AdminFilter())
async def admin_amount(message: Message, state: FSMContext) -> None:
data = await state.get_data()
text = (message.text or "").strip()
try:
if data.get("action") == "price":
price = int(text)
await set_bot_slot_price(price, updated_by=ADMIN_ID)
response = f"✅ Цена слота обновлена: {price} ₽"
else:
amount_text = text
user_text = data.get("user_id", None)
print(amount_text, user_text)
user_id, signed_amount = int(user_text), int(amount_text)
if user_id <= 0 or signed_amount == 0:
raise ValueError
balance = await change_user_balance(
telegram_id=user_id,
amount=signed_amount,
actor_telegram_id=message.from_user.id,
)
response = f"✅ Баланс пользователя обновлён: {balance} ₽"
except (ValueError, TypeError, BalanceError):
response = "❌ Некорректные данные: нужны положительные целые числа"
await message.answer(response)
if data.get("action") == "price":
return await admin_menu(message, state)
_, balance, bot_count = await get_user_profile(user_id)
await message.answer(
f"👤 Профиль\n\n"
f"🆔: {user_id}\n"
f"💰 Баланс: {balance} ₽\n"
f"🤖 Ботов: {bot_count}",
reply_markup=admin_profile_keyboard(user_id=user_id),
)
await state.clear()