This commit is contained in:
Mylloon 2022-01-05 02:38:31 +01:00
parent 065320ccf4
commit 453604e164
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 23 additions and 23 deletions

View file

@ -1,7 +1,7 @@
# matter_bot # matter_bot
Au début, `matter_bot` devait être un bot qui fait le pont entre Discord et Mattermost. Au début, `matter_bot` devait être un bot qui fait le pont entre Discord et Mattermost.
Malheureusement, je n'ai pas réussi a recevoir les messages depuis Mattermost... Malheureusement, je n'ai pas réussi à recevoir les messages depuis Mattermost...
MAIS, tout ce qui est du côté de Discord devrait fonctionné proprement. MAIS, tout ce qui est du côté de Discord devrait fonctionner proprement.
J'ai laissé tout ce que j'ai commencé pour Mattermost, il faut donc quand-même renseigner J'ai laissé tout ce que j'ai commencé pour Mattermost, il faut donc quand-même renseigner
les variables demandés ci-dessous pour pouvoir lancer le bot. les variables demandés ci-dessous pour pouvoir lancer le bot.
@ -29,7 +29,7 @@ PREFIX=votre_prefix_ici # commun aux deux bots, par défaut: ç
#### Mattermost #### Mattermost
Dans le cas ou vous optez pour le token, vous devez ajouter un bot, pour ce faire (d'après la [documentation officielle](https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/)) : Dans le cas ou vous optez pour le token, vous devez ajouter un bot, pour ce faire (d'après la [documentation officielle](https://developers.mattermost.com/integrate/admin-guide/admin-bot-accounts/)) :
- Cliquez sur les 9 carrés en haut a gauche - Cliquez sur les 9 carrés en haut à gauche
- Integrations - Integrations
- Bot Accounts - Bot Accounts
- Add Bot Account - Add Bot Account
@ -68,7 +68,7 @@ services:
--- ---
### Estimation du temps de build ### Estimation du temps de build
Sur ma machine (WSL), le temps de build d'environ une minute. Sur ma machine (WSL), le temps de build est d'environ une minute.
`time cargo build` : `time cargo build` :
``` ```
@ -87,7 +87,7 @@ Beaucoup de blabla, au final, qu'est ce qui fonctionne ?
- [ ] Commandes Mattermost - [ ] Commandes Mattermost
Cependant, je pense avoir fait 50% du travail pour le pont Mattermost, il manque, je pense, une implémentation du websocket de la part Cependant, je pense avoir fait 50% du travail pour le pont Mattermost, il manque, je pense, une implémentation du websocket de la part
du [repsonsable de `mattermost_api`](https://github.com/Celeo). J'ai essayer de le faire moi-même mais pas réussi. du [responsable de `mattermost_api`](https://github.com/Celeo). J'ai essayé de le faire moi-même mais pas réussi.
# Exécution # Exécution
<div align="center"> <div align="center">

View file

@ -42,7 +42,7 @@ struct InformationsBot {
/// Implémentation pour utiliser facilement les valeurs de la structure /// Implémentation pour utiliser facilement les valeurs de la structure
/// Normalement, rien ne panique car si `start_discord` /// Normalement, rien ne panique car si `start_discord`
/// n'as pas encore été appellé on panique avant d'arriver ici. /// n'as pas encore été appelé, on panique avant d'arriver ici.
/// ///
/// On fait quand même le match pour être sûr. /// On fait quand même le match pour être sûr.
impl InformationsBot { impl InformationsBot {
@ -80,7 +80,7 @@ impl InformationsBot {
/// Récupère API, sinon panique /// Récupère API, sinon panique
/// ///
/// Question importante, je créer l'API dans `main.rs`, alors pourquoi je /// Question importante, je créer l'API dans `main.rs`, alors pourquoi je
/// n'ai pas utilisé cette api pour ce fichier ? Tout simplement parce que /// n'ai pas utilisé cet api pour ce fichier ? Tout simplement parce que
/// `mattermost_api::client::Mattermost` n'implémente pas le trait de Clone /// `mattermost_api::client::Mattermost` n'implémente pas le trait de Clone
/// impossible donc (pas de succès avec Mutex)... /// impossible donc (pas de succès avec Mutex)...
pub async fn recuperation_api(&self) -> mattermost_api::client::Mattermost { pub async fn recuperation_api(&self) -> mattermost_api::client::Mattermost {
@ -102,9 +102,9 @@ impl InformationsBot {
static mut _INFO: Option<InformationsBot> = None; static mut _INFO: Option<InformationsBot> = None;
/// Récupère les informations qui sont nécessaire à la communication avec Mattermost /// 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 /// Attention, on fait paniqué le programme si la valeur est vide, pour éviter
/// ça, il faut appeller cette fonction seulement quand `start_discord` /// ça, il faut appeler cette fonction seulement quand `start_discord`
/// a été appellé car c'est elle qui ajoute le préfixe à `_INFO` /// a été appelé 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
@ -140,7 +140,7 @@ impl EventHandler for Handler {
// Gestion erreur lors de l'envoie de la réponse // Gestion erreur lors de l'envoie de la réponse
erreur::affiche_message_erreur(&format!("Erreur d'envoie de message : {:?}", err)); erreur::affiche_message_erreur(&format!("Erreur d'envoie de message : {:?}", err));
} }
// Ici on peut rajouter des `if` pour rajouter des commandes... // Ici on peut rajouter des `if` pour ajouter des commandes...
} 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. */
@ -148,9 +148,9 @@ impl EventHandler for Handler {
} }
} }
// Fonction appellé quand le bot est lancé et connecté // Fonction appelé quand le bot est lancé et connecté
async fn ready(&self, _: Context, _: Ready) { async fn ready(&self, _: Context, _: Ready) {
println!("Écoute les évènements Discord..."); println!("Écoute les événements Discord...");
} }
} }

View file

@ -44,7 +44,7 @@ async fn main() {
match env::var("PSEUDO") { match env::var("PSEUDO") {
Ok(string) => { Ok(string) => {
if token_recuperer { if token_recuperer {
panic!("{}", erreur::message_erreur("Tu as déjà choisie un token, vous ne pouvez pas aussi avoir définie un pseudo.")); panic!("{}", erreur::message_erreur("Tu as déjà choisie un token, vous ne pouvez pas aussi avoir définit un pseudo."));
} }
pseudo_ok = true; pseudo_ok = true;
pseudo = string; pseudo = string;
@ -63,7 +63,7 @@ async fn main() {
match env::var("MOT_DE_PASSE") { match env::var("MOT_DE_PASSE") {
Ok(string) => { Ok(string) => {
if token_recuperer { if token_recuperer {
panic!("{}", erreur::message_erreur("Tu as déjà choisie un token, vous ne pouvez pas aussi avoir définie un mot de passe.")); panic!("{}", erreur::message_erreur("Tu as déjà choisie un token, vous ne pouvez pas aussi avoir définit un mot de passe."));
} }
mot_de_passe = string; mot_de_passe = string;
} }
@ -72,7 +72,7 @@ async fn main() {
panic!( panic!(
"{}", "{}",
erreur::message_erreur( erreur::message_erreur(
"Tu as renseigné un pseudo mais pas de mot de passe dans le fichier .env" "Tu as renseigner un pseudo mais pas de mot de passe dans le fichier .env"
) )
); );
} }
@ -106,7 +106,7 @@ async fn main() {
// On affiche les infos d'une team // On affiche les infos d'une team
mattermost::team_info(&api, &equipe).await; mattermost::team_info(&api, &equipe).await;
// Tâche en paralèlle // Tâche en parallèle
mattermost::start_mattermost(mattermost::ConnectionInfoWebsocket { mattermost::start_mattermost(mattermost::ConnectionInfoWebsocket {
api, api,
token: token_mattermost.clone(), /* , prefix */ token: token_mattermost.clone(), /* , prefix */

View file

@ -146,7 +146,7 @@ pub async fn get_channel_info(
} }
/// Récupère l'ID du salon renseigné grâce à son nom en faisant une requête à l'API de Mattermost /// Récupère l'ID du salon renseigné grâce à son nom en faisant une requête à l'API de Mattermost
#[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilises le code en dessous... #[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilise le code en dessous...
pub async fn channel_id_by_name(api: &mattermost_api::client::Mattermost, salon: String) -> String { pub async fn channel_id_by_name(api: &mattermost_api::client::Mattermost, salon: String) -> String {
println!("\nRécupération de l'ID du salon {}...", salon); println!("\nRécupération de l'ID du salon {}...", salon);
match get_channel_info(api).await { match get_channel_info(api).await {
@ -175,7 +175,7 @@ pub async fn channel_id_by_name(api: &mattermost_api::client::Mattermost, salon:
} }
/// Affiche les informations complète sur une équipe /// Affiche les informations complète sur une équipe
#[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilises le code en dessous... #[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilise le code en dessous...
pub async fn team_info(api: &mattermost_api::client::Mattermost, equipe: &str) { pub async fn team_info(api: &mattermost_api::client::Mattermost, equipe: &str) {
println!("\nTentative de récupération de l'équipe {}...", equipe); println!("\nTentative de récupération de l'équipe {}...", equipe);
match api.get_team_info(equipe).await { match api.get_team_info(equipe).await {
@ -214,13 +214,13 @@ pub async fn connect_websocket(
} }
/// Lance le bot Mattermost /// Lance le bot Mattermost
#[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilises le code en dessous... #[allow(dead_code)] // je comprends pas pourquoi j'ai besoin de mettre ça, parce que j'utilise le code en dessous...
pub async fn start_mattermost(connection: ConnectionInfoWebsocket) { pub async fn start_mattermost(connection: ConnectionInfoWebsocket) {
match connect_websocket(&connection.api, &connection.token).await { match connect_websocket(&connection.api, &connection.token).await {
Ok(res) => { Ok(res) => {
/* Pour l'instant ici on a reçois un string donc on l'affiche (Result<String, ApiError>) mais /* Pour l'instant ici on a reçois un string donc on l'affiche (Result<String, ApiError>) mais
* à l'avenir normalement ici on bloque le thread principale (ou on laisse * à l'avenir normalement ici on bloque le thread principale (ou on laisse
* le bot discord le bloqué et ici ça s'execute en parallèle au bot discord) * le bot discord le bloqué et ici ça s'écute en parallèle au bot discord)
* et on récupère toutes les informations dont on a besoin, c'est à dire les * et on récupère toutes les informations dont on a besoin, c'est à dire les
* messages envoyés. */ * messages envoyés. */
println!("{}", res); println!("{}", res);
@ -237,7 +237,7 @@ pub async fn start_mattermost(connection: ConnectionInfoWebsocket) {
dans la librarie que j'utilises (mon issue : https://github.com/Celeo/mattermost_api/issues/1) dans la librarie que j'utilises (mon issue : https://github.com/Celeo/mattermost_api/issues/1)
Cependant je pense que c'est quand même prévu à l'avenir : https://github.com/Celeo/mattermost_api/blob/master/src/client.rs#L185 Cependant je pense que c'est quand même prévu à l'avenir : https://github.com/Celeo/mattermost_api/blob/master/src/client.rs#L185
En attendant, utiliser un websocket rend tout plus simple, on récupère tout les evenements qu'on reçois, on traite les messages En attendant, utiliser un websocket rend tout plus simple, on récupère tout les événements qu'on reçoit, on traite les messages
et si un utilisateur demande une commande on envoie un message en réponse (en théorie). et si un utilisateur demande une commande on envoie un message en réponse (en théorie).
-> Appel de la connexion au websocket donne une erreur HTTP400 malheureusement -> Appel de la connexion au websocket donne une erreur HTTP400 malheureusement
@ -254,5 +254,5 @@ pub async fn start_mattermost(connection: ConnectionInfoWebsocket) {
-> S'il y en a une qui n'est plus présente, on la retire -> S'il y en a une qui n'est plus présente, on la retire
-> https://api.mattermost.com/#operation/DeleteCommand -> https://api.mattermost.com/#operation/DeleteCommand
- Les commandes font une requête, doit on faire tourner un serveur web en local ? - Les commandes font une requête, doit-on faire tourner un serveur web en local ?
*/ */