diff --git a/src/discord.rs b/src/discord.rs index e5950ab..35b976b 100644 --- a/src/discord.rs +++ b/src/discord.rs @@ -1,12 +1,90 @@ -/// Permet de stocker les informations nécessaire pour utiliser le bot discord +use serenity::{ + async_trait, + model::{channel::Message, gateway::Ready}, + prelude::*, +}; -#[derive(Debug)] +mod erreur { + include!("erreur.rs"); +} + +/// Permet de stocker les informations nécessaire pour utiliser le bot discord pub struct ConnectionInfoDiscord { pub token: String, pub prefix: String, } +static mut _PREFIX: Option = None; + +/// Récupère le string du prefix +/// Attention, on fait paniqué le programme si la valeur est vide, pour éviter +/// ça, il faut appeller cette fonction seulement quand `start_discord` +/// a été appellé car c'est elle qui ajoute le préfixe à `_PREFIX` +/// +/// Je sais que c'est vraiment naze de faire ça (variable static + blocs unsafe) +/// mais c'est la seul solution que j'ai trouvé en évitant de trop étoffé avec du +/// code pas très utile. +unsafe fn recuperation_prefix() -> String { + match &_PREFIX { + Some(p) => p.to_string(), + None => panic!( + "{}", + erreur::message_erreur("[RUST] Erreur lors de la récupération du préfix Discord\nTips: start_discord function may not have been called...") + ), + } +} + +struct Handler; + +#[async_trait] +impl EventHandler for Handler { + // Appellé quand un message est récupérer par le bot + async fn message(&self, ctx: Context, msg: Message) { + #[allow(unused_assignments)] // n'importe quoi... + let mut prefix = String::from(""); + unsafe { + prefix = recuperation_prefix(); + } + if msg.content == format!("{}info", prefix) { + let reponse = "\ + Bot réalisé dans le cadre du cours de Programmation avancée.\n\ + Code source du bot : https://code.up8.edu/Anri/matter_bot\n\ + But du bot : Faire un pont entre Mattermost et Discord."; + + if let Err(err) = msg.reply(&ctx.http, reponse).await { + // Gestion erreur lors de l'envoie de la réponse + erreur::affiche_message_erreur(&format!("Erreur d'envoie de message : {:?}", err)); + } + } + } + + // Fonction appellé quand le bot est lancé et connecté + async fn ready(&self, _: Context, _ready: Ready) { + println!("Écoute les évènements Discord..."); + } +} + /// Lance le bot Discord pub async fn start_discord(informations: ConnectionInfoDiscord) { - println!("\n{:?}", informations); + unsafe { + // On définit notre préfix + _PREFIX = Some(informations.prefix); + } + + // Client Discord (https://docs.rs/serenity/latest/serenity/client/index.html) + let mut client = Client::builder(&informations.token) + .event_handler(Handler) + .await + .unwrap_or_else(|_| { + panic!( + "{}", + erreur::message_erreur("Impossible de créer le client Discord",) + ) + }); + + // Lance le bot + if let Err(err) = client.start().await { + // Si une erreur apparaît + erreur::affiche_message_erreur(&format!("Erreur Discord : {:?}", err)); + } }