Skip to content

feat(rngdle): porte rngdle depuis DJ4H - #219

Open
Lramelot wants to merge 5 commits into
GravenDev:masterfrom
Lramelot:feat/rngdle
Open

Lramelot wants to merge 5 commits into
GravenDev:masterfrom
Lramelot:feat/rngdle

Conversation

@Lramelot

@Lramelot Lramelot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Portage de RNGdle depuis DJ4H

Cette PR termine la migration de DJ4H vers OmniBot : après le jeu des 4h (#217), elle porte toute la partie RNGdle dans un nouveau module rngdle. Une fois déployée et les comptes importés, DJ4H peut être arrêté.

Le module suit les tirages quotidiens des membres sur rngdle.com. Un administrateur lie chaque membre à son pseudo RNGdle, puis le bot télécharge ses tirages et en tire des classements, des profils et des statistiques en image, ainsi qu'un classement quotidien publié automatiquement.

Le module rngdle

  • Commandes joueurs : /rngdle leaderboard (classement du jour), /rngdle profile [member] [username] (profil d'un joueur, avec autocomplétion des pseudos liés), /rngdle server-stats (statistiques du serveur) et /rngdle leaderboard-all [page] (classement général paginé avec boutons).
  • Commandes admin : /rngdle-admin register|delete|show|refresh|clear. register vérifie que le pseudo existe et importe tout l'historique ; refresh full:true retélécharge tout, au plus une fois par quart d'heure.
  • Classement quotidien : publié chaque jour à 01:00 UTC dans le salon configuré, avec une mention des gagnants.
  • Configuration : le salon du classement quotidien passe par /config rngdle ; l'ancienne commande /rngdle-admin setleaderboard disparaît.
  • Images : les classements reprennent ceux de DJ4H. Le profil et les statistiques du serveur passent en format paysage (1000 × 560, nettement plus lisibles dans Discord) : le score devient la valeur principale, la répartition par palier est un graphique en barres, et seuls les paliers notables sont encadrés. Tous les textes sont traduits.

Corrections par rapport à DJ4H

  • Données par serveur : clear effaçait les tirages de tous les serveurs, refresh synchronisait tous les serveurs, et un joueur inscrit sur deux serveurs ne voyait ses tirages enregistrés que sur l'un d'eux. Tout est isolé par serveur.
  • Mises à jour perdues : les corrections de score n'étaient jamais enregistrées. Elles le sont.
  • Concurrence : synchronisations et modifications de comptes d'un même serveur passent par une seule file. Une synchro en cours ne peut plus réinjecter des tirages après un clear ou un changement de pseudo.
  • Robustesse face à rngdle.com : réponses validées à la réception, erreurs 429 et 5xx retentées, au plus 4 comptes téléchargés en parallèle, et une commande n'attend jamais plus de 10 secondes une synchro avant d'afficher les données déjà enregistrées.
  • Table des percentiles : stockée en base, avec un instantané versionné comme valeur par défaut (DJ4H plantait sur un déploiement neuf) ; une table extraite incohérente est ignorée.
  • Divers : tirages dédupliqués par l'identifiant de l'API, scores en BIGINT, un pseudo lié à un seul membre par serveur, plus de mention codée en dur « TnTube ».

Changements dans le cœur, utiles aux autres modules

  • Tâches planifiées : declareTask({ id, schedule, runOnStart, run }) (#lib/task.ts), enregistrées via le Registry et planifiées avec croner (UTC, pas de chevauchement, erreurs journalisées). Guide : « Tâches planifiées ».
  • Génération d'images réutilisable : renderLeaderboardTable (#lib/leaderboard-table) et renderStatCard (#lib/stat-card), plus les primitives de #lib/imaging. Le jeu des 4h et RNGdle s'en servent ; la police et les médailles ne sont plus dupliquées. Guide : « Générer des images ». Le texte des classements est désormais centré verticalement de façon uniforme, quel que soit le pseudo.
  • Gestion d'erreurs centralisée : une commande ou une interaction qui lève une erreur reçoit toujours une réponse (ou une modification de sa réponse différée) au lieu de rester sur « réfléchit… ». Les modules n'ont plus besoin de try/catch.
  • Plus de cycle d'import : client et modules vivent dans #core/runtime.ts au lieu de #index.js. Les modules peuvent importer les services du cœur normalement (le jeu des 4h en profite aussi).
  • Utilitaires partagés : KeyedQueue (file par clé) et RevisionCache (cache invalidé par révision), utilisés par les deux modules au lieu de deux copies.

Reprise des données

Les tirages n'ont pas besoin d'être migrés : l'API de rngdle.com renvoie tout l'historique d'un joueur. Seuls les comptes liés et les salons de classement sont repris, avec scripts/export-dj4h-rngdle.ts qui lit dj4h.db et produit un SQL idempotent à appliquer dans le conteneur PostgreSQL. La procédure complète est dans docs/specs/rngdle-migration.md.

Tests

  • Bout en bout sur l'API réelle : comptes réels sur deux serveurs, synchronisation, re-synchro idempotente, clear sérialisé derrière une synchro, cooldown, rendu des quatre images avec les vraies données.
  • Unitaires : 352 tests, tous verts.
  • Passes de mutation : la logique critique (paliers, déduplication, isolation par serveur, files, délais, validation, centralisation des erreurs) a été cassée volontairement à de nombreuses reprises ; chaque cassure est détectée.
  • Images : chaque étape du refactoring du rendu a été comparée pixel par pixel à des images de référence, puis la refonte des fiches validée sur des données réelles.
  • Revue adversariale : ses points élevés, moyens et faibles sont tous corrigés.
  • Images Docker : le bot et le migrator se construisent, et les modules se chargent et dessinent dans l'image de production.

Avant de déployer

  • Migration : rngdle crée trois tables (RngdleAccount, RngdleRoll, RngdleScoreTable), appliquées par le conteneur migrator.
  • Accès réseau : le bot doit pouvoir joindre www.rngdle.com (c'est le cas du réseau egress de compose.prod.yaml).
  • Bascule : arrêter DJ4H avant d'activer le module, puis suivre la procédure de docs/specs/rngdle-migration.md.

🤖 Generated with Claude Code

@Lramelot
Lramelot marked this pull request as draft October 3, 2026 08:09
@Lramelot
Lramelot force-pushed the feat/rngdle branch 2 times, most recently from 7132d15 to be36797 Compare October 3, 2026 10:22
@Lramelot

Lramelot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author
image

@Lramelot
Lramelot marked this pull request as ready for review October 3, 2026 10:26

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant