"""Entry point — wires everything together.""" import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.fsm.storage.memory import MemoryStorage from config import TOKEN from hashing import preload_backup_hashes from middlewares import TosMiddleware, UsernameTrackerMiddleware from persistence import load_backup_ids, load_blacklist, load_confirmed_users from routers import admin, group, private logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) logger = logging.getLogger(__name__) async def main() -> None: # 1. Load persisted data load_backup_ids() load_confirmed_users() load_blacklist() bot = Bot(token=TOKEN) dp = Dispatcher(storage=MemoryStorage()) # 2. Log cached hashes import bot_state as state logger.info("Loaded %d file hashes from cache.", len(state.backup_hashes)) # 3. Middlewares dp.update.outer_middleware(UsernameTrackerMiddleware()) dp.update.outer_middleware(TosMiddleware()) # 4. Routers dp.include_router(private.router) dp.include_router(admin.router) dp.include_router(group.router) # 5. Background tasks asyncio.create_task(group.purge_chatroom_semipublic_group(bot)) logger.info("Bot starting…") await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())