Le problème
TotoMondiale est un jeu de pronostics gratuit que j’anime pour les grands tournois de football depuis le milieu des années 2000. Son palmarès cite TotoEuropeo 2008, TotoEuropeo 2012, TotoMondiale 2014 et TotoEuropeo 2016. Les règles ont peu changé : pour chaque match, on remplit une grille, les points suivent les cotes, et chaque grille est rendue publique avant le coup d’envoi pour que personne ne puisse tricher. L’ancien site en ASP classique ne pouvait pas offrir ce que les joueurs attendent aujourd’hui : des ligues privées entre amis, un affichage adapté au téléphone et les scores en direct. Pour la Coupe du monde 2026, je l’ai entièrement réécrit.
Ce que j’ai construit
Une nouvelle plateforme Node.js qui garde les anciennes règles et ajoute les ligues, les données en direct et une bonne dose de jeu.
- Grille à 9 paris : résultat final, mi-temps, but/pas de but, moins/plus, penaltys, mi-temps/fin de match, pair/impair, score exact, nombre total de buts. Les cotes viennent d’API-Football, avec des cotes par défaut quand il n’y en a pas.
- Ligues privées et publiques : chaque ligue a son classement, sa bannière, son bandeau d’actualités et son chat.
- Cartes spéciales : Sesto Senso donne un bonus sur le score exact, Malocchio retire des points à un autre joueur, Cornicello annule un Malocchio.
- Le fair-play inscrit dans le code : les grilles et les cartes des autres joueurs restent cachées jusqu’au verrouillage du match. La règle s’applique aussi aux administrateurs de la plateforme. Si quelqu’un oublie sa grille, le système en remplit une au hasard, exactement comme le prévoyait le règlement d’origine.
- Matchs en direct : une tâche interroge API-Football toutes les 30 secondes et met à jour les scores pendant la rencontre.
- Fonctions d’IA : Claude rédige chaque jour une série de pronostics suggérés ; les administrateurs de ligue peuvent créer une bannière avec DALL-E 3 et un petit journal de la ligue avec OpenAI.
- Pages du tournoi et langues : équipes, stades, historique, phase de groupes et tableau final, en cinq langues, avec connexion Google.
Comment c’est construit
Node.js 20, Express 4, EJS, MySQL 8, Passport avec Google OAuth, Nodemailer et ImapFlow, sur Phusion Passenger sous cPanel. Je publie par petites étapes et j’incrémente la version à chaque fois : le code en est à la version 5.1.642, build 665. Les éditions précédentes tournaient en ASP classique avec des bases Access.
Pourquoi ce choix
Les heures de coup d’envoi sont stockées en UTC, avec un décalage d’affichage à part. API-Football a besoin de l’heure UTC réelle pour trouver un match, alors que les joueurs veulent lire l’heure italienne. Séparer les deux évite toute une famille de bugs où un match se verrouille une heure trop tôt ou trop tard.


