Closed mgkprod closed 5 years ago
J'imagine une solution telle qu'un Achievement
est définit par une classe qui possède une fonction canUnlock($user)
.
Cette fonction ferait les vérifications nécessaires permettant de définir si l'utilisateur passé en argument possède les pré-requis pour débloquer ce succès.
Je verrais une autre classe, AchievementManager
, gérer la vérification et l'attribution par lot. Voici une interface possible :
interface AchievementManagerInterface
{
/**
* Boucle dans `$possibleAchievements` pour appeler la fonction
* `$canUnlock` de chacun d'eux en passant `$user`.
*/
public function canUnlock(User $user, array $possibleAchievements) {}
/**
* Débloque le succès `$achievement` pour l'utilisateur donné et le notifie.
*/
public function unlock(User $user, Achievement $achievement) {}
/**
* Vérifie tous les succès pour tous les utilisateurs.
*/
public function probe() {}
}
Dans cet exemple, la fonction probe()
devrait être appelée par tâche planifiée la nuit, et la fonction canUnlock()
lors d'évènements récurrents dont les succès sont faciles à vérifier.
Par exemple dans le contrôleur qui gère la création de messages et d'enregistrement :
// DiscussionController.php
public function store()
{
$discussion = Discussion::create(); //...
// Vérifie les succès probables pour ce cas
$achievementManager->canUnlock(user(), [
CrazyPosterAchievement::class, // Avoir posté 500 messages
RegularPosterAchievement::class, // Avoir posté 100 messages
// ...
]);
}
// Auth/RegisterController.php
public function submit()
{
$user = User::create(); // ...
// Vérifie les succès probables pour ce cas
$achievementManager->canUnlock(user(), [
BunkeredAchievement::class, // Vient du bunker
NoelistAchievement::class, // Vient d'Avenoel
IssouAchievement::class, // Vient de JVC
SixSugarsAchievement::class, // Vient de 2sucres
FreeSpiritAchievement::class, // Ne vient d'aucun JVC-like
// ...
]);
}
Je veux bien m'en occuper, au passage. Ça me permettra d'en apprendre un peu plus sur Laravel et c'est intéressant à implémenter. T'es d'accord @mgkprod ?
La liste se remplit au fur et à mesure, certains sont encore en cours de réalisation chez le graphiste.
Au passage :
Direction technique à prendre :
@hawezo ton avis ?