STORM est une plateforme de chat en temps réel avec un système de notifications avancé. Cette documentation couvre tous les aspects de l'intégration, les endpoints API, et les fonctionnalités WebSocket.
- Serveur de messages : Port 4567 (WebSocket + HTTP)
- Serveur d'upload : Port 4568 (HTTP REST API)
- Base de données : SQLite avec pool de connexions
Inscription d'un nouvel utilisateur
Paramètres :
{
"username": "string",
"email": "string",
"password": "string"
}Réponse succès (201) :
{
"status": "success",
"message": "Utilisateur créé avec succès",
"user_id": "integer"
}Réponse erreur (400) :
{
"status": "error",
"message": "Nom d'utilisateur déjà pris"
}Connexion utilisateur
Paramètres :
{
"username": "string",
"password": "string"
}Réponse succès (200) :
{
"status": "success",
"message": "Connexion réussie",
"token": "string",
"user_id": "integer"
}Liste des salons publics
Réponse (200) :
{
"rooms": [
{
"name": "string",
"users_count": "integer",
"created_at": "timestamp"
}
]
}Création d'un salon
Paramètres :
{
"name": "string",
"password": "string (optionnel)",
"is_public": "boolean"
}Upload d'un fichier
Headers :
- Content-Type: multipart/form-data
- Authorization: Bearer {token}
Paramètres :
- file: Fichier binaire
- room: Nom du salon (optionnel)
Réponse succès (200) :
{
"status": "success",
"file_url": "string",
"file_id": "string",
"metadata": {
"size": "integer",
"type": "string",
"name": "string"
}
}URL : ws://localhost:4567
{
"type": "auth",
"username": "string",
"password": "string"
}Réponse succès :
{
"type": "auth_success",
"message": "Authentification réussie",
"user_id": "integer"
}Réponse erreur :
{
"type": "auth_error",
"message": "Identifiants incorrects"
}{
"type": "message",
"content": "string",
"room": "string (optionnel)"
}{
"type": "message",
"username": "string",
"content": "string",
"timestamp": "integer",
"room": "string",
"color": "string"
}{
"type": "notification",
"user_id": "string",
"notification": {
"id": "string",
"type": "room_invite|mention|system|message",
"data": {
"from_user": "string",
"room_name": "string",
"message": "string"
},
"timestamp": "integer",
"read": "boolean"
}
}Envoyer une invitation de salon
Syntaxe : /notify <utilisateur> <salon> [message]
Exemple : /notify alice general Rejoins-nous pour discuter
Aliases : /invite, /inviter
Gérer les notifications
Syntaxes :
/notificationsou/notifications list: Lister les notifications/notifications count: Compter les notifications/notifications clear: Supprimer toutes les notifications/notifications read [id]: Marquer comme lu
Aliases : /notifs, /notif
Créer un salon
Syntaxe : /create <nom> [mot_de_passe]
Rejoindre un salon
Syntaxe : /join <nom> [mot_de_passe]
Quitter le salon actuel
Syntaxe : /leave
Lister les salons disponibles
Syntaxe : /list
Lister les utilisateurs connectés
Syntaxe : /users
Message privé
Syntaxe : /whisper <utilisateur> <message>
Expulser un utilisateur (modérateurs)
Syntaxe : /kick <utilisateur>
Bannir un utilisateur (modérateurs)
Syntaxe : /ban <utilisateur>
Invitation à rejoindre un salon
Structure :
{
"type": "room_invite",
"data": {
"from_user": "string",
"room_name": "string",
"message": "string"
}
}Mention dans un message (@utilisateur)
Structure :
{
"type": "mention",
"data": {
"from_user": "string",
"room_name": "string",
"message": "string"
}
}Notification système
Structure :
{
"type": "system",
"data": {
"message": "string"
}
}const ws = new WebSocket('ws://localhost:4567');
ws.onopen = function() {
// Authentification
ws.send(JSON.stringify({
type: 'auth',
username: 'votre_username',
password: 'votre_password'
}));
};
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
switch(data.type) {
case 'notification':
handleNotification(data.notification);
break;
case 'message':
displayMessage(data);
break;
case 'auth_success':
console.log('Connecté avec succès');
break;
}
};
function handleNotification(notification) {
// Afficher la notification
if (notification.type === 'room_invite') {
showRoomInvite(notification.data);
} else if (notification.type === 'mention') {
showMention(notification.data);
}
// Notification navigateur
if (Notification.permission === 'granted') {
new Notification('STORM', {
body: notification.data.message,
icon: '/icon.png'
});
}
}// Inscription
async function register(username, email, password) {
const response = await fetch('http://localhost:4568/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, email, password })
});
return await response.json();
}
// Upload de fichier
async function uploadFile(file, token) {
const formData = new FormData();
formData.append('file', file);
const response = await fetch('http://localhost:4568/upload', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`
},
body: formData
});
return await response.json();
}- Ruby 2.7+
- Gems : sinatra, websocket, sqlite3, bcrypt, json
# Installer les dépendances
bundle install
# Créer la base de données
ruby -e "require './config/database_pool.rb'; DatabasePool.instance.setup_database"# Terminal 1 : Serveur de messages
ruby srv_message.rb
# Terminal 2 : Serveur d'upload
ruby srv_upload.rb
# Ou utiliser le script de démarrage
./start_hermes.sh# Port du serveur de messages (défaut: 4567)
export MESSAGE_PORT=4567
# Port du serveur d'upload (défaut: 4568)
export UPLOAD_PORT=4568
# Chemin de la base de données
export DATABASE_PATH=./storm.db
# Répertoire d'upload
export UPLOAD_DIR=./uploads- Mots de passe hachés avec BCrypt
- Tokens JWT pour l'API REST
- Sessions WebSocket sécurisées
- Sanitisation des entrées utilisateur
- Validation des types de fichiers
- Limitation de la taille des uploads
- Protection contre l'injection SQL
- 50 notifications maximum par utilisateur
- Taille maximale des fichiers : 10MB
- Longueur maximale des messages : 1000 caractères
- 200 : Succès
- 201 : Créé avec succès
- 400 : Requête invalide
- 401 : Non autorisé
- 403 : Interdit
- 404 : Non trouvé
- 500 : Erreur serveur
- auth_error : Erreur d'authentification
- command_error : Commande invalide
- permission_error : Permissions insuffisantes
- room_error : Erreur de salon
- Connexions/déconnexions
- Commandes exécutées
- Erreurs système
- Uploads de fichiers
- Nombre d'utilisateurs connectés
- Messages par seconde
- Notifications envoyées
- Utilisation de la bande passante
- Base de données SQLite :
storm.db - Fichiers uploadés : répertoire
uploads/ - Notifications :
data/notifications.json
- Arrêter les serveurs
- Sauvegarder les données
- Mettre à jour le code
- Migrer la base si nécessaire
- Redémarrer les serveurs
Problème : WebSocket ne se connecte pas
- Vérifier que le serveur est démarré sur le bon port
- Contrôler les logs pour les erreurs
- Tester avec telnet :
telnet localhost 4567
Problème : Notifications non reçues
- Vérifier la connexion WebSocket
- Contrôler les permissions de notification du navigateur
- Vérifier les logs du NotificationManager
Problème : Upload échoue
- Vérifier les permissions du répertoire uploads/
- Contrôler la taille du fichier
- Vérifier le token d'authentification
Cette documentation couvre tous les aspects nécessaires pour intégrer et utiliser le système de notifications STORM.