draft send discord message on mattermost

This commit is contained in:
Mylloon 2022-01-04 22:52:14 +01:00
parent 39382d30cb
commit 45a9aca748
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -4,6 +4,8 @@ use serenity::{
prelude::*, prelude::*,
}; };
use serde_json::json;
mod erreur { mod erreur {
include!("erreur.rs"); include!("erreur.rs");
} }
@ -12,24 +14,97 @@ mod erreur {
pub struct ConnectionInfoDiscord { pub struct ConnectionInfoDiscord {
pub token: String, pub token: String,
pub prefix: String, pub prefix: String,
pub api: mattermost_api::client::Mattermost,
pub salon: String,
} }
static mut _PREFIX: Option<String> = None; /// Structure qui stocke les informations dont le bot a besoin pour communiquer avec Mattermost
struct InformationsBot {
prefix: Option<String>,
api: Option<mattermost_api::client::Mattermost>,
salon: Option<String>,
}
/// Récupère le string du prefix /// Implémentation pour utiliser facilement les valeurs de la structure
/// Attention, on fait paniqué le programme si la valeur est vide, pour éviter /// Normalement, rien ne panique car si `start_discord`
/// n'as pas encore été appellé on panique avant d'arriver ici.
///
/// On fait quand même le match pour être sûr.
impl InformationsBot {
const err: String = String::from("Erreur lors de la récupération des informations\nTips: start_discord n'a peut-être pas été appelée...");
/// Créer une structure vide
pub fn nouveau_vide() -> Self {
Self {
prefix: None,
api: None,
salon: None,
}
}
/// Créer une structure personnalisée.
pub fn nouveau(
prefix: String,
api: mattermost_api::client::Mattermost,
salon: String,
) -> Option<Self> {
Some(Self {
prefix: Some(prefix),
api: Some(api),
salon: Some(salon),
})
}
/// Récupère préfix, sinon panique
pub fn recuperation_prefix(self) -> String {
match self.prefix {
Some(prefix) => prefix,
None => panic!(
"{}",
erreur::message_erreur(&format!("[Recup-Prefix] {}", Self::err))
),
}
}
/// Récupère API, sinon panique
pub fn recuperation_API(self) -> mattermost_api::client::Mattermost {
match self.api {
Some(api) => api,
None => panic!(
"{}",
erreur::message_erreur(&format!("[Recup-API] {}", Self::err))
),
}
}
/// Récupère le salon, sinon panique
pub fn recuperation_salon(self) -> String {
match self.salon {
Some(salon) => salon,
None => panic!(
"{}",
erreur::message_erreur(&format!("[Recup-Salon] {}", Self::err))
),
}
}
}
static mut _INFO: Option<InformationsBot> = None;
/// Récupère les informations qui sont nécessaire à la communication avec Mattermost
/// Attention, on fait paniqué le programme si l valeur est vide, pour éviter
/// ça, il faut appeller cette fonction seulement quand `start_discord` /// ça, il faut appeller cette fonction seulement quand `start_discord`
/// a été appellé car c'est elle qui ajoute le préfixe à `_PREFIX` /// a été appellé car c'est elle qui ajoute le préfixe à `_INFO`
/// ///
/// Je sais que c'est vraiment naze de faire ça (variable static + blocs unsafe) /// 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 /// mais c'est la seul solution que j'ai trouvé en évitant de trop étoffé avec du
/// code pas très utile. /// code Discord pas très utile.
unsafe fn recuperation_prefix() -> String { unsafe fn recuperation_info() -> &'static InformationsBot {
match &_PREFIX { match &_INFO {
Some(p) => p.to_string(), Some(info) => info,
None => panic!( 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...") erreur::message_erreur(&format!("[Recup-InfosBot] {}", InformationsBot::err))
), ),
} }
} }
@ -41,11 +116,11 @@ impl EventHandler for Handler {
// Appellé quand un message est récupérer par le bot // Appellé quand un message est récupérer par le bot
async fn message(&self, ctx: Context, msg: Message) { async fn message(&self, ctx: Context, msg: Message) {
#[allow(unused_assignments)] #[allow(unused_assignments)]
// Rust doit penser que `prefix` n'est pas utilisé à cause de la confusion apporté par le bloc unsafe let mut infos = &InformationsBot::nouveau_vide();
let mut prefix = String::from("");
unsafe { unsafe {
prefix = recuperation_prefix(); infos = recuperation_info();
} }
let prefix = infos.recuperation_prefix();
if msg.content == format!("{}info", prefix) { if msg.content == format!("{}info", prefix) {
let reponse = "\ let reponse = "\
Bot réalisé dans le cadre du cours de Programmation avancée.\n\ Bot réalisé dans le cadre du cours de Programmation avancée.\n\
@ -60,11 +135,12 @@ impl EventHandler for Handler {
} else { } else {
/* Dans ce cas là, ce n'est pas une commande, alors c'est un message. /* Dans ce cas là, ce n'est pas une commande, alors c'est un message.
* Il faut l'envoyer à Mattermost. */ * Il faut l'envoyer à Mattermost. */
envoie_msg_mattermost(msg).await
} }
} }
// Fonction appellé quand le bot est lancé et connecté // Fonction appellé quand le bot est lancé et connecté
async fn ready(&self, _: Context, _ready: Ready) { async fn ready(&self, _: Context, _: Ready) {
println!("Écoute les évènements Discord..."); println!("Écoute les évènements Discord...");
} }
} }
@ -72,8 +148,8 @@ impl EventHandler for Handler {
/// Lance le bot Discord /// Lance le bot Discord
pub async fn start_discord(informations: ConnectionInfoDiscord) { pub async fn start_discord(informations: ConnectionInfoDiscord) {
unsafe { unsafe {
// On définit notre préfix // On enregistre tout de suite nos informations
_PREFIX = Some(informations.prefix); _INFO = InformationsBot::nouveau(informations.prefix, informations.api, informations.salon);
} }
// Client Discord (https://docs.rs/serenity/latest/serenity/client/index.html) // Client Discord (https://docs.rs/serenity/latest/serenity/client/index.html)
@ -90,6 +166,46 @@ pub async fn start_discord(informations: ConnectionInfoDiscord) {
// Lance le bot // Lance le bot
if let Err(err) = client.start().await { if let Err(err) = client.start().await {
// Si une erreur apparaît // Si une erreur apparaît
erreur::affiche_message_erreur(&format!("Erreur Discord : {:?}", err)); erreur::affiche_message_erreur(&format!("Erreur lancement discord : {:?}", err));
}
}
/// Ne peut pas être async (limitation de serde_json)
fn recuperation_salon() -> String {
String::from("temp")
}
/// Envoie un message sur Mattermost
async fn envoie_msg_mattermost(msg: Message) {
#[allow(unused_assignments)]
let mut infos = &InformationsBot::nouveau_vide();
unsafe {
infos = recuperation_info();
}
let res = infos
.recuperation_API()
.query::<String>(
"POST",
"post",
None,
Some(
&json!( // d'après la documentation : https://api.mattermost.com/#tag/WebSocket
{
"channel_id": recuperation_salon(),
"message": msg
}
)
.to_string(),
),
)
.await;
match res {
Ok(res) => {
println!("{}", res);
}
Err(e) => {
erreur::affiche_message_erreur(&format!("[Discord -> Mattermost] Erreur: {}", e));
}
} }
} }