mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-28 22:14:19 +00:00
Add /fortune command and clean up code
This commit is contained in:
parent
26d385503e
commit
64c617c2ec
6 changed files with 267 additions and 755 deletions
795
Cargo.lock
generated
795
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -5,9 +5,11 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
|
chrono = "0.4.38"
|
||||||
diesel = { version = "2.2.1", features = ["postgres"] }
|
diesel = { version = "2.2.1", features = ["postgres"] }
|
||||||
log = "0.4.22"
|
log = "0.4.22"
|
||||||
micronfig = "0.3.0"
|
micronfig = "0.3.0"
|
||||||
pretty_env_logger = "0.5.0"
|
pretty_env_logger = "0.5.0"
|
||||||
teloxide = { version = "0.12.2", features = ["full"] }
|
rand = { version = "0.8.5", features = ["small_rng"] }
|
||||||
tokio = { version = "1.38.0", features = ["full"] }
|
teloxide = { version = "0.12.2", features = ["ctrlc_handler", "native-tls"], default-features = false }
|
||||||
|
tokio = { version = "1.38.0", features = ["macros", "rt-multi-thread"] }
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Result};
|
||||||
use teloxide::dispatching::HandlerExt;
|
|
||||||
|
|
||||||
pub(crate) mod database;
|
pub(crate) mod database;
|
||||||
mod telegram;
|
mod telegram;
|
||||||
|
|
204
src/telegram/commands/fortune.rs
Normal file
204
src/telegram/commands/fortune.rs
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
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::{CommandDialogue, CommandResult};
|
||||||
|
|
||||||
|
const FORTUNES: [&str; 140] = [
|
||||||
|
"😄 Oggi sarà una fantastica giornata!",
|
||||||
|
"😌 Oggi sarà una giornata molto chill e rilassante.",
|
||||||
|
"💰 Oggi sui tuoi alberi cresceranno più Stelline!",
|
||||||
|
"🍎 Oggi un unicorno ti lascerà la sua Blessed Apple!",
|
||||||
|
"📈 Oggi il tuo team in ranked sarà più amichevole e competente del solito!",
|
||||||
|
"🏝 Oggi potrai raggiungere l'Isola Miraggio!",
|
||||||
|
"🐱 Oggi vedrai più gatti del solito su Internet!",
|
||||||
|
"🐶 Oggi vedrai più cani del solito su Internet!",
|
||||||
|
"🐦 Oggi vedrai più uccelli del solito su Internet!",
|
||||||
|
"🐌 Oggi incontrerai una chiocciola sperduta!",
|
||||||
|
"🎁 Oggi i dispenser di regali in centro funzioneranno senza problemi!",
|
||||||
|
"🥕 Oggi il tuo raccolto avrà qualità Iridium Star!",
|
||||||
|
"🔴 Oggi troverai più oggetti di rarità rossa del solito!",
|
||||||
|
"✨ Oggi farai molti più multicast!",
|
||||||
|
"♦️ Oggi troverai una Leggendaria Dorata!",
|
||||||
|
"⭐️ Oggi la stella della RYG ti sembrerà un pochino più dritta!",
|
||||||
|
"⭐️ Oggi la stella della RYG ti sembrerà anche più storta del solito!",
|
||||||
|
"💎 Oggi i tuoi avversari non riusciranno a deflettere i tuoi Emerald Splash!",
|
||||||
|
"⬅️ Oggi le tue supercazzole prematureranno un po' più a sinistra!",
|
||||||
|
"➡️ Oggi le tue supercazzole prematureranno un po' più a destra!",
|
||||||
|
"🌅 Oggi sarà il giorno dopo ieri e il giorno prima di domani!",
|
||||||
|
"🤖 Oggi il Royal Bot ti dirà qualcosa di molto utile!",
|
||||||
|
"🏠 Oggi qualcuno si autoinviterà a casa tua!",
|
||||||
|
"📵 Oggi passerai una bella giornata tranquilla senza che nessuno ti chiami!",
|
||||||
|
"🕸 Oggi cadrai trappola di una ragnatela! O ti arriverà in faccia.",
|
||||||
|
"🔮 Oggi chiederai a @royalgamesbot di dirti la tua /fortune!",
|
||||||
|
"👽 Oggi incontrerai gli UFI!!!1!!uno!",
|
||||||
|
"🦾 Oggi uno scienziato pazzo ti proporrà di sostituire il tuo braccio con un braccio-razzo meccanico!",
|
||||||
|
"🕵️ Oggi una spia in incognito ti chiederà se hai mai visto the Emoji Movie!",
|
||||||
|
"🍕 Oggi mangerai una margherita doppio pomodoro!",
|
||||||
|
"🍰 Oggi mangerai una torta al gusto di torta!",
|
||||||
|
"🥇 Oggi vincerai qualcosa!",
|
||||||
|
"🏴☠️ Oggi salperai i sette mari con la tua ciurma pirata!",
|
||||||
|
"🕒 Oggi sarà ieri, e domani sarà oggi!",
|
||||||
|
"🔙 Oggi tornerai indietro nel tempo!",
|
||||||
|
"🚨 Oggi suonerà l'allarme della Velvet Room!",
|
||||||
|
"🏳️🌈 Oggi scoprirai l'esistenza di almeno un gender che non conoscevi!",
|
||||||
|
"🥴 Oggi ti dimenticherai come ci si siede!",
|
||||||
|
"👀 Oggi scoprirai di avere degli occhi!",
|
||||||
|
"🏹 Oggi ti verrà voglia di installare Arch Linux, ma cambierai idea molto in fretta!",
|
||||||
|
"🩲 Oggi annuncerai alla cv di essere in mutande!",
|
||||||
|
"👟 Oggi tua madre ti regalerà delle scarpe da corsa!",
|
||||||
|
"✨ Oggi troverai un Pokémon shiny!",
|
||||||
|
"👏 Oggi sarai felice, lo saprai e batterai le mani!",
|
||||||
|
"🦴 Oggi scoprirai di avere uno scheletro wholesome all'interno di te!",
|
||||||
|
"💳 Oggi riuscirai a fornire i tre numerini della tua carta di credito a John Wick!",
|
||||||
|
"🤔 Oggi smetterai finalmente di essere sus, in quanto sarai confermato dal villaggio!",
|
||||||
|
"🔮 Oggi pondererai intensamente la tua sfera!",
|
||||||
|
"🗳️ Oggi ci saranno le elezioni per un nuovo partito sul tuo pianeta!",
|
||||||
|
"🥓 Oggi avrai bacon illimitato e niente videogiochi!",
|
||||||
|
"🎮 Oggi avrai videogiochi, videogiochi illimitati e niente videogiochi!",
|
||||||
|
"🔫 Oggi troverai una pistola pearlescent!",
|
||||||
|
"🤖 Oggi ti chiederanno di pilotare un robot gigante!",
|
||||||
|
"💣 Oggi dovrai continuare a parlare, o esploderai!",
|
||||||
|
"🤌 Oggi ti sentirai particolarmente italiano, e gesticolerai più del solito!",
|
||||||
|
"🪵 Oggi ti servirà legname!",
|
||||||
|
"☄️ Oggi avvisterai una cometa, rischiando di inciampare!",
|
||||||
|
"🥅 Oggi farai goal!",
|
||||||
|
"🧿 Oggi sarai protetto dagli spiriti maligni che attraversano le pareti!",
|
||||||
|
"💰 Oggi è una buona giornata per il capitalismo!",
|
||||||
|
"⚒️ Oggi è una buona giornata per il comunismo!",
|
||||||
|
"🐰 Oggi inizia la stagione di caccia dei Big Chungus!",
|
||||||
|
"🐸 Oggi incontrerai una rana-cavaliere!",
|
||||||
|
"⚔️ Oggi un cyborg-samurai ti cederà la sua katana RGB!",
|
||||||
|
"🥪 Oggi mangerai un sandvich!",
|
||||||
|
"👻 Oggi farai amicizia con Re Boo!",
|
||||||
|
"🫀 Oggi un necromante ti ruberà il cuore, e lo farà battere a ritmo!",
|
||||||
|
"🦊 Oggi volerai su un Arwing in compagnia di un rinomato mercenario!",
|
||||||
|
"🦋 Oggi una tua particolare azione avrà conseguenze, ma potrai tornare indietro nel tempo e correggerla!",
|
||||||
|
"🐳 Oggi una balena trasporterà un container per te!",
|
||||||
|
"🔥 Oggi sarà una giornata di fuoco!",
|
||||||
|
"🥕 Oggi sostituirai il naso a un pupazzo di neve!",
|
||||||
|
"🍔 Oggi mangerai il tuo cibo preferito: il sushi!",
|
||||||
|
"🍭 Oggi un lecca-lecca ti sbloccherà poteri inimmaginabili!",
|
||||||
|
"🧩 Oggi andrai a caccia di Jiggy!",
|
||||||
|
"🚜 Oggi piraterai un trattore!",
|
||||||
|
"🧭 Oggi ti perderai nei Lost Woods!",
|
||||||
|
"⚙️ Oggi aumenterai la produzione di Iron Gear!",
|
||||||
|
"🔫 Oggi attiverai il tuo Devil Trigger!",
|
||||||
|
"🍺 Oggi servirai un drink con più Karmotrine!",
|
||||||
|
"🚽 Oggi sperimenterai la leggendaria Terra Toilet!",
|
||||||
|
"🚰 Oggi sarai più idratato del solito!",
|
||||||
|
"🔑 Oggi troverai la chiave di tutte le porte!",
|
||||||
|
"📎 Oggi incontrerai Clippy!",
|
||||||
|
"🌪 Oggi un tornado girerà in senso orario!",
|
||||||
|
"🍄 Oggi diventerai Super grazie ad un fungo!",
|
||||||
|
"👑 Oggi preparerai la colazione per Re Artù!",
|
||||||
|
"🍌 Oggi metterai una banana in microonde!",
|
||||||
|
"❤️🔥 Oggi scapperai dal Tartaro!",
|
||||||
|
"♻️ Oggi, riciclando della Silt, troverai un dinosauro!",
|
||||||
|
"🏧 Oggi piazzerai un jammer su un bancomat, estraendone i contenuti!",
|
||||||
|
"🚼 Oggi ti chiederai il significato di questa emoji!",
|
||||||
|
"🤡 Oggi dovrai interrogare il clown di un circo!",
|
||||||
|
"👣 Oggi riceverai un marchio che ti proteggerà dai vampiri!",
|
||||||
|
"🎊 Oggi dalle Sfere Festa non uscirà nessuna Bob-omba!",
|
||||||
|
"🧲 Oggi piazzerai un magnete per attirare colpi di bazooka!",
|
||||||
|
"㊗️ Oggi qualcuno ti farà le sue congratulazioni!",
|
||||||
|
"⚛️ Oggi sfrutterai appieno l'energia dell'atomo!",
|
||||||
|
"🈁 Oggi ti troverai qui!",
|
||||||
|
"💮 Oggi i tuoi esami andranno alla perfezione!",
|
||||||
|
"☕️ Oggi berrai un espresso d-d-doppio!?",
|
||||||
|
"🐝 Oggi farai quello che fanno le api sulle foglie!",
|
||||||
|
"🎰 Oggi vincerai il Jackpot di Francoforte 1!",
|
||||||
|
"🧱 Oggi rifiuterai un en passant!",
|
||||||
|
"🪓 Oggi perderai la tua ascia, ma la riuscirai facilmente a ritrovare, in quanto starà urlando il tuo nome!",
|
||||||
|
"🕳 Oggi cadrai in una Trappola!",
|
||||||
|
"⛏ Oggi scaverai degli smeraldi!",
|
||||||
|
"🩹 Oggi rigenererai tutta la tua vita con un singolo cerotto!",
|
||||||
|
"📈 Oggi i tuoi affari andranno alla grande!",
|
||||||
|
"📉 Oggi avrai la possibilità di comprare qualche cosa a prezzo scontato!",
|
||||||
|
"🅱️ Oggi la seconda lettera dell'alfabeto ti porterà più fortuna del solito!",
|
||||||
|
"🧚 Oggi ti chiederai coraggiosamente dove vola la fatina!",
|
||||||
|
"⚔️ Oggi ridurrai dei Corpus a fettine!",
|
||||||
|
"🕯 Oggi troverai coraggio nella luce della tua torcia!",
|
||||||
|
"🎺 Oggi uno scheletro suonerà una trombetta!",
|
||||||
|
"🌋 Oggi getterai un anello in un vulcano!",
|
||||||
|
"🧶 Oggi comprerai della lana da fare l'uncinetto!",
|
||||||
|
"🐰 Oggi un coniglio ti farà girare la sua ruota!",
|
||||||
|
"🧛 Oggi scoprirai finalmente come fa il vampiro ancora a sopravvivere!",
|
||||||
|
"👽 Oggi sarai scelto come comandante di una squadra per la difesa planetaria!",
|
||||||
|
"🐝 Oggi b!",
|
||||||
|
"🎸 Oggi le suonerai a qualcuno!",
|
||||||
|
"🧬 Oggi la tua specie si evolverà in un altra con delle bocche sulle mani!",
|
||||||
|
"🅰️ Oggi premerai un pulsante a metà!",
|
||||||
|
"📻 Oggi sarà il tuo turno di usare la Boombox!",
|
||||||
|
"🐡 Oggi riaccenderai un faro sottomarino!",
|
||||||
|
"🎄 Oggi addobberai un albero!",
|
||||||
|
"🪲 Oggi il tuo insetto metallico sconfiggerà i suoi nemici a suon di musica!",
|
||||||
|
"🀄️ Oggi vincerai a Mahjong!",
|
||||||
|
"🃏 Oggi vincerai a solitario!",
|
||||||
|
"🛗 Oggi l'ascensore ti porterà sulla superficie di Auriga!",
|
||||||
|
"🦷 Oggi quattro denti dorati verranno messi sulla bilancia a tuo favore!",
|
||||||
|
"✨ Oggi riceverai una /fortune mai vista prima!",
|
||||||
|
"🐷 Oggi riceverai una chiamata da un maialino!",
|
||||||
|
"🎆 Oggi vedrai dei fuochi artificiali!",
|
||||||
|
"🗽 Oggi avrai più libertà del solito!",
|
||||||
|
"🎳 Oggi tuo cugino ti inviterà a giocare a bowling!",
|
||||||
|
"⛎ Oggi romperai la quarta parete!",
|
||||||
|
"🛕 Oggi raggiungerai la cima di un Pantheon!",
|
||||||
|
"🍽 Oggi la tua fabbrica produrrà più Iron Plate del normale!",
|
||||||
|
];
|
||||||
|
|
||||||
|
struct FortuneKey {
|
||||||
|
today: chrono::NaiveDate,
|
||||||
|
author_id: teloxide::types::UserId
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hash for FortuneKey {
|
||||||
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
let days: i32 = self.today.num_days_from_ce();
|
||||||
|
let id: u64 = self.author_id.0;
|
||||||
|
|
||||||
|
state.write_i32(days);
|
||||||
|
state.write_u64(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) async fn handler(bot: Bot, _dialogue: CommandDialogue, message: Message) -> CommandResult {
|
||||||
|
let today = chrono::Local::now().date_naive();
|
||||||
|
|
||||||
|
let author = message.from()
|
||||||
|
.context("Failed to get the user who sent the original message")?;
|
||||||
|
let author_id = author.id;
|
||||||
|
|
||||||
|
let key = FortuneKey {today, author_id};
|
||||||
|
|
||||||
|
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!("Failed to select random seed");
|
||||||
|
}
|
||||||
|
let hash = hash.unwrap();
|
||||||
|
|
||||||
|
let mut rng = rand::rngs::SmallRng::from_seed(hash);
|
||||||
|
|
||||||
|
let fortune = FORTUNES.choose(&mut rng)
|
||||||
|
.context("Failed to choose a fortune")?;
|
||||||
|
|
||||||
|
let _reply = bot
|
||||||
|
.send_message(message.chat.id, fortune.to_string())
|
||||||
|
.reply_to_message_id(message.id)
|
||||||
|
.await
|
||||||
|
.context("Failed to send message")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -1,12 +1,11 @@
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
use diesel::PgConnection;
|
|
||||||
use teloxide::{Bot, dptree};
|
use teloxide::{Bot, dptree};
|
||||||
use teloxide::dispatching::{DefaultKey, Dispatcher, HandlerExt, UpdateFilterExt};
|
use teloxide::dispatching::{DefaultKey, Dispatcher, HandlerExt, UpdateFilterExt};
|
||||||
use teloxide::dispatching::dialogue::{InMemStorage, TraceStorage};
|
use teloxide::dispatching::dialogue::{InMemStorage, TraceStorage};
|
||||||
use teloxide::types::{Message, Update};
|
use teloxide::types::{Message, Update};
|
||||||
use teloxide::utils::command::BotCommands;
|
|
||||||
|
|
||||||
mod start;
|
mod start;
|
||||||
|
mod fortune;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
enum State {
|
enum State {
|
||||||
|
@ -14,10 +13,10 @@ enum State {
|
||||||
Default,
|
Default,
|
||||||
}
|
}
|
||||||
|
|
||||||
type Dialogue = teloxide::dispatching::dialogue::Dialogue<State, TraceStorage<InMemStorage<State>>>;
|
type CommandDialogue = teloxide::dispatching::dialogue::Dialogue<State, TraceStorage<InMemStorage<State>>>;
|
||||||
type Result = anyhow::Result<()>;
|
type CommandResult = anyhow::Result<()>;
|
||||||
|
|
||||||
async fn detect_command(bot: Bot, dialogue: Dialogue, message: Message) -> Result {
|
async fn detect_command(bot: Bot, dialogue: CommandDialogue, message: Message) -> CommandResult {
|
||||||
let text = message.text();
|
let text = message.text();
|
||||||
if text.is_none() {
|
if text.is_none() {
|
||||||
// Ignore non-textual messages
|
// Ignore non-textual messages
|
||||||
|
@ -27,6 +26,7 @@ async fn detect_command(bot: Bot, dialogue: Dialogue, message: Message) -> Resul
|
||||||
|
|
||||||
match text {
|
match text {
|
||||||
"/start" => start::handler(bot, dialogue, message).await,
|
"/start" => start::handler(bot, dialogue, message).await,
|
||||||
|
"/fortune" => fortune::handler(bot, dialogue, message).await,
|
||||||
_ => anyhow::bail!("Unknown command"),
|
_ => anyhow::bail!("Unknown command"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,9 @@ use teloxide::Bot;
|
||||||
use teloxide::payloads::SendMessageSetters;
|
use teloxide::payloads::SendMessageSetters;
|
||||||
use teloxide::requests::Requester;
|
use teloxide::requests::Requester;
|
||||||
use teloxide::types::{Message};
|
use teloxide::types::{Message};
|
||||||
use super::{Dialogue, Result};
|
use super::{CommandDialogue, CommandResult};
|
||||||
|
|
||||||
pub(super) async fn handler(bot: Bot, _dialogue: Dialogue, message: Message) -> Result {
|
pub(super) async fn handler(bot: Bot, _dialogue: CommandDialogue, message: Message) -> CommandResult {
|
||||||
let author = message.from()
|
let author = message.from()
|
||||||
.context("Failed to get the user who sent the original message")?;
|
.context("Failed to get the user who sent the original message")?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue