Remove tribute auto renew and add admin notifications

This commit is contained in:
Machka Pasla
2025-07-06 13:31:04 +07:00
parent 07cb68457f
commit df987fc52a
7 changed files with 69 additions and 82 deletions
-75
View File
@@ -1,75 +0,0 @@
import logging
from datetime import datetime, timezone
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from sqlalchemy.orm import sessionmaker
from config.settings import Settings
from bot.services.subscription_service import SubscriptionService
from bot.services.panel_api_service import PanelApiService
from db.dal import subscription_dal
async def auto_extend_tribute_subscriptions(
settings: Settings, panel_service: PanelApiService,
async_session_factory: sessionmaker) -> None:
logging.info(
f"Scheduler job 'auto_extend_tribute_subscriptions' started at {datetime.now(timezone.utc)} UTC."
)
async with async_session_factory() as session:
try:
sub_service = SubscriptionService(settings, panel_service)
subs = await subscription_dal.get_active_subscriptions_for_autorenew(
session, 'tribute', require_skip_flag=False)
if not subs:
logging.info("No Tribute subscriptions to auto-extend.")
return
for sub in subs:
if not sub.skip_notifications:
from db.dal import payment_dal
has_pay = await payment_dal.user_has_successful_payment_for_provider(
session, sub.user_id, 'tribute')
if not has_pay:
continue
await subscription_dal.set_skip_notifications_for_provider(
session, sub.user_id, 'tribute', True)
months = sub.duration_months or 1
bonus_days = months * 30
await sub_service.extend_active_subscription_days(
session, sub.user_id, bonus_days,
reason='tribute_autorenew')
await session.commit()
logging.info(
f"Auto-extended {len(subs)} Tribute subscriptions and committed session.")
except Exception as e:
logging.error(
f"Error during auto_extend_tribute_subscriptions: {e}",
exc_info=True)
await session.rollback()
logging.info("Session rolled back due to error in auto_extend_tribute_subscriptions.")
def schedule_tribute_autorenew(
settings: Settings, scheduler: AsyncIOScheduler,
panel_service: PanelApiService,
async_session_factory: sessionmaker) -> None:
async def job_wrapper():
try:
await auto_extend_tribute_subscriptions(
settings, panel_service, async_session_factory)
except Exception as e:
logging.error(
f"Unhandled error in scheduled job 'auto_extend_tribute_subscriptions': {e}",
exc_info=True)
scheduler.add_job(
job_wrapper,
'cron',
hour=0,
minute=5,
name='daily_tribute_autorenew',
misfire_grace_time=60 * 15,
replace_existing=True)
logging.info(
"Tribute subscription auto-renew job scheduled daily at 00:05 UTC.")
+43
View File
@@ -133,3 +133,46 @@ async def schedule_subscription_notifications(
logging.info(
f"Subscription expiration warning job scheduled daily at {notification_hour:02d}:{notification_minute:02d} UTC."
)
async def notify_admins(bot: Bot, settings: Settings, i18n: JsonI18n,
message_key: str, parse_mode: str | None = None,
**kwargs) -> None:
if not settings.ADMIN_IDS:
return
admin_lang = settings.DEFAULT_LANGUAGE
msg = i18n.gettext(admin_lang, message_key, **kwargs)
for admin_id in settings.ADMIN_IDS:
try:
await bot.send_message(admin_id, msg, parse_mode=parse_mode)
except Exception as e:
logging.error(f"Failed to send admin notification to {admin_id}: {e}")
async def notify_admin_new_trial(bot: Bot, settings: Settings, i18n: JsonI18n,
user_id: int, end_date: datetime) -> None:
end_date_str = end_date.strftime('%Y-%m-%d') if isinstance(end_date, datetime) else str(end_date)
await notify_admins(
bot,
settings,
i18n,
"admin_new_trial_notification",
user_id=user_id,
end_date=end_date_str,
)
async def notify_admin_new_payment(bot: Bot, settings: Settings, i18n: JsonI18n,
user_id: int, months: int, amount: float,
currency: str | None = None) -> None:
currency_symbol = currency or settings.DEFAULT_CURRENCY_SYMBOL
await notify_admins(
bot,
settings,
i18n,
"admin_new_payment_notification",
user_id=user_id,
months=months,
amount=f"{amount:.2f}",
currency=currency_symbol,
)