No description
Find a file
Simon Junod 70d01acd53 Éphéméride : ajout différé de l'œuvre du jour si wikiart est indisponible
L'éphéméride part toujours à l'heure. Si l'œuvre du jour n'a pas pu être
récupérée, le bot réessaie en arrière-plan (après 2, 5, 10, 20 puis 30
minutes) et modifie les messages déjà publiés dès que wikiart répond.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:05:49 +02:00
cambot Éphéméride : ajout différé de l'œuvre du jour si wikiart est indisponible 2026-10-23 18:05:49 +02:00
scripts Initial commit 2022-03-31 19:44:24 +02:00
tests Éphéméride : ajout différé de l'œuvre du jour si wikiart est indisponible 2026-10-23 18:05:49 +02:00
.gitignore Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00
.python-version Added Spoutnik 2025-08-05 21:33:59 +02:00
config.example.toml Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00
pyproject.toml Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00
README.md Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00
run.py Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00
todo.txt ... 2025-08-09 17:20:15 +02:00
uv.lock Refonte complète du bot et réparation des tâches planifiées 2026-10-23 17:52:22 +02:00

CamBot

Bot Discord du Caillou :

  • Éphéméride : chaque matin, la date, le saint du jour, la météo (OpenWeatherMap), l'œuvre du jour (WikiArt) et, en option, un poème.
  • Wordle collectif, relancé à heures fixes ; reset pour voter un nouveau mot.
  • Spoutnik : retrouver le centre d'une image satellite, relancé à heures fixes ; reset <preset> pour voter un nouveau lieu.
  • Codenames (!rouge, !bleu, !jouer, !deviner mot...), indices des choisisseurs en MP.
  • Sondages (Question ? a) Oui b) Non), dés (!3d6, !2dés20), jugements (!juger truc), épinglage par réaction 📌.

!aide affiche la liste des commandes.

Installation

uv sync
cp config.example.toml config.toml   # puis renseigner token, clés, salons...
uv run python run.py                  # ou : uv run python -m cambot [config.toml]

Les listes de mots (wordlists/) et les zones Spoutnik (geojson/) ne sont pas versionnées. scripts/ contient les outils qui ont servi à générer les listes de mots.

Le bot tourne via l'unité systemd cambot.service (ExecStart=uv run python run.py, dans le dossier du projet) :

sudo systemctl restart cambot
journalctl -u cambot -f

Configuration

Tout est dans config.toml (voir config.example.toml, commenté). Points notables :

  • les salons peuvent être désignés par un nom déclaré dans [channels] ;
  • une fonctionnalité sans salon est désactivée ;
  • les heures planifiées sont en heure locale (timezone) ;
  • token et openweathermap_key peuvent aussi venir des variables d'environnement CAMBOT_TOKEN et CAMBOT_OWM_KEY ;
  • l'état des parties de Wordle et Spoutnik est sauvegardé dans data_dir et survit aux redémarrages.

Administration

Le propriétaire de l'application Discord (et les identifiants listés dans admins) peut envoyer au bot, en MP :

Commande Effet
admin liste des commandes
status prochaines tâches planifiées et parties en cours
ephemeris publier l'éphéméride maintenant
wordle targets / wordle reset <salon> voir les mots / relancer une partie
spoutnik targets / spoutnik reset <salon> <preset> voir les lieux / relancer une partie
say <salon> <texte> faire parler le bot
dump <serveur> / load <serveur> <base64> / prefix <serveur> <préfixe> sauvegarder, restaurer ou préfixer les noms des salons

Architecture

run.py                    point d'entrée (systemd)
cambot/
  __main__.py             chargement de la config, logs, lancement
  bot.py                  CamBot : chargement des fonctionnalités, planificateur, session HTTP partagée
  config.py               lecture et validation de config.toml
  scheduler.py            tâches quotidiennes à heure fixe, isolées les unes des autres
  storage.py              persistance JSON de l'état des parties
  features/               une fonctionnalité par module (un Cog nextcord chacun)
    admin.py  codenames.py  ephemeris.py  misc.py  polls.py  spoutnik.py  wordle.py
tests/                    uv run pytest

La logique de chaque jeu est indépendante de Discord (elle reçoit des messages et des salons), ce qui permet de la tester avec de faux objets.