diff --git a/src/telegram/commands/answer.rs b/src/telegram/commands/answer.rs new file mode 100644 index 00000000..86ef9234 --- /dev/null +++ b/src/telegram/commands/answer.rs @@ -0,0 +1,124 @@ +use std::hash::{Hash, Hasher}; +use anyhow::{Context}; +use chrono::Datelike; +use rand::SeedableRng; +use rand::seq::SliceRandom; +use teloxide::Bot; +use teloxide::payloads::SendMessageSetters; +use teloxide::prelude::{Message, Requester}; +use crate::telegram::commands::{CommandResult}; + +// Cerchiamo di tenere bilanciate le tre colonne, o almeno le prime due. +// Se avete un'idea ma metterebbe troppe opzioni in un'unica categoria, mettetela sotto commento. +const ANSWERS: [&str; 60] = [ + // risposte "sΓ¬": 20 + "πŸ”΅ SΓ¬.", + "πŸ”΅ Decisamente sΓ¬!", + "πŸ”΅ Uhm, secondo me sΓ¬.", + "πŸ”΅ SΓ¬! SΓ¬! SÌ!", + "πŸ”΅ Yup.", + "πŸ”΅ Direi proprio di sΓ¬.", + "πŸ”΅ Assolutamente sΓ¬.", + "πŸ”΅ Ma certo!", + "πŸ”΅ Esatto!", + "πŸ”΅ Senz'altro!", + "πŸ”΅ Ovviamente.", + "πŸ”΅ Questa domanda ha risposta affermativa.", + "πŸ”΅ Hell yeah.", + "πŸ”΅ YES! YES! YES!", + "πŸ”΅ yusssssss", + "πŸ”΅ Non vedo perchΓ¨ no", + "πŸ”΅ Ha senso, ha perfettamente senso, nulla da obiettare, ha senso.", + "πŸ”΅ Yos!", + "πŸ”΅ SΓ¬, ma tienilo segreto...", + "πŸ”΅ [RADIO] Affermativo.", + + // risposte "no": 20 + "❌ No.", + "❌ Decisamente no!", + "❌ Uhm, secondo me sΓ¬. No, aspetta, ci ho ripensato. È un no.", + "❌ No, no, e ancora NO!", + "❌ Nope.", + "❌ Direi proprio di no.", + "❌ Assolutamente no.", + "❌ Certo che no!", + "❌ Neanche per idea!", + "❌ Neanche per sogno!", + "❌ Niente affatto!", + "❌ Questa domanda ha risposta negativa.", + "❌ Hell no.", + "❌ NO! NO! NO!", + "❌ lolno", + "❌ NEIN NEIN NEIN NEIN", + "❌ Delet dis", + "❌ Nopety nope!", + "❌ No, ma tienilo segreto.", + "❌ [RADIO] Negativo.", + + // risposte "boh": 20 + "❔ Boh.", + "❔ E io che ne so?!", + "❔ Non so proprio rispondere.", + "❔ Non lo so...", + "❔ Mi avvalgo della facoltΓ  di non rispondere.", + "❔ Non parlerΓ² senza il mio avvocato!", + "❔ Dunno.", + "❔ PerchΓ© lo chiedi a me?", + "❔ Ah, non lo so io!", + r"❔ Β―\_(ツ)_/Β―", + "❔ No idea.", + "❔ Dunno.", + "❔ Boooooh!", + "❔ Non ne ho la piΓΉ pallida idea.", + "❔ No comment.", + "❔ maibi", + "❔ maibi not", + "❔ idk dude", + "❔ Non mi Γ¨ permesso condividere questa informazione.", + "❔ [RADIO] Mantengo la posizione.", +]; + +struct FortuneKey { + now: chrono::NaiveDate, +} + +impl Hash for FortuneKey { + fn hash(&self, state: &mut H) { + let now: i32 = self.today.num_days_from_ce(); + + state.write_i32(now); + } +} + +pub async fn handler(bot: &Bot, message: &Message) -> CommandResult { + let now = chrono::Local::now().date_naive(); + + let key = FortuneKey {now}; + + let mut hasher = std::hash::DefaultHasher::new(); + key.hash(&mut hasher); + let hash = hasher.finish() + .to_le_bytes() + .into_iter() + .cycle() + .take(32) + .collect::>() + .try_into(); + if hash.is_err() { + anyhow::bail!("Non Γ¨ stato possibile determinare una risposta."); + } + let hash = hash.unwrap(); + + let mut rng = rand::rngs::SmallRng::from_seed(hash); + + let answer = ANSWERS.choose(&mut rng) + .context("Non Γ¨ stato possibile selezionare una risposta.")?; + + let _reply = bot + .send_message(message.chat.id, answer.to_string()) + .reply_to_message_id(message.id) + .await + .context("Non Γ¨ stato possibile inviare la risposta.")?; + + Ok(()) +} \ No newline at end of file diff --git a/src/telegram/commands/mod.rs b/src/telegram/commands/mod.rs index 45282d56..c84cf703 100644 --- a/src/telegram/commands/mod.rs +++ b/src/telegram/commands/mod.rs @@ -15,6 +15,7 @@ mod fortune; mod echo; mod help; mod whoami; +mod answer; #[derive(Debug, Clone, PartialEq, Eq, BotCommands)] #[command(rename_rule = "lowercase")] @@ -29,6 +30,8 @@ pub(self) enum Command { Echo(String), #[command(description = "Controlla a che account RYG Γ¨ associato il tuo account Telegram.")] WhoAmI, + #[command(description = "Rispondi ad una domanda.")] + Answer(String), } async fn handle_command(bot: Bot, command: Command, message: Message) -> CommandResult { @@ -43,6 +46,7 @@ async fn handle_command(bot: Bot, command: Command, message: Message) -> Command Command::Fortune => fortune::handler(&bot, &message).await, Command::Echo(text) => echo::handler(&bot, &message, &text).await, Command::WhoAmI => whoami::handler(&bot, &message).await, + Command::Answer(question) => answer::handler(&bot, &message).await, }; if result.is_ok() {