Add basic connection to Discord + a basic command

This commit is contained in:
Mylloon 2022-01-04 20:32:58 +01:00
parent fcb55609e2
commit 7e8da0d900
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -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<String> = 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));
}
}