Consigner
tilttek/writing-goalsConsigner ce qui a été écrit
$plan = $goals->log('novel-2026', 1_200); // today, in the author's timezone
$plan = $goals->log('novel-2026', 800, Day::fromString('2026-11-02')); // an earlier day
$plan = $goals->log('novel-2026', -200); // taken back: logged too high
$plan = $goals->correct('novel-2026', 950); // today's count replaced
log() ajoute au compte d'un jour, en une seule étape auprès du magasin, de sorte que deux comptes consignés en même
temps comptent tous deux ; un compte retiré ne fait jamais descendre un jour sous 0. correct() remplace le compte d'un
jour. Chacune répond le plan au jour d'aujourd'hui de l'auteur. Un compte consigné va de -1 000 000 000 à
1 000 000 000 ; un jour compte de 0 à 1 000 000 000. Un jour postérieur au jour d'aujourd'hui de l'auteur est refusé : on
consigne des mots sur un jour venu ; un jour antérieur au premier jour de l'objectif l'est aussi.
L'application compte les mots — du manuscrit de l'auteur, d'une séance dans son éditeur — et consigne le compte ; la bibliothèque ne lit jamais un texte.
L'objectif atteint
Quand un compte fait passer l'objectif de sous sa cible à sa cible ou au-delà, WritingGoals envoie
Event\GoalReached avec l'identifiant de l'objectif, son auteur et le jour où est allé le compte. Un compte consigné
ensuite ne l'envoie pas de nouveau ; un objectif ramené sous sa cible par une correction, puis atteint de nouveau, l'envoie
de nouveau, et deux comptes consignés en même temps peuvent l'envoyer tous deux. Un écouteur qui accorde quelque chose —
un badge, des points — ne l'accorde qu'une fois grâce à la clé idempotencyKey() de l'événement, une par objectif.
Célébrer
Atteindre un objectif mérite d'être souligné. La bibliothèque laisse la célébration à l'application : un écouteur de
GoalReached, ou la page qui reçoit un plan dont isReached() vient de devenir vrai, lance l'animation qu'offre le kit
d'interface du site — confettis, feux d'artifice — et respecte le choix de mouvement réduit du membre. La bibliothèque
n'ajoute aucune animation.
Effacement
$goals->erase($author) supprime tous les objectifs de l'auteur et les comptes consignés pour eux, et répond combien
d'objectifs il y avait.