diff --git a/mautrix_telegram/__main__.py b/mautrix_telegram/__main__.py index cffbb5c2..db334183 100644 --- a/mautrix_telegram/__main__.py +++ b/mautrix_telegram/__main__.py @@ -145,8 +145,8 @@ async def count_logged_in_users(self) -> int: async def _update_active_puppet_metric(self) -> None: active_users = UserActivity.get_active_count( - self.config['bridge.limits.puppet_inactivity_days'], self.config['bridge.limits.min_puppet_activity_days'], + self.config['bridge.limits.puppet_inactivity_days'], ) block_on_limit_reached = self.config['bridge.limits.block_on_limit_reached'] diff --git a/mautrix_telegram/db/user_activity.py b/mautrix_telegram/db/user_activity.py index 04fa5a63..e3f46d4a 100644 --- a/mautrix_telegram/db/user_activity.py +++ b/mautrix_telegram/db/user_activity.py @@ -17,6 +17,7 @@ from typing import Optional, Iterable from sqlalchemy import Column, Integer, BigInteger +from sqlalchemy.ext.hybrid import hybrid_property from mautrix.util.db import Base from mautrix.util.logging import TraceLogger @@ -67,14 +68,15 @@ def update_for_puppet(cls, puppet: 'Puppet', activity_dt: datetime) -> None: ) obj.insert() + @hybrid_property + def activity_days(self): + return (self.last_activity_ts - self.first_activity_ts / 1000) / ONE_DAY_MS + @classmethod def get_active_count(cls, min_activity_days: int, max_activity_days: Optional[int]) -> int: - current_ms = time.time() / 1000 - active_count = 0 - for user in cls._select_all(): - activity_days = (user.last_activity_ts - user.first_activity_ts / 1000) / ONE_DAY_MS - # If maxActivityTime is not set, they are always active - is_active = max_activity_days is None or (current_ms - user.last_activity_ts) <= (max_activity_days * ONE_DAY_MS) - if is_active and activity_days > min_activity_days: - active_count += 1 - return active_count + current_ms = time.time() * 1000 + + query = cls.t.select().where(cls.activity_days > min_activity_days) + if max_activity_days is not None: + query = query.where((current_ms - cls.last_activity_ts) <= (max_activity_days * ONE_DAY_MS)) + return cls.db.execute(query.count()).scalar()