This commit is contained in:
140
main.py
140
main.py
@@ -10,11 +10,16 @@ from aiogram import Bot, Dispatcher, Router, F
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from aiogram.filters import Command
|
||||
from aiogram.fsm.storage.memory import MemoryStorage
|
||||
from aiogram.fsm.context import FSMContext
|
||||
|
||||
from src.filters.case_insensitive import CaseInsensitiveCommand
|
||||
|
||||
from src.core.config import BOT_TOKEN
|
||||
from src.core.database import async_session_maker
|
||||
from src.core.scheduler import bot_scheduler
|
||||
from src.container import container
|
||||
from src.interfaces.base import IBotController
|
||||
from src.middlewares.activity import ActivityMiddleware
|
||||
from src.handlers.admin_panel import admin_router
|
||||
from src.handlers.registration_handlers import router as registration_router
|
||||
from src.handlers.admin_account_handlers import router as admin_account_router
|
||||
@@ -24,6 +29,7 @@ from src.handlers.admin_chat_handlers import router as admin_chat_router
|
||||
from src.handlers.account_handlers import account_router
|
||||
from src.handlers.message_management import message_admin_router
|
||||
from src.handlers.p2p_chat import router as p2p_chat_router
|
||||
from src.handlers.help_handlers import router as help_router
|
||||
|
||||
# Настройка логирования
|
||||
logging.basicConfig(
|
||||
@@ -60,16 +66,131 @@ async def get_controller():
|
||||
|
||||
# === COMMAND HANDLERS ===
|
||||
|
||||
@router.message(Command("start"))
|
||||
@router.message(CaseInsensitiveCommand("start"))
|
||||
async def cmd_start(message: Message):
|
||||
"""Обработчик команды /start"""
|
||||
"""Обработчик команды /start (регистронезависимо)"""
|
||||
async with get_controller() as controller:
|
||||
await controller.handle_start(message)
|
||||
|
||||
|
||||
@router.message(Command("admin"))
|
||||
# === TEXT BUTTON HANDLERS ===
|
||||
|
||||
@router.message(F.text == "🎰 Розыгрыши")
|
||||
async def btn_lotteries(message: Message):
|
||||
"""Обработчик кнопки 'Розыгрыши'"""
|
||||
from src.core.database import async_session_maker
|
||||
from src.repositories.implementations import LotteryRepository, ParticipationRepository
|
||||
from src.display.message_formatter import MessageFormatterImpl
|
||||
from src.components.ui import KeyboardBuilderImpl
|
||||
from src.core.services import UserService
|
||||
from src.core.config import ADMIN_IDS
|
||||
|
||||
async with async_session_maker() as session:
|
||||
lottery_repo = LotteryRepository(session)
|
||||
participation_repo = ParticipationRepository(session)
|
||||
lotteries = await lottery_repo.get_active()
|
||||
|
||||
if not lotteries:
|
||||
await message.answer("❌ Нет активных розыгрышей")
|
||||
return
|
||||
|
||||
text = "🎲 **Активные розыгрыши:**\n\n"
|
||||
formatter = MessageFormatterImpl()
|
||||
|
||||
for lottery in lotteries:
|
||||
participants_count = await participation_repo.get_count_by_lottery(lottery.id)
|
||||
lottery_info = formatter.format_lottery_info(lottery, participants_count)
|
||||
text += lottery_info + "\n" + "="*30 + "\n\n"
|
||||
|
||||
# Получаем информацию о регистрации пользователя
|
||||
user_service = UserService(session)
|
||||
user = await user_service.get_or_create_user(
|
||||
telegram_id=message.from_user.id,
|
||||
username=message.from_user.username,
|
||||
first_name=message.from_user.first_name,
|
||||
last_name=message.from_user.last_name
|
||||
)
|
||||
|
||||
keyboard_builder = KeyboardBuilderImpl()
|
||||
keyboard = keyboard_builder.get_main_keyboard(
|
||||
is_admin=message.from_user.id in ADMIN_IDS,
|
||||
is_registered=user.is_registered
|
||||
)
|
||||
|
||||
await message.answer(
|
||||
text,
|
||||
reply_markup=keyboard,
|
||||
parse_mode="Markdown"
|
||||
)
|
||||
|
||||
|
||||
@router.message(F.text == "💬 Чат")
|
||||
async def btn_chat(message: Message, state: FSMContext):
|
||||
"""Обработчик кнопки 'Чат'"""
|
||||
from src.handlers.chat_handlers import enter_chat
|
||||
await enter_chat(message, state)
|
||||
|
||||
|
||||
@router.message(F.text == "📝 Регистрация")
|
||||
async def btn_registration(message: Message, state: FSMContext):
|
||||
"""Обработчик кнопки 'Регистрация'"""
|
||||
from aiogram.types import CallbackQuery
|
||||
|
||||
fake_callback = CallbackQuery(
|
||||
id="fake",
|
||||
from_user=message.from_user,
|
||||
chat_instance="0",
|
||||
data="start_registration",
|
||||
message=message
|
||||
)
|
||||
|
||||
from src.handlers.registration_handlers import start_registration
|
||||
await start_registration(fake_callback, state)
|
||||
|
||||
|
||||
@router.message(F.text == "🔑 Мой код")
|
||||
async def btn_my_code(message: Message):
|
||||
"""Обработчик кнопки 'Мой код'"""
|
||||
from src.handlers.registration_handlers import show_verification_code
|
||||
await show_verification_code(message)
|
||||
|
||||
|
||||
@router.message(F.text == "💳 Мои счета")
|
||||
async def btn_my_accounts(message: Message):
|
||||
"""Обработчик кнопки 'Мои счета'"""
|
||||
from src.handlers.registration_handlers import show_user_accounts
|
||||
await show_user_accounts(message)
|
||||
|
||||
|
||||
@router.message(F.text == "❓ Справка")
|
||||
async def btn_help(message: Message):
|
||||
"""Обработчик кнопки 'Справка'"""
|
||||
from src.handlers.help_handlers import show_help_main
|
||||
await show_help_main(message)
|
||||
|
||||
|
||||
@router.message(F.text == "⚙️ Админ панель")
|
||||
async def btn_admin(message: Message):
|
||||
"""Обработчик кнопки 'Админ панель'"""
|
||||
await cmd_admin(message)
|
||||
|
||||
|
||||
@router.message(F.text == "🚪 Выйти из чата")
|
||||
async def btn_exit_chat(message: Message, state: FSMContext):
|
||||
"""Обработчик кнопки 'Выйти из чата'"""
|
||||
from src.handlers.chat_handlers import exit_chat
|
||||
await exit_chat(message, state)
|
||||
|
||||
|
||||
@router.message(F.text == "🏠 Главное меню")
|
||||
async def btn_main_menu(message: Message):
|
||||
"""Обработчик кнопки 'Главное меню'"""
|
||||
await cmd_start(message)
|
||||
|
||||
|
||||
@router.message(CaseInsensitiveCommand("admin"))
|
||||
async def cmd_admin(message: Message):
|
||||
"""Обработчик команды /admin - перенаправляет в admin_panel"""
|
||||
"""Обработчик команды /admin (регистронезависимо) - перенаправляет в admin_panel"""
|
||||
from src.core.config import ADMIN_IDS
|
||||
if message.from_user.id not in ADMIN_IDS:
|
||||
await message.answer("❌ Недостаточно прав для доступа к админ панели")
|
||||
@@ -116,6 +237,10 @@ async def main():
|
||||
"""Главная функция запуска бота"""
|
||||
logger.info("Запуск бота...")
|
||||
|
||||
# Подключаем middleware для отслеживания активности
|
||||
dp.message.middleware(ActivityMiddleware())
|
||||
dp.callback_query.middleware(ActivityMiddleware())
|
||||
|
||||
# Подключаем роутеры в правильном порядке
|
||||
# 1. Основной роутер main.py с базовыми командами (/start, /help, /admin)
|
||||
dp.include_router(router)
|
||||
@@ -128,6 +253,7 @@ async def main():
|
||||
dp.include_router(admin_chat_router) # Админские команды чата
|
||||
dp.include_router(redraw_router) # Повторные розыгрыши
|
||||
dp.include_router(p2p_chat_router) # P2P чат между пользователями
|
||||
dp.include_router(help_router) # Справка и помощь
|
||||
|
||||
# 3. Chat router для broadcast (обрабатывает обычные сообщения)
|
||||
dp.include_router(chat_router) # Пользовательский чат (broadcast всем) - РАНЬШЕ account_router
|
||||
@@ -135,6 +261,10 @@ async def main():
|
||||
# 4. Account router для обнаружения счетов (обрабатывает сообщения со счетами от админов)
|
||||
dp.include_router(account_router) # Обнаружение счетов для админов - ПОСЛЕ chat_router
|
||||
|
||||
# Запускаем планировщик задач
|
||||
bot_scheduler.start()
|
||||
logger.info("Планировщик задач запущен")
|
||||
|
||||
# Запускаем polling
|
||||
try:
|
||||
logger.info("Бот запущен")
|
||||
@@ -142,6 +272,8 @@ async def main():
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при запуске бота: {e}")
|
||||
finally:
|
||||
# Останавливаем планировщик
|
||||
bot_scheduler.shutdown()
|
||||
await bot.session.close()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user