Skip to content

Commit c50f759

Browse files
committed
Improve thanks count calculation
Leaderboard and non-unique message thanks totals now de-dupe on the tuple of user_id, source_user_id, and message_id. This eliminates an edge case that could inflate thanks numbers.
1 parent fbee720 commit c50f759

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

dojo_plugin/api/v1/discord.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,11 @@ def year_stamp():
172172
except:
173173
return {"success": False, "error": "invalid start format"}, 400
174174

175-
thanks_scores = DiscordUserActivity.query.with_entities(DiscordUserActivity.user_id, db.func.count(DiscordUserActivity.message_id)
176-
).filter(and_(DiscordUserActivity.message_timestamp >= start),
177-
DiscordUserActivity.type == "thanks"
178-
).group_by(DiscordUserActivity.user_id
179-
).order_by(db.func.count(DiscordUserActivity.user_id).desc())[:100]
175+
sq = DiscordUserActivity.query.where(
176+
DiscordUserActivity.type == 'thanks').where(
177+
DiscordUserActivity.message_timestamp >= start).with_entities(
178+
DiscordUserActivity.user_id, DiscordUserActivity.source_user_id, DiscordUserActivity.message_id).distinct().subquery()
179+
thanks_scores = db.session.execute(db.select(sq.c.user_id, db.func.count(sq.c.user_id)).select_from(sq).group_by(sq.c.user_id).order_by(db.func.count(sq.c.user_id).desc())).all()
180180

181181
def get_name(discord_id):
182182
try:
@@ -189,6 +189,6 @@ def get_name(discord_id):
189189
return response['user']['global_name']
190190

191191
results = [[get_name(discord_id), score] for discord_id, score in thanks_scores]
192-
results = [[name, score] for name, score in results if name is not None][:20]
192+
results = [[name, score] for name, score in results if name is not None][:25]
193193

194194
return {"success": True, "leaderboard": results}, 200

dojo_plugin/models/__init__.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -770,15 +770,19 @@ class DiscordUsers(db.Model):
770770
user = db.relationship("Users")
771771

772772
def thanks_count(self, start=None, end=None, unique_messages=False):
773-
query = DiscordUserActivity.query.filter(and_(DiscordUserActivity.user_id == self.discord_id),
773+
distinct_source_user_id = None if unique_messages else DiscordUserActivity.source_user_id
774+
775+
sq = DiscordUserActivity.query.filter(
776+
DiscordUserActivity.type == 'thanks',
774777
DiscordUserActivity.message_timestamp >= start if start else True,
775778
DiscordUserActivity.message_timestamp <= end if end else True,
776-
DiscordUserActivity.type == "thanks")
779+
).with_entities(DiscordUserActivity.user_id, distinct_source_user_id, DiscordUserActivity.message_id
780+
).distinct().subquery()
781+
782+
return db.session.execute(db.select(sq.c.user_id, db.func.count(sq.c.user_id))
783+
.select_from(sq).group_by(sq.c.user_id).order_by(db.func.count(sq.c.user_id).desc())).all()
777784

778-
if unique_messages:
779-
return query.with_entities(db.func.distinct(DiscordUserActivity.message_id)).count()
780785

781-
return query.count()
782786

783787
def meme_count(self, start=None, end=None, weekly=True):
784788
if not weekly:

0 commit comments

Comments
 (0)