src/Core/Achievements/. Engine je čisté Strategy pattern — každý achievement = jeden checker.
Komponenty
Interface
getAchievementId() vrací UUID achievementu (musí existovat v tabulce achievements).
check() vrátí true, pokud uživatel splňuje podmínku.
Granter
grantIfEarned— přidá záznam douser_achievements, pokud jí ještě uživatel nemá acheck()vrátí true.reconcile— 2-way sync: může i revokovat (pokud checker přestane být splněný a achievement to umožňuje).
reconcile mažou, pokud Steam odpojíte.
Existující checkery
Soubor → odpovídající achievement:| Checker | Co kontroluje |
|---|---|
SteamLinkedChecker | users.steamid != NULL |
AnthemUploadedChecker | Existuje user_anthems |
FactionFoundedChecker | Uživatel je created_by aspoň jedné frakce |
FactionLeftChecker | Záznam v user_activities typu faction.left |
FactionInviteAcceptedChecker | Záznam v user_activities typu faction.invite.accepted |
FactionLeadershipTransferredChecker | user_activities typu faction.leadership.transferred |
NeutralSurvivorChecker | Uživatel není v žádné frakci > X dní |
CharacterAgeChecker | Postava má age >= X |
EarlyDeathChecker | Postava death_at - created_at < 24h |
PeacefulDeathChecker | Postava zemřela mimo PvP (death_cause analyse) |
SelfKillChecker | Death cause obsahuje sebevražedný klíč |
MoralityStreakChecker | X postav za sebou stejné morálky |
JournalCountChecker | Počet zápisů >= N |
HoursPlayedChecker | Suma hodin z relay >= X |
BeanKingChecker | Beans balance >= X |
Cron AchievementCheckJob
Přidání nového checkeru
Implementujte checker
Třída v
src/Core/Achievements/Checkers/MyChecker.php. Implementujte getAchievementId() (vraťte UUID) a check($userId).Notifikace
Po udělení vznikne notifikaceachievement.granted s polem announced: false. Po prvním view (UI) se nastaví na true, aby se neukazovala znovu.