init auth and main function

This commit is contained in:
Yuriy Yuriev
2026-05-14 16:15:58 +07:00
commit 27c53e897e
47 changed files with 5750 additions and 0 deletions
+137
View File
@@ -0,0 +1,137 @@
"""
Главный файл бота с сохранением задач.
"""
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.types import BotCommand
from aiogram.client.session.aiohttp import AiohttpSession
from config.settings import settings
from core.logger import setup_logger
from managers.proxy_manager import ProxyManager
from managers.background_tasks import BackgroundTaskManager
from services.browser_service import BrowserService
from handlers.commands import BotInterface
from managers.storage import TaskStorage, ChatStorage
logger = setup_logger(__name__)
async def set_bot_commands(bot: Bot):
"""Устанавливает команды бота в меню."""
commands = [
BotCommand(command="start", description="🏠 Главное меню"),
BotCommand(command="register", description="🔐 Зарегистрироваться"),
BotCommand(command="login", description="🔑 Войти"),
BotCommand(command="logout", description="🔒 Выйти"),
BotCommand(command="streamers", description="📺 Стримеры"),
BotCommand(command="tasks", description="📊 Задачи"),
BotCommand(command="status", description="📈 Статус"),
]
await bot.set_my_commands(commands)
class BotApplication:
def __init__(self):
self.bot: Bot = None
self.dispatcher: Dispatcher = None
self.proxy_manager = ProxyManager()
self.background_tasks = BackgroundTaskManager()
self.browser_service = BrowserService(self.proxy_manager)
self.storage = TaskStorage()
self.chat_storage = ChatStorage()
self.interface = BotInterface(
background_tasks=self.background_tasks,
proxy_manager=self.proxy_manager,
browser_service=self.browser_service,
storage=self.storage,
chat_storage=self.chat_storage,
)
async def initialize(self):
"""Инициализация бота."""
logger.info("Initializing bot...")
if not settings.BOT_TOKEN:
raise ValueError("BOT_TOKEN not set!")
self.bot = Bot(token=settings.BOT_TOKEN)
self.dispatcher = Dispatcher()
self.interface.register(self.dispatcher)
await set_bot_commands(self.bot)
# Восстанавливаем задачи
await self._restore_tasks()
logger.info(f"Proxies: {self.proxy_manager.count}")
logger.info("Bot initialized!")
async def _restore_tasks(self):
"""Восстанавливает задачи после перезапуска."""
saved_tasks = await self.storage.load_tasks()
if not saved_tasks:
logger.info("No tasks to restore")
return
restored = 0
for task_id, params in saved_tasks.items():
if params.completed or params.stopped:
continue
await self.interface.task_manager.add_task(task_id, params)
if params.task_type == "twitch_irc" and params.chat_id:
class FakeMsg:
chat = type('obj', (object,), {'id': params.chat_id})
bot = self.bot
await self.background_tasks.start_task(
task_id=task_id,
coro=self.interface._run_twitch(task_id, params, FakeMsg()),
task_type="twitch_irc",
metadata={'type': 'twitch_irc', 'channel': params.channel, 'chat_id': params.chat_id}
)
restored += 1
logger.info(f"🔄 Restored {restored} tasks")
async def start(self):
"""Запуск бота."""
await self.initialize() # ← ВОТ ЭТО БЫЛО ПРОПУЩЕНО
logger.info("Starting polling...")
await self.dispatcher.start_polling(self.bot)
async def stop(self):
"""Остановка с сохранением."""
logger.info("Shutting down...")
# Сохраняем задачи
tasks = self.interface.task_manager._tasks
await self.storage.save_tasks(tasks)
await self.background_tasks.cancel_all()
await self.browser_service.cleanup()
if self.bot:
await self.bot.session.close()
logger.info("Bot stopped")
async def main():
app = BotApplication()
try:
await app.start()
except KeyboardInterrupt:
logger.info("Interrupted")
finally:
await app.stop()
if __name__ == "__main__":
asyncio.run(main())