Improved internal achievement checks #268_achievements
This commit is contained in:
@@ -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))
|
||||
|
Reference in New Issue
Block a user