feat(autorenewal): implement automatic subscription renewal system

This commit is contained in:
2026-05-18 17:32:04 +07:00
parent 281a460974
commit 56f10d19c5
14 changed files with 411 additions and 12 deletions

View File

@@ -8,6 +8,7 @@ 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
@@ -16,6 +17,7 @@ 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)
@@ -40,6 +42,17 @@ async def main():
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,
@@ -48,13 +61,10 @@ async def main():
bills_repository=bills_repository,
billing_service=billing_service,
subscriptions_repository=subscriptions_repository,
renewal_service=renewal_service,
)
dp.update.middleware.register(DIMiddleware(deps, async_session))
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)
for r in admin_routers:
dp.include_router(r)
for r in client_routers:
@@ -62,7 +72,16 @@ async def main():
for r in system_routers:
dp.include_router(r)
await dp.start_polling(bot)
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__":