Files
node-notifier/discord_client/README.md
2025-07-30 22:13:58 +02:00

6.4 KiB
Raw Blame History

Discord Client

Une crate Rust pour envoyer des notifications vers Discord via webhooks.

📋 Description

Cette crate fournit un client simple et robuste pour envoyer des notifications vers Discord en utilisant les webhooks. Elle permet de personnaliser l'apparence du bot (nom d'utilisateur, avatar) et gère les erreurs de manière appropriée.

🚀 Fonctionnalités

  • Envoi de messages vers Discord via webhooks
  • Personnalisation du nom d'utilisateur et avatar du bot
  • Gestion d'erreurs robuste
  • API simple et intuitive
  • Tests unitaires avec mocking
  • Support des messages formatés (Markdown Discord)

📦 Installation

Ajoutez cette dépendance à votre Cargo.toml :

[dependencies]
discord_client = { path = "path/to/discord_client" }

Ou pour un usage externe :

[dependencies]
reqwest = { version = "0.12", features = ["blocking", "json"] }
serde = "1.0"
serde_json = "1.0"

🔧 Utilisation

Utilisation basique

use discord_client::DiscordNotifier;

// Créer un client Discord
let notifier = DiscordNotifier::new(
    "https://discord.com/api/webhooks/your/webhook/url".to_string(),
    "System Monitor".to_string(),
    "https://example.com/bot-avatar.png".to_string(),
);

// Envoyer une notification
match notifier.send_notification("🚨 Alerte système détectée !") {
    Ok(_) => println!("Notification envoyée avec succès"),
    Err(e) => eprintln!("Erreur lors de l'envoi : {}", e),
}

Messages formatés

Discord supporte le formatage Markdown :

let message = r#"
🖥️ **Rapport Système**

**CPU:** 85% 🔥
**Mémoire:** 76% 📊
**Disque:** 45% 💾

*Surveillance automatique*
"#;

notifier.send_notification(message)?;

Gestion d'erreurs avancée

use discord_client::DiscordNotifier;

fn send_alert(notifier: &DiscordNotifier, message: &str) {
    match notifier.send_notification(message) {
        Ok(_) => {
            println!("✅ Notification envoyée");
        }
        Err(e) => {
            eprintln!("❌ Échec d'envoi de notification : {}", e);
            
            // Vous pourriez implémenter une logique de retry ici
            // ou utiliser un système de backup (logs, email, etc.)
        }
    }
}

🎨 Personnalisation

Avatar et nom personnalisés

let notifier = DiscordNotifier::new(
    webhook_url,
    "🤖 MonBot Perso".to_string(),
    "https://mon-site.com/avatar-custom.png".to_string(),
);

Messages avec emojis et formatage

// Message d'alerte
let alert = "🚨 **ALERTE CRITIQUE** 🚨\n\n CPU: 95% - Intervention requise !";

// Message d'information
let info = " **Info Système**\n\n Surveillance normale en cours...";

// Message de succès
let success = "✅ **Système OK**\n\n Toutes les métriques sont normales.";

🔗 Configuration Discord

Création d'un webhook

  1. Accédez à votre serveur Discord
  2. Paramètres du canal → Intégrations → Webhooks
  3. Créer un webhook
  4. Copiez l'URL du webhook
  5. Optionnel : Personnalisez le nom et l'avatar par défaut

Permissions requises

Le webhook nécessite les permissions suivantes sur le canal :

  • Envoyer des messages
  • Intégrer des liens (pour les embeds)
  • Utiliser des emojis externes (si utilisés)

🧪 Tests

La crate inclut des tests unitaires avec mocking :

# Exécuter tous les tests
cargo test

# Tests avec logs détaillés
cargo test -- --nocapture

# Test spécifique
cargo test test_send_notification

Exemple de test

#[cfg(test)]
mod tests {
    use super::*;
    use mockito::Server;

    #[test]
    fn test_custom_notification() {
        let mut server = Server::new();
        let mock = server.mock("POST", "/")
            .with_status(204)
            .create();

        let notifier = DiscordNotifier::new(
            server.url(),
            "Test Bot".to_string(),
            "https://example.com/avatar.png".to_string(),
        );

        assert!(notifier.send_notification("Test message").is_ok());
        mock.assert();
    }
}

📊 API Reference

DiscordNotifier

Constructeur

pub fn new(webhook_url: String, username: String, avatar_url: String) -> DiscordNotifier

Crée une nouvelle instance du notifier Discord.

Paramètres :

  • webhook_url : URL du webhook Discord
  • username : Nom d'utilisateur affiché pour le bot
  • avatar_url : URL de l'avatar du bot

Méthodes

pub fn send_notification(&self, message: &str) -> Result<(), Box<dyn std::error::Error>>

Envoie un message vers Discord.

Paramètres :

  • message : Contenu du message à envoyer

Retour :

  • Ok(()) si l'envoi réussit
  • Err(...) en cas d'erreur (réseau, webhook invalide, etc.)

🔧 Dépannage

Erreurs courantes

"Invalid webhook URL"

  • Vérifiez que l'URL commence par https://discord.com/api/webhooks/
  • Assurez-vous que le webhook n'a pas été supprimé

Timeout de réseau

  • Vérifiez votre connexion internet
  • Le webhook Discord peut être temporairement indisponible

Erreur 404

  • Le webhook a été supprimé ou l'URL est incorrecte
  • Recréez un nouveau webhook si nécessaire

Erreur 429 (Rate Limit)

  • Vous envoyez trop de messages trop rapidement
  • Implémentez une logique de retry avec délai

Debug

Activez les logs pour plus d'informations :

RUST_LOG=debug cargo test

🚀 Fonctionnalités avancées

Retry automatique

use std::time::Duration;
use std::thread;

fn send_with_retry(notifier: &DiscordNotifier, message: &str, max_retries: u32) -> Result<(), Box<dyn std::error::Error>> {
    for attempt in 1..=max_retries {
        match notifier.send_notification(message) {
            Ok(_) => return Ok(()),
            Err(e) => {
                if attempt == max_retries {
                    return Err(e);
                }
                println!("Tentative {} échouée, retry dans 2s...", attempt);
                thread::sleep(Duration::from_secs(2));
            }
        }
    }
    unreachable!()
}

Messages avec embeds (extension future)

Cette crate se concentre sur les messages simples, mais peut être étendue pour supporter les embeds Discord :

// Exemple d'extension possible
pub fn send_embed(&self, embed: DiscordEmbed) -> Result<(), Box<dyn std::error::Error>> {
    // Implémentation future
}

📄 Licence

Cette crate est sous licence MIT.