sucresware / 4sucres

Parce qu'à 2 on était pas assez.
https://4sucres.org
9 stars 4 forks source link

Nouveaux achievements "automatiques" #48

Closed mgkprod closed 5 years ago

mgkprod commented 5 years ago

image image

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 ?

innocenzi commented 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
        // ...
    ]);
}
innocenzi commented 5 years ago

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 ?