6.4 KiB
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
- Accédez à votre serveur Discord
- Paramètres du canal → Intégrations → Webhooks
- Créer un webhook
- Copiez l'URL du webhook
- Optionnel : Personnalisez le nom et l'avatar par défaut
Permissions requises
Le webhook nécessite les permissions suivantes sur le canal :
Envoyer des messagesInté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 Discordusername: Nom d'utilisateur affiché pour le botavatar_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éussitErr(...)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.