Improved internal achievement checks #268_achievements

This commit is contained in:
2023-07-15 13:16:13 +02:00
parent 0ec67d41e2
commit fd10614b20
4 changed files with 23 additions and 18 deletions

View File

@@ -33,16 +33,20 @@ class AchievementService:
self._message_service = message_service
self._t = t
self._attributes = List(AchievementAttribute)
self._attributes.extend(
[
AchievementAttribute("xp", lambda user: user.xp, "number"),
AchievementAttribute("message_count", lambda user: user.message_count, "number"),
AchievementAttribute("reaction_count", lambda user: user.reaction_count, "number"),
AchievementAttribute("ontime", lambda user: user.ontime, "number"),
AchievementAttribute("level", lambda user: user.level, "Level"),
]
)
def get_attributes(self) -> List[AchievementAttribute]:
attributes = List(AchievementAttribute)
attributes.add(AchievementAttribute("xp", lambda user: user.xp, "number"))
attributes.add(AchievementAttribute("message_count", lambda user: user.message_count, "number"))
attributes.add(AchievementAttribute("reaction_count", lambda user: user.reaction_count, "number"))
attributes.add(AchievementAttribute("ontime", lambda user: user.ontime, "number"))
attributes.add(AchievementAttribute("level", lambda user: user.level, "Level"))
return attributes
return self._attributes
def _match(self, value: str, operator: str, expected_value: str) -> bool:
match operator:
@@ -66,14 +70,13 @@ class AchievementService:
return user_achievements.where(lambda x: x.name == achievement.name).count() > 0
def has_user_achievement(self, user: User, achievement: Achievement) -> bool:
return self._match(str(getattr(user, achievement.attribute)), achievement.operator, achievement.value)
attribute: AchievementAttribute = self._attributes.where(lambda x: x.name == achievement.attribute).single()
return self._match(str(attribute.resolve(user)), achievement.operator, achievement.value)
async def validate_achievements_for_user(self, user: User):
achievements = self._achievements.get_achievements_by_server_id(user.server.id)
for achievement in achievements:
if self.has_user_achievement_already(user, achievement) and not self.has_user_achievement(
user, achievement
):
if self.has_user_achievement_already(user, achievement) or not self.has_user_achievement(user, achievement):
continue
self._achievements.add_user_got_achievement(UserGotAchievement(user, achievement, user.server))