stat_summoner/module/askingforflex/
utils.rs

1use crate::embed::{create_embed_error, schedule_message_deletion};
2use crate::models::data::{Data, EmojiId};
3use crate::models::error::Error;
4use crate::models::modal::FlexAskingModal;
5use mongodb::Collection;
6use poise::serenity_prelude::{CreateEmbed, Mentionable, Role, RoleId};
7use std::collections::HashMap;
8
9/// Valide le format de l'heure saisie dans le modal.
10/// Si le format est incorrect, envoie un message d'erreur et programme sa suppression.
11/// Retourne `Some(FlexAskingModal)` avec l'heure validée ou `None` en cas d'erreur.
12pub async fn parse_flex_modal(
13    ctx: poise::ApplicationContext<'_, Data, Error>,
14    modal: Option<FlexAskingModal>,
15) -> Option<FlexAskingModal> {
16    if let Some(data) = modal {
17        let time = data.starting_hour.trim();
18        if time.len() != 5 || time.chars().nth(2) != Some(':') {
19            let error_message = "Invalid time format. Please use HH:MM format.";
20            if let Ok(reply) = ctx.send(create_embed_error(&error_message)).await {
21                let _ = schedule_message_deletion(reply, ctx).await;
22            }
23            return None;
24        }
25        let hours: Result<u8, _> = time[..2].parse();
26        let minutes: Result<u8, _> = time[3..].parse();
27        if let (Ok(h), Ok(m)) = (hours, minutes) {
28            if h >= 24 || m >= 60 {
29                let error_message = "Invalid time format. Hours must be between 00 and 23, and minutes between 00 and 59.";
30                if let Ok(reply) = ctx.send(create_embed_error(&error_message)).await {
31                    let _ = schedule_message_deletion(reply, ctx).await;
32                }
33                return None;
34            }
35        } else {
36            let error_message = "Invalid time format. Please use HH:MM format.";
37            if let Ok(reply) = ctx.send(create_embed_error(&error_message)).await {
38                let _ = schedule_message_deletion(reply, ctx).await;
39            }
40            return None;
41        }
42        Some(FlexAskingModal {
43            starting_hour: time.to_string(),
44            people_to_ask_by_role: data.people_to_ask_by_role.replace("@", ""),
45        })
46    } else {
47        let error_message = "Modal data not found.";
48        if let Ok(reply) = ctx.send(create_embed_error(&error_message)).await {
49            let _ = schedule_message_deletion(reply, ctx).await;
50        }
51        None
52    }
53}
54
55/// Génère la mention du rôle à partir du nom donné et de la liste des rôles du serveur.
56pub fn compute_role_mention(guild_roles: Option<HashMap<RoleId, Role>>, role_name: &str) -> String {
57    if let Some(roles) = guild_roles {
58        roles
59            .values()
60            .find(|role| role.name.to_lowercase() == role_name.to_lowercase())
61            .map(|role| role.id.mention().to_string())
62            .unwrap_or_else(|| format!("@{}", role_name))
63    } else {
64        format!("@{}", role_name)
65    }
66}
67
68/// Construit l'embed pour la demande de flex game en récupérant les émojis via la collection MongoDB.
69pub async fn create_flex_embed(
70    author: &str,
71    modal_data: &FlexAskingModal,
72    collection_emojis: Collection<EmojiId>,
73) -> Result<CreateEmbed, Error> {
74    // On suppose que la fonction `get_emoji` est déjà définie dans utils.
75    let emoji_top: String =
76        crate::utils::get_emoji(collection_emojis.clone(), "position", "TOP").await?;
77    let emoji_jungle: String =
78        crate::utils::get_emoji(collection_emojis.clone(), "position", "JUNGLE").await?;
79    let emoji_mid: String =
80        crate::utils::get_emoji(collection_emojis.clone(), "position", "MIDDLE").await?;
81    let emoji_adc: String =
82        crate::utils::get_emoji(collection_emojis.clone(), "position", "BOTTOM").await?;
83    let emoji_support: String =
84        crate::utils::get_emoji(collection_emojis.clone(), "position", "SUPPORT").await?;
85
86    Ok(CreateEmbed::default()
87        .color(0x00ff00)
88        .title("Flex Game Request")
89        .description("A player is looking for a flex team!")
90        .field("Requested by", author, true)
91        .field("Start Time", &modal_data.starting_hour, true)
92        .field(format!("{}:", emoji_top), "TBD", false)
93        .field(format!("{}:", emoji_jungle), "TBD", false)
94        .field(format!("{}:", emoji_mid), "TBD", false)
95        .field(format!("{}:", emoji_adc), "TBD", false)
96        .field(format!("{}:", emoji_support), "TBD", false)
97        .thumbnail("https://i.postimg.cc/9fKf2tYp/Logo.png"))
98}