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

278 lines
6.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` :
```toml
[dependencies]
discord_client = { path = "path/to/discord_client" }
```
Ou pour un usage externe :
```toml
[dependencies]
reqwest = { version = "0.12", features = ["blocking", "json"] }
serde = "1.0"
serde_json = "1.0"
```
## 🔧 Utilisation
### Utilisation basique
```rust
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 :
```rust
let message = r#"
🖥️ **Rapport Système**
**CPU:** 85% 🔥
**Mémoire:** 76% 📊
**Disque:** 45% 💾
*Surveillance automatique*
"#;
notifier.send_notification(message)?;
```
### Gestion d'erreurs avancée
```rust
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
```rust
let notifier = DiscordNotifier::new(
webhook_url,
"🤖 MonBot Perso".to_string(),
"https://mon-site.com/avatar-custom.png".to_string(),
);
```
### Messages avec emojis et formatage
```rust
// 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 :
```bash
# 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
```rust
#[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
```rust
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
```rust
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 :
```bash
RUST_LOG=debug cargo test
```
## 🚀 Fonctionnalités avancées
### Retry automatique
```rust
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 :
```rust
// 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.