from aiogram import Router, F, Bot
from aiogram.types import CallbackQuery, Message
from repos.user_repo import UsersRepo, UserStatus
from keyboards import get_admin_decision_kb
router = Router()
# Чтобы IDE не ругалась, переменные инициализируются в main,
# но здесь мы ожидаем, что они будут переданы или доступны через DI (workflow_data)
# В этом примере я буду доставать их из data, переданной диспетчером, или глобально (для простоты примера - глобально в рамках архитектуры aiogram лучше через middleware DI).
# Для простоты доступа предположим, что repo и admin_id прокинуты.
@router.callback_query(F.data == "req_access")
async def user_request_access(callback: CallbackQuery, repo: UsersRepo, bot: Bot, admin_id: int):
"""Пользователь нажал 'Запросить доступ'"""
user = callback.from_user
# Двойная проверка на 24 часа (на случай если пользователь не обновлял сообщение)
if not await repo.can_request_access(user.id):
await callback.answer("⏳ Вы уже отправляли запрос недавно. Повторите через сутки.", show_alert=True)
return
# 1. Записываем в БД статус PENDING
await repo.create_or_update_request(user)
# 2. Уведомляем пользователя
await callback.message.edit_text("✅ Заявка отправлена администратору. Ожидайте решения.")
# 3. Отправляем уведомление Админу
# Формируем красивый текст
info = (
f"🔔 Новый запрос доступа!\n"
f"👤 Имя: {user.full_name}\n"
f"🆔 ID: {user.id}\n"
f"🔗 Username: @{user.username if user.username else 'нет'}"
)
await bot.send_message(
chat_id=admin_id,
text=info,
reply_markup=get_admin_decision_kb(user.id)
)
await callback.answer()
@router.callback_query(F.data.startswith("access_"))
async def admin_decision(callback: CallbackQuery, repo: UsersRepo, bot: Bot):
"""Админ нажал Разрешить или Запретить"""
action, user_id_str = callback.data.split("_")[1], callback.data.split("_")[2]
target_user_id = int(user_id_str)
if action == "allow":
# Обновляем БД
await repo.set_status(target_user_id, UserStatus.ALLOWED)
# Ответ админу
await callback.message.edit_text(f"✅ Доступ для {target_user_id} РАЗРЕШЕН.")
# Уведомление пользователю
try:
await bot.send_message(target_user_id, "🎉 Вам предоставлен доступ к боту!\nНажмите /start")
except:
await callback.message.answer(
f"⚠️ Не удалось уведомить пользователя {target_user_id} (он заблокировал бота?)")
elif action == "deny":
# Обновляем БД (статус DENIED, дата запроса остается старой - то есть через сутки он сможет снова попросить)
# Если хотите, чтобы при отказе таймер 24ч сбрасывался на "сейчас", нужно обновить last_request_date.
# В текущей реализации repo, мы просто меняем статус. Таймер тикает от момента подачи заявки пользователем.
await repo.set_status(target_user_id, UserStatus.DENIED)
await callback.message.edit_text(f"🚫 Доступ для {target_user_id} ЗАПРЕЩЕН.")
try:
await bot.send_message(target_user_id, "🚫 Администратор отклонил ваш запрос доступа.")
except:
pass
await callback.answer()