From 9527c8849dd9db965990ead75a495d234f0d89b9 Mon Sep 17 00:00:00 2001 From: phitza Date: Tue, 3 Sep 2024 13:26:38 +0200 Subject: [PATCH] Added achievement for playing multiple games with different players --- games/achievements.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/games/achievements.py b/games/achievements.py index 16f53f8..d1bc7af 100644 --- a/games/achievements.py +++ b/games/achievements.py @@ -1,5 +1,6 @@ import datetime import zoneinfo +from collections import Counter from enum import StrEnum from django.db.models import Q @@ -188,6 +189,36 @@ def get_level(user): return AchievementLevel.NO_LEVEL +class TheMoreTheMerrierAchievement(Achievement): + name = "The More The Merrier" + description = ( + "Play atleast 5/10/15/20 games with as many different players" + ) + icon = "merrier.svg" + def get_level(user): + played_with_count = Counter() + for game in user.games.filter(): + for player in game.players.all(): + if player != user: + played_with_count[player.username] += 1 + + top20 = sorted( + ({"x": k, "y": v} for k, v in played_with_count.items()), + key=lambda x: -x["y"], + )[:30] + if len(top20) < 20: + return AchievementLevel.NO_LEVEL + if top20[19].get("y") >= 20: + return AchievementLevel.GOLD + elif top20[14].get("y") >= 15: + return AchievementLevel.SILVER + elif top20[9].get("y") >= 10: + return AchievementLevel.BRONZE + elif top20[4].get("y") >= 5: + return AchievementLevel.BASE + else: + return AchievementLevel.NO_LEVEL + class PilfingerAchievement(Achievement): name = "Pilfinger" description = "Stille stille stille, Pille pille pille"