diff --git a/Cargo.lock b/Cargo.lock index fb2f5eed..6b03ba82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,7 +300,7 @@ checksum = "0892a17df262a24294c382f0d5997571006e7a4348b4327557c4ff1cd4a8bccc" dependencies = [ "darling 0.20.9", "either", - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.68", @@ -527,6 +527,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1385,6 +1391,7 @@ dependencies = [ "serde_json", "serde_with_macros", "teloxide-core", + "teloxide-macros", "thiserror", "tokio", "tokio-stream", @@ -1423,6 +1430,18 @@ dependencies = [ "uuid", ] +[[package]] +name = "teloxide-macros" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f1d653b093dba5e44cada57a516f572167df37b8a619443e59c8c517bb6d804" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "tempfile" version = "3.10.1" diff --git a/Cargo.toml b/Cargo.toml index 1791226e..9953a449 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,5 +11,5 @@ log = "0.4.22" micronfig = "0.3.0" pretty_env_logger = "0.5.0" rand = { version = "0.8.5", features = ["small_rng"] } -teloxide = { version = "0.12.2", features = ["ctrlc_handler", "native-tls"], default-features = false } +teloxide = { version = "0.12.2", features = ["ctrlc_handler", "native-tls", "macros"], default-features = false } tokio = { version = "1.38.0", features = ["macros", "rt-multi-thread"] } diff --git a/src/telegram/commands/fortune.rs b/src/telegram/commands/fortune.rs index 31398527..e53f969d 100644 --- a/src/telegram/commands/fortune.rs +++ b/src/telegram/commands/fortune.rs @@ -6,7 +6,7 @@ use rand::seq::SliceRandom; use teloxide::Bot; use teloxide::payloads::SendMessageSetters; use teloxide::prelude::{Message, Requester}; -use crate::telegram::commands::{CommandDialogue, CommandResult}; +use crate::telegram::commands::{CommandResult}; // Tutte le fortune devono essere positive, o almeno neutrali, per poter essere aggiunte. const FORTUNES: [&str; 160] = [ @@ -187,7 +187,7 @@ impl Hash for FortuneKey { } } -pub(super) async fn handler(bot: Bot, _dialogue: CommandDialogue, message: Message) -> CommandResult { +pub async fn handler(bot: Bot, message: Message) -> CommandResult { let today = chrono::Local::now().date_naive(); let author = message.from() diff --git a/src/telegram/commands/mod.rs b/src/telegram/commands/mod.rs index 32f6ed68..edad6154 100644 --- a/src/telegram/commands/mod.rs +++ b/src/telegram/commands/mod.rs @@ -1,53 +1,62 @@ -use anyhow::Error; +// See the following link for an example of how to use this file: +// https://github.com/teloxide/teloxide/blob/master/crates/teloxide/examples/dispatching_features.rs + +use std::sync::Arc; +use anyhow::{Context, Error}; use teloxide::{Bot, dptree}; use teloxide::dispatching::{DefaultKey, Dispatcher, HandlerExt, UpdateFilterExt}; -use teloxide::dispatching::dialogue::{InMemStorage, TraceStorage}; +use teloxide::dptree::entry; +use teloxide::payloads::SendMessageSetters; +use teloxide::requests::Requester; use teloxide::types::{Message, Update}; +use teloxide::utils::command::BotCommands; mod start; mod fortune; -#[derive(Debug, Clone, Default)] -enum State { - #[default] - Default, +#[derive(Debug, Clone, BotCommands)] +#[command(rename_rule = "lowercase")] +enum Command { + Start, + Fortune, } -type CommandDialogue = teloxide::dispatching::dialogue::Dialogue>>; -type CommandResult = anyhow::Result<()>; +async fn handle_command(bot: Bot, command: Command, message: Message) -> CommandResult { + log::trace!("Received command: {command:?}"); -async fn detect_command(bot: Bot, dialogue: CommandDialogue, message: Message) -> CommandResult { - let text = message.text(); - if text.is_none() { - // Ignore non-textual messages - return Ok(()) - } - let text = text.unwrap(); - - match text { - "/start" => start::handler(bot, dialogue, message).await, - "/fortune" => fortune::handler(bot, dialogue, message).await, - _ => anyhow::bail!("Unknown command"), + match command { + Command::Start => start::handler(bot, message).await, + Command::Fortune => fortune::handler(bot, message).await, } } -pub(super) fn dispatcher(bot: Bot) -> Dispatcher { +async fn unknown_command(bot: Bot, message: Message) -> CommandResult { + log::trace!("Received an unknown command."); + + bot.send_message(message.chat.id, "⚠️ Comando sconosciuto.") + .reply_to_message_id(message.id) + .await + .context("Failed to send message")?; + + Ok(()) +} + +pub fn dispatcher(bot: Bot) -> Dispatcher { Dispatcher::builder( bot, Update::filter_message() - .enter_dialogue::>, State>() .branch( - dptree::case![State::Default] - .endpoint(detect_command) + entry() + .filter_command::() + .endpoint(handle_command) ) + .endpoint(unknown_command) ) .dependencies( - dptree::deps![ - TraceStorage::new( - InMemStorage::::new() - ) - ] + dptree::deps![] // No deps needed at the moment. ) .enable_ctrlc_handler() .build() } + +type CommandResult = anyhow::Result<()>; \ No newline at end of file diff --git a/src/telegram/commands/start.rs b/src/telegram/commands/start.rs index a4f67ecf..e28de61a 100644 --- a/src/telegram/commands/start.rs +++ b/src/telegram/commands/start.rs @@ -3,9 +3,9 @@ use teloxide::Bot; use teloxide::payloads::SendMessageSetters; use teloxide::requests::Requester; use teloxide::types::{Message}; -use super::{CommandDialogue, CommandResult}; +use super::{CommandResult}; -pub(super) async fn handler(bot: Bot, _dialogue: CommandDialogue, message: Message) -> CommandResult { +pub async fn handler(bot: Bot, message: Message) -> CommandResult { let author = message.from() .context("Failed to get the user who sent the original message")?;