feat(/me): subscription data + rw controls

This commit is contained in:
2026-08-03 11:15:11 +07:00
parent 801014c392
commit c06be7b5f2
11 changed files with 142 additions and 73 deletions

70
external/rw.py vendored
View File

@@ -431,6 +431,27 @@ def get_sdk() -> RemnawaveSDK | None:
return RemnawaveSDK(base_url=cfg.remnawave_base_url, token=cfg.remnawave_token)
async def get_rw_user(
sdk: RemnawaveSDK, telegram_id: int | None = None, username: str | None = None
) -> RWUserInfo | None:
rw_user = None
if telegram_id is not None:
rw_user = await get_user_by_telegram_id(sdk, telegram_id)
if rw_user is None:
rw_username = _build_rw_username(telegram_id=telegram_id, username=username)
if rw_username is None:
logger.warning(
"Cannot build username for telegram_id=%s username=%s",
telegram_id,
username,
)
return None
rw_user = await get_user_by_username(sdk, rw_username)
return rw_user
async def sync_subscription_by_telegram_id(
*,
expires_at: datetime,
@@ -443,38 +464,29 @@ async def sync_subscription_by_telegram_id(
logger.info("Skipping RW subscription sync: RemnaWave is not configured")
return False
rw_user = None
if telegram_id is not None:
rw_user = await get_user_by_telegram_id(sdk, telegram_id)
rw_user = await get_rw_user(sdk, telegram_id=telegram_id, username=username)
if rw_user is None:
rw_username = _build_rw_username(telegram_id=telegram_id, username=username)
if rw_username is None:
logger.warning(
"Skipping RW subscription sync: cannot build username for telegram_id=%s username=%s",
telegram_id,
username,
)
return False
rw_user = await get_user_by_username(sdk, rw_username)
if rw_user is None:
rw_user = await create_user(
sdk=sdk,
username=rw_username,
telegram_id=telegram_id,
expire_at=expires_at,
hwid_device_limit=None if devices == 0 else devices,
squad_uuids=cfg.remnawave_default_squads,
)
if rw_user is None:
logger.warning(
"Failed to create RW user for telegram_id=%s username=%s",
telegram_id,
username,
)
return False
rw_user = await create_user(
sdk=sdk,
username=rw_username,
telegram_id=telegram_id,
expire_at=expires_at,
hwid_device_limit=None if devices == 0 else devices,
squad_uuids=cfg.remnawave_default_squads,
)
if rw_user is None:
logger.warning(
"Failed to create RW user for telegram_id=%s username=%s",
telegram_id,
username,
)
return False
expire_synced = await update_expire_at(sdk, rw_user.uuid, expires_at)
devices_synced = await set_hwid_limit(sdk, rw_user.uuid, devices)
return expire_synced and devices_synced
def build_subscription_link(short_uuid: str):
return cfg.remnawave_sub_url.rstrip("/") + f"/{short_uuid}"