import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties from aiogram.client.session.aiohttp import AiohttpSession from remnawave import RemnawaveSDK from bot.handlers import admin_routers, client_routers, system_routers from bot.middlewares import DIMiddleware from bot.scheduler import start_scheduler from config import settings from db.session import async_session from misc.pally import PallyClient from repositories.bills import BillsRepository from repositories.subscriptions import SubscriptionRepository from repositories.users import UserRepository from schemas.di import DependenciesDTO from services.billing_service import BillingService from services.renewal_service import RenewalService from services.user_service import UserService logging.basicConfig(level=logging.DEBUG) async def main(): dp = Dispatcher() pally_client = PallyClient(settings.pally_token, payer_pays_commission=True) user_repository = UserRepository() bills_repository = BillsRepository() subscriptions_repository = SubscriptionRepository() user_service = UserService(user_repository, subscription_repository=subscriptions_repository) billing_service = BillingService( user_repository=user_repository, bills_repository=bills_repository ) rw_sdk = RemnawaveSDK( base_url=settings.remnawave_url, token=settings.remnawave_token, ) aiohttp_session = AiohttpSession(proxy=settings.proxy) if settings.proxy else None default = DefaultBotProperties(parse_mode="HTML") bot = Bot(token=settings.bot_token, default=default, session=aiohttp_session) renewal_service = RenewalService( subscription_repository=subscriptions_repository, user_repository=user_repository, rw_sdk=rw_sdk, bot=bot, ) deps = DependenciesDTO( user_repository=user_repository, user_service=user_service, rw_sdk=rw_sdk, pally_client=pally_client, bills_repository=bills_repository, billing_service=billing_service, subscriptions_repository=subscriptions_repository, renewal_service=renewal_service, ) dp.update.middleware.register(DIMiddleware(deps, async_session)) for r in admin_routers: dp.include_router(r) for r in client_routers: dp.include_router(r) for r in system_routers: dp.include_router(r) scheduler_task = asyncio.create_task(start_scheduler(renewal_service, async_session)) try: await dp.start_polling(bot) finally: scheduler_task.cancel() try: await scheduler_task except asyncio.CancelledError: pass if __name__ == "__main__": asyncio.run(main())