Skip to content

Commit

Permalink
Merge pull request #12 from vector-im/tadzik/speed-up-rmau-calculations
Browse files Browse the repository at this point in the history
Speed up RMAU calculations
  • Loading branch information
Half-Shot authored Nov 10, 2021
2 parents 283efc9 + 1c6b682 commit 83c6f73
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 10 deletions.
2 changes: 1 addition & 1 deletion mautrix_telegram/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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']
Expand Down
20 changes: 11 additions & 9 deletions mautrix_telegram/db/user_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

0 comments on commit 83c6f73

Please sign in to comment.