wip
This commit is contained in:
277
discord_client/README.md
Normal file
277
discord_client/README.md
Normal file
@@ -0,0 +1,277 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user