Aller au contenu

Événements

tilttek/progression-bundle

La projection et le balayage avertissent le répartiteur d'événements de l'application :

ÉvénementTransmis quandPorte
Tilttek\ProgressionBundle\Infrastructure\Event\LevelUpUn sujet atteint un niveau plus élevé d'une pistechange : un LevelChange (piste, sujet, saison, de, vers, moment, activité)
Tilttek\ProgressionBundle\Infrastructure\Event\LevelDownUne annulation ramène un sujet à un niveau inférieurchange
Tilttek\Progression\ReachedMilestoneUn sujet dépasse un jalon, une fois par saisonpiste, jalon, sujet, membre, saison, moment, activité
Tilttek\Progression\Streak\StreakBrokenLa série d'un membre se brise, une foissérie, membre, longueur, dernière unité active, moment

Récompenser un jalon

#[AsEventListener]
final readonly class RewardMilestones
{
    public function __construct(private Points $points) {}

    public function __invoke(ReachedMilestone $reached): void
    {
        $this->points->grant($reached->member, 100, 'milestone:'.$reached->track.':'.$reached->milestone.':'.$reached->subject->toString().':'.$reached->season);
    }
}

La clé fait que l'attribution n'est écrite qu'une fois, même si l'écouteur s'exécute deux fois. Pendant une reconstruction, seuls les niveaux au-dessus de ceux atteints avant sont annoncés ; ni un niveau perdu ni une série brisée ne le sont, et les jalons ne sont jamais annoncés de nouveau.