mirror of
https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot.git
synced 2026-04-25 23:46:19 +00:00
The background monitoring service was deactivating trial subscriptions when users unsubscribed from channels, ignoring per-channel disable_trial_on_leave and disable_paid_on_leave settings that the real-time handler and middleware already respected. Changes: - Use shared should_disable_subscription() for all 3 deactivation paths - Add global CHANNEL_DISABLE_TRIAL_ON_UNSUBSCRIBE override in should_disable_subscription - Add admin skip in monitoring (consistent with handler/middleware) - Replace inline reactivation with reactivate_subscription() CRUD - Switch to enable_remnawave_user() instead of heavy update_remnawave_user() - Add commit=False to deactivate/reactivate/record/clear_notification for batch atomicity - Include paid subs in monitoring when any channel has disable_paid_on_leave=True - Use skip_deactivation flag instead of early return to preserve reactivation path - Commit batch before create_remnawave_user which internally commits
75 lines
2.0 KiB
Python
75 lines
2.0 KiB
Python
import structlog
|
|
from sqlalchemy import delete, select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database.models import SentNotification
|
|
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
|
|
async def notification_sent(
|
|
db: AsyncSession,
|
|
user_id: int,
|
|
subscription_id: int,
|
|
notification_type: str,
|
|
days_before: int | None = None,
|
|
) -> bool:
|
|
result = await db.execute(
|
|
select(SentNotification)
|
|
.where(
|
|
SentNotification.user_id == user_id,
|
|
SentNotification.subscription_id == subscription_id,
|
|
SentNotification.notification_type == notification_type,
|
|
SentNotification.days_before == days_before,
|
|
)
|
|
.limit(1)
|
|
)
|
|
return result.scalars().first() is not None
|
|
|
|
|
|
async def record_notification(
|
|
db: AsyncSession,
|
|
user_id: int,
|
|
subscription_id: int,
|
|
notification_type: str,
|
|
days_before: int | None = None,
|
|
*,
|
|
commit: bool = True,
|
|
) -> None:
|
|
already_exists = await notification_sent(db, user_id, subscription_id, notification_type, days_before)
|
|
if already_exists:
|
|
return
|
|
notification = SentNotification(
|
|
user_id=user_id,
|
|
subscription_id=subscription_id,
|
|
notification_type=notification_type,
|
|
days_before=days_before,
|
|
)
|
|
db.add(notification)
|
|
if commit:
|
|
await db.commit()
|
|
|
|
|
|
async def clear_notifications(db: AsyncSession, subscription_id: int, *, commit: bool = True) -> None:
|
|
await db.execute(delete(SentNotification).where(SentNotification.subscription_id == subscription_id))
|
|
if commit:
|
|
await db.commit()
|
|
|
|
|
|
async def clear_notification_by_type(
|
|
db: AsyncSession,
|
|
subscription_id: int,
|
|
notification_type: str,
|
|
*,
|
|
commit: bool = True,
|
|
) -> None:
|
|
await db.execute(
|
|
delete(SentNotification).where(
|
|
SentNotification.subscription_id == subscription_id,
|
|
SentNotification.notification_type == notification_type,
|
|
)
|
|
)
|
|
if commit:
|
|
await db.commit()
|