diff --git a/handlers/_refresh_viewer.py b/handlers/_refresh_viewer.py index f253f04..9588c9e 100644 --- a/handlers/_refresh_viewer.py +++ b/handlers/_refresh_viewer.py @@ -1,3 +1,5 @@ +import time +from datetime import datetime, UTC from helpers.database.redis import get as get_redis from helpers.constants import TTL_VIEWER @@ -9,6 +11,27 @@ def _key_user_chats(uid: str) -> str: return f"user:{uid}:viewing" +async def record_user_interaction_time(uid: str): + redis = get_redis() + now = time.time() + last_ts_key = f"user:{uid}:last_active_ts" + last_ts = await redis.get(last_ts_key) + + today_str = datetime.now(UTC).strftime("%Y-%m-%d") + sec_key = f"user:{uid}:active_sec:{today_str}" + + if last_ts: + try: + elapsed = now - float(last_ts) + if 0 < elapsed <= 120: + await redis.incrbyfloat(sec_key, elapsed) + await redis.expire(sec_key, 172800) # TTL 2 days + except (ValueError, TypeError): + pass + + await redis.set(last_ts_key, str(now), ex=180) + + async def _viewer_add(uid: str, ndcId: int, chatId: str): redis = get_redis() await redis.sadd(_key_viewers(ndcId, chatId), uid) @@ -24,6 +47,7 @@ async def _viewer_remove(uid: str, ndcId: int, chatId: str): async def refresh_user_viewing(uid: str): + await record_user_interaction_time(uid) redis = get_redis() index_key = _key_user_chats(uid) members = await redis.smembers(index_key) diff --git a/helpers/database/models.py b/helpers/database/models.py index 533816d..7568807 100644 --- a/helpers/database/models.py +++ b/helpers/database/models.py @@ -55,6 +55,7 @@ class Users(Schema): extensions = Dict(load_default={}, allow_none=True) status = Integer(load_default=0) coins = Float(load_default=0.00) + lastDailyClaimDate = String(load_default=None) isPaidSubscriber = Bool(load_default=False) createdTime = String(load_default=dttmn) modifiedTime = String(load_default=dttmn)