Add basic connection to Discord + a basic command
This commit is contained in:
parent
fcb55609e2
commit
7e8da0d900
1 changed files with 81 additions and 3 deletions
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue