draft send discord message on mattermost
This commit is contained in:
parent
39382d30cb
commit
45a9aca748
1 changed files with 132 additions and 16 deletions
148
src/discord.rs
148
src/discord.rs
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue