Skip to content

Commit

Permalink
Compute the leaderboard when a badge is awarded
Browse files Browse the repository at this point in the history
Fixes: #106

Signed-off-by: Aurélien Bompard <[email protected]>
  • Loading branch information
abompard committed Jul 27, 2024
1 parent e53677d commit 1bc58d7
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 19 deletions.
24 changes: 10 additions & 14 deletions fedbadges/consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,25 +129,19 @@ def __call__(self, message: Message):
datanommer.models.session.rollback()

def _process_message(self, message: Message):
# First thing, we receive the message, but we put ourselves to sleep to
# wait for a moment. The reason for this is that, when things are
# 'calm' on the bus, we receive messages "too fast". A message that
# arrives to the badge awarder triggers (usually) a check against
# datanommer to count messages. But if we try to count them before
# this message arrives at datanommer, we'll get skewed results! Race
# condition.
# If the message is recent, we ask datanommer if it already has it.
# If it's older, we assume datanommer already has it and spare it a query.

self._wait_for_datanommer(message)
tahrir = self._get_tahrir_client()

datagrepper_url = self.config["datagrepper_url"]
link = f"{datagrepper_url}/v2/id?id={message.id}&is_raw=true&size=extra-large"
# Update the leaderboard if necessary
if message.topic.endswith("badges.badge.award"):
person = tahrir.get_person(nickname=message.body["user"]["username"])
log.debug("Computing the leaderboard for %s", person.nickname)
tahrir.adjust_ranks(person)

# Award every badge as appropriate.
log.debug("Processing rules for %s on %s", message.id, message.topic)

tahrir = self._get_tahrir_client()
datagrepper_url = self.config["datagrepper_url"]
link = f"{datagrepper_url}/v2/id?id={message.id}&is_raw=true&size=extra-large"
for badge_rule in self.badge_rules:
try:
for recipient in badge_rule.matches(message, tahrir):
Expand All @@ -171,6 +165,8 @@ def _reload_rules(self):
self.badge_rules = self._rules_repo.load_all(tahrir)

def _wait_for_datanommer(self, message: Message):
# If the message is recent, we ask datanommer if it already has it.
# If it's older, we assume datanommer already has it and spare it a query.
now = datetime.datetime.now(tz=datetime.timezone.utc)
a_minute_ago = now - datetime.timedelta(minutes=1)
try:
Expand Down
8 changes: 4 additions & 4 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ fedora-messaging = "^3.6.0"
backoff = "^2.2.1"
fasjson-client = "^1.0.8"
click = "^8.0.0"
tahrir-api = "^1.0.0"
tahrir-api = "^1.4.0"
dogpile-cache = "^1.3.2"
pymemcache = "^4.0.0"
redis = {version = "^5.0.4"}
Expand Down

0 comments on commit 1bc58d7

Please sign in to comment.