Interface d'administration pour créer et gérer des commandes Nightbot personnalisées avec exécution JavaScript sécurisée.
- Authentification sécurisée : Système de login avec auto-hash des mots de passe (style Yourls)
- Gestion de commandes : Interface web SSR pour créer/éditer/supprimer des commandes
- Éditeur Monaco : Éditeur de code intégré pour écrire du JavaScript
- Exécution sécurisée : Sandbox Deno pour exécuter le code utilisateur en toute sécurité
- Système de Quotes : Gestion de listes d'éléments (comme twitch.center/customapi/quote)
- API REST : Endpoints pour Nightbot et gestion des quotes
- Stockage PostgreSQL : Base de données robuste et performante
- Backend: PHP 8.4 vanilla (pas de framework lourd)
- Router: FastRoute
- Templates: PHP natif (SSR pur)
- Base de données: PostgreSQL 16
- Exécuteur JS: Deno (sandbox sécurisé, sans permissions réseau/fichiers)
- Éditeur: Monaco Editor (CDN)
- Authentification: Système maison avec hash bcrypt auto
- Docker & Docker Compose
- Cloner le projet
git clone <repo>
cd papy-nightbot- Configurer l'authentification
cp .env.example .env
# Éditer .env et configurer ADMIN_USERNAME et ADMIN_PASSWORD- Démarrer les conteneurs
docker-compose up --build -d- Accéder à l'application
- Interface admin : http://localhost:8080/login
- Login par défaut :
admin/changeme(si utilisé depuis .env.example) ⚠️ Changez immédiatement le mot de passe !
/public
/index.php # Point d'entrée + router
/static/style.css # CSS
/src
/Controllers
/AdminController.php # Gestion commandes
/QuoteController.php # Gestion quotes
/QuoteApiController.php # API publique quotes
/NightbotController.php # API Nightbot
/AuthController.php # Authentification
/Models
/Command.php # Modèle commande
/Quote.php # Modèle quote
/Executor
/DenoExecutor.php # Wrapper Deno pour JS user
Auth.php # Système d'authentification
Config.php # Gestion de la configuration (env + config.php)
Database.php # Connexion PostgreSQL
/views
/layout.php # Template principal avec tabs
/auth/login.php # Page de login
/admin/
index.php # Liste des commandes
edit.php # Éditeur de commande
quotes.php # Liste des quotes
quote_edit.php # Éditeur de quote
help.php # Documentation
init.sql # Schéma DB (commands + quotes)
.env.example # Configuration exemple
docker-compose.yml # Orchestration
Dockerfile # Image PHP + Deno
- Se connecter sur http://localhost:8080/login
- Aller dans l'onglet Commandes
- Cliquer sur Nouvelle commande
- Remplir le formulaire :
- Nom :
random(sans le !) - Description : "Tire un nombre aléatoire"
- Code :
const min = parseInt(args[0]) || 1; const max = parseInt(args[1]) || 100; const random = Math.floor(Math.random() * (max - min + 1)) + min; return `Nombre aléatoire : ${random}`;
- Nom :
- Enregistrer
Dans Nightbot, créer une commande personnalisée :
$(urlfetch http://votre-domaine.com/api/nightbot/random?args=$(querystring))
Utilisation dans le chat :
!random 1,100
→ Nombre aléatoire : 42
- Aller dans l'onglet Quotes
- Cliquer sur Nouvelle quote
- Nom :
death_messages - Ajouter des éléments :
- "est mort écrasé par une enclume"
- "est tombé dans la lave"
- "a été tué par un zombie"
- Noter le token affiché (ex:
a1b2c3d4e5f6...)
# Commande !death (affiche une mort aléatoire)
$(urlfetch http://votre-domaine.com/api/quote/death_messages/random)
Résultat dans le chat :
!death
→ est mort écrasé par une enclume
GET /api/nightbot/{command_name}?args=arg1,arg2,arg3Exécute la commande et retourne le résultat en texte brut.
GET /api/quote/{quote_name}/randomRetourne : text/plain
GET /api/quote/{quote_name}/allRetourne : application/json
POST /api/quote/{quote_name}/add
Content-Type: application/x-www-form-urlencoded
value=nouvel élément&token=VOTRE_TOKENRetourne : {"success": true, "item_id": 123}
POST /api/quote/{quote_name}/remove
Content-Type: application/x-www-form-urlencoded
item_id=123&token=VOTRE_TOKENRetourne : {"success": true}
Dans votre code JavaScript exécuté par Deno, vous avez accès à :
// Commande: !random 1,100
// args = ["1", "100"]
const min = parseInt(args[0]) || 1;
const max = parseInt(args[1]) || 100;const responses = [
"Oui, absolument !",
"Non, certainement pas.",
"Peut-être...",
"Demande à nouveau plus tard."
];
const random = Math.floor(Math.random() * responses.length);
return responses[random];// Usage: !choose pizza,burger,tacos
const choices = args[0].split(',').map(s => s.trim());
const random = Math.floor(Math.random() * choices.length);
return `Je choisis : ${choices[random]} !`;// Usage: !weather Paris
const city = args[0] || 'Paris';
try {
const response = await fetch(`https://api.example.com/weather?city=${city}`);
const data = await response.json();
return `Météo à ${city}: ${data.temp}°C, ${data.description}`;
} catch (error) {
return `Impossible de récupérer la météo pour ${city}`;
}Le code JavaScript est exécuté dans un sandbox Deno sécurisé :
- ✅ Accès réseau : fetch() et API HTTPS disponibles (--allow-net)
- ❌ Pas d'accès fichiers : lecture/écriture interdite
- ❌ Pas d'accès environnement : variables env protégées
- ⏱️ Timeout de 5 secondes maximum
- ✅ Isolation totale du processus
- Mots de passe hashés avec
bcrypt - Auto-hash au premier login (comme Yourls)
- Sessions PHP sécurisées
- Protection de toutes les routes admin
- Tokens générés aléatoirement (32 caractères hex)
- Requis pour ajouter/supprimer des éléments
- Stockés dans la base de données
Dans .env ou docker-compose.yml :
# Base de données
DB_HOST=postgres
DB_PORT=5432
DB_NAME=nightbot
DB_USER=nightbot_user
DB_PASSWORD=nightbot_password
# Authentification
ADMIN_USERNAME=admin
ADMIN_PASSWORD=changeme
# API Token (optionnel)
API_TOKEN=your-secret-token-hereNote : Les mots de passe en clair seront automatiquement hashés au premier login et stockés directement dans src/Config.php.
DB_HOST: hôte PostgreSQL (défaut:postgres)DB_PORT: port PostgreSQL (défaut:5432)DB_NAME: nom de la base (défaut:nightbot)DB_USER: utilisateur DB (défaut:nightbot_user)DB_PASSWORD: mot de passe DBADMIN_USERNAME: nom d'utilisateur admin (requis)ADMIN_PASSWORD: mot de passe admin (requis)API_TOKEN: token API (optionnel)APP_ENV: environnement (défaut:production)APP_DEBUG: mode debug (défaut:false)
docker-compose logs -f appdocker-compose exec postgres psql -U nightbot_user -d nightbotdocker-compose down
docker-compose up --build -dPour déployer en production :
- Changer les credentials PostgreSQL dans
.env - Changer le mot de passe admin dans
config.php - Mettre un reverse proxy (Nginx/Caddy/Traefik) devant
- Activer HTTPS obligatoire
- Configurer des sauvegardes PostgreSQL automatiques
- Monitorer les logs d'erreurs
- Limiter le rate-limiting sur les endpoints publics
Vérifier que les migrations SQL ont été appliquées :
docker-compose exec postgres psql -U nightbot_user -d nightbot -c "\dt"Vous devriez voir les tables commands, quotes et quote_items.
Vérifier que Deno est bien installé dans le conteneur :
docker-compose exec app deno --version- Vérifier que les variables
ADMIN_USERNAMEetADMIN_PASSWORDsont définies dans.env - Vérifier que
src/Config.phpest accessible en écriture (pour l'auto-hash) - Vérifier les logs :
docker-compose logs app
MIT