mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-22 11:04:21 +00:00
⚙️ Prima versione comando Answer
This commit is contained in:
parent
ade4973fc4
commit
2db26854c9
2 changed files with 128 additions and 0 deletions
124
src/telegram/commands/answer.rs
Normal file
124
src/telegram/commands/answer.rs
Normal file
|
@ -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<H: Hasher>(&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::<Vec<u8>>()
|
||||||
|
.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(())
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ mod fortune;
|
||||||
mod echo;
|
mod echo;
|
||||||
mod help;
|
mod help;
|
||||||
mod whoami;
|
mod whoami;
|
||||||
|
mod answer;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, BotCommands)]
|
#[derive(Debug, Clone, PartialEq, Eq, BotCommands)]
|
||||||
#[command(rename_rule = "lowercase")]
|
#[command(rename_rule = "lowercase")]
|
||||||
|
@ -29,6 +30,8 @@ pub(self) enum Command {
|
||||||
Echo(String),
|
Echo(String),
|
||||||
#[command(description = "Controlla a che account RYG è associato il tuo account Telegram.")]
|
#[command(description = "Controlla a che account RYG è associato il tuo account Telegram.")]
|
||||||
WhoAmI,
|
WhoAmI,
|
||||||
|
#[command(description = "Rispondi ad una domanda.")]
|
||||||
|
Answer(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_command(bot: Bot, command: Command, message: Message) -> CommandResult {
|
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::Fortune => fortune::handler(&bot, &message).await,
|
||||||
Command::Echo(text) => echo::handler(&bot, &message, &text).await,
|
Command::Echo(text) => echo::handler(&bot, &message, &text).await,
|
||||||
Command::WhoAmI => whoami::handler(&bot, &message).await,
|
Command::WhoAmI => whoami::handler(&bot, &message).await,
|
||||||
|
Command::Answer(question) => answer::handler(&bot, &message).await,
|
||||||
};
|
};
|
||||||
|
|
||||||
if result.is_ok() {
|
if result.is_ok() {
|
||||||
|
|
Loading…
Reference in a new issue