stat_summoner/module/askingforflex/
utils.rs1use 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
9pub 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
55pub 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
68pub async fn create_flex_embed(
70 author: &str,
71 modal_data: &FlexAskingModal,
72 collection_emojis: Collection<EmojiId>,
73) -> Result<CreateEmbed, Error> {
74 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}