From b11e5fdd1947a344bb180342c8b19251cfb98cca Mon Sep 17 00:00:00 2001 From: Hirrolot Date: Thu, 3 Feb 2022 03:36:53 +0600 Subject: [PATCH] Rewrite `examples/redis_remember.rs` & `examples/sqlite_remember.rs` --- examples/redis_remember.rs | 105 +++++++++++++++++++----------------- examples/sqlite_remember.rs | 103 ++++++++++++++++++----------------- 2 files changed, 111 insertions(+), 97 deletions(-) diff --git a/examples/redis_remember.rs b/examples/redis_remember.rs index d40b5cb4..fb4be912 100644 --- a/examples/redis_remember.rs +++ b/examples/redis_remember.rs @@ -1,74 +1,39 @@ use teloxide::{ dispatching2::dialogue::{serializer::Bincode, RedisStorage, Storage}, + macros::DialogueState, prelude2::*, RequestError, }; use thiserror::Error; -type MyDialogue = Dialogue>; -type StorageError = as Storage>::Error; +type MyDialogue = Dialogue>; +type StorageError = as Storage>::Error; #[derive(Debug, Error)] enum Error { #[error("error from Telegram: {0}")] TelegramError(#[from] RequestError), + #[error("error from storage: {0}")] StorageError(#[from] StorageError), } -#[derive(serde::Serialize, serde::Deserialize)] -pub enum DialogueState { +#[derive(DialogueState, Clone, serde::Serialize, serde::Deserialize)] +#[handler_out(anyhow::Result<()>)] +pub enum State { + #[handler(handle_start)] Start, - HaveNumber(i32), + + #[handler(handle_got_number)] + GotNumber(i32), } -impl Default for DialogueState { +impl Default for State { fn default() -> Self { Self::Start } } -async fn handle_message( - bot: AutoSend, - msg: Message, - dialogue: MyDialogue, -) -> Result<(), Error> { - match msg.text() { - None => { - bot.send_message(msg.chat.id, "Send me a text message.").await?; - } - Some(ans) => { - let state = dialogue.get_or_default().await?; - match state { - DialogueState::Start => { - if let Ok(number) = ans.parse() { - dialogue.update(DialogueState::HaveNumber(number)).await?; - bot.send_message( - msg.chat.id, - format!("Remembered number {}. Now use /get or /reset", number), - ) - .await?; - } else { - bot.send_message(msg.chat.id, "Please, send me a number").await?; - } - } - DialogueState::HaveNumber(num) => { - if ans.starts_with("/get") { - bot.send_message(msg.chat.id, format!("Here is your number: {}", num)) - .await?; - } else if ans.starts_with("/reset") { - dialogue.reset().await?; - bot.send_message(msg.chat.id, "Resetted number").await?; - } else { - bot.send_message(msg.chat.id, "Please, send /get or /reset").await?; - } - } - } - } - } - Ok(()) -} - #[tokio::main] async fn main() { let bot = Bot::from_env().auto_send(); @@ -79,8 +44,8 @@ async fn main() { let storage = RedisStorage::open("redis://127.0.0.1:6379", Bincode).await.unwrap(); let handler = Update::filter_message() - .add_dialogue::, DialogueState>() - .branch(dptree::endpoint(handle_message)); + .add_dialogue::, State>() + .dispatch_by::(); DispatcherBuilder::new(bot, handler) .dependencies(dptree::deps![storage]) @@ -88,3 +53,45 @@ async fn main() { .dispatch() .await; } + +async fn handle_start( + bot: AutoSend, + msg: Message, + dialogue: MyDialogue, +) -> anyhow::Result<()> { + match msg.text().unwrap().parse() { + Ok(number) => { + dialogue.update(State::GotNumber(number)).await?; + bot.send_message( + msg.chat.id, + format!("Remembered number {}. Now use /get or /reset", number), + ) + .await?; + } + _ => { + bot.send_message(msg.chat.id, "Please, send me a number").await?; + } + } + + Ok(()) +} + +async fn handle_got_number( + bot: AutoSend, + msg: Message, + dialogue: MyDialogue, + num: i32, +) -> anyhow::Result<()> { + let ans = msg.text().unwrap(); + + if ans.starts_with("/get") { + bot.send_message(msg.chat.id, format!("Here is your number: {}", num)).await?; + } else if ans.starts_with("/reset") { + dialogue.reset().await?; + bot.send_message(msg.chat.id, "Resetted number").await?; + } else { + bot.send_message(msg.chat.id, "Please, send /get or /reset").await?; + } + + Ok(()) +} diff --git a/examples/sqlite_remember.rs b/examples/sqlite_remember.rs index 477f1df3..9026534a 100644 --- a/examples/sqlite_remember.rs +++ b/examples/sqlite_remember.rs @@ -1,82 +1,47 @@ use teloxide::{ dispatching2::dialogue::{serializer::Json, SqliteStorage, Storage}, + macros::DialogueState, prelude2::*, RequestError, }; use thiserror::Error; -type MyDialogue = Dialogue>; -type StorageError = as Storage>::Error; +type MyDialogue = Dialogue>; +type StorageError = as Storage>::Error; #[derive(Debug, Error)] enum Error { #[error("error from Telegram: {0}")] TelegramError(#[from] RequestError), + #[error("error from storage: {0}")] StorageError(#[from] StorageError), } -#[derive(serde::Serialize, serde::Deserialize)] -pub enum DialogueState { +#[derive(DialogueState, Clone, serde::Serialize, serde::Deserialize)] +#[handler_out(anyhow::Result<()>)] +pub enum State { + #[handler(handle_start)] Start, + + #[handler(handle_got_number)] GotNumber(i32), } -impl Default for DialogueState { +impl Default for State { fn default() -> Self { Self::Start } } -async fn handle_message( - bot: AutoSend, - msg: Message, - dialogue: MyDialogue, -) -> Result<(), Error> { - match msg.text() { - None => { - bot.send_message(msg.chat.id, "Send me a text message.").await?; - } - Some(ans) => { - let state = dialogue.get_or_default().await?; - match state { - DialogueState::Start => { - if let Ok(number) = ans.parse() { - dialogue.update(DialogueState::GotNumber(number)).await?; - bot.send_message( - msg.chat.id, - format!("Remembered number {}. Now use /get or /reset", number), - ) - .await?; - } else { - bot.send_message(msg.chat.id, "Please, send me a number").await?; - } - } - DialogueState::GotNumber(num) => { - if ans.starts_with("/get") { - bot.send_message(msg.chat.id, format!("Here is your number: {}", num)) - .await?; - } else if ans.starts_with("/reset") { - dialogue.reset().await?; - bot.send_message(msg.chat.id, "Resetted number").await?; - } else { - bot.send_message(msg.chat.id, "Please, send /get or /reset").await?; - } - } - } - } - } - Ok(()) -} - #[tokio::main] async fn main() { let bot = Bot::from_env().auto_send(); let storage = SqliteStorage::open("db.sqlite", Json).await.unwrap(); let handler = Update::filter_message() - .add_dialogue::, DialogueState>() - .branch(dptree::endpoint(handle_message)); + .add_dialogue::, State>() + .dispatch_by::(); DispatcherBuilder::new(bot, handler) .dependencies(dptree::deps![storage]) @@ -84,3 +49,45 @@ async fn main() { .dispatch() .await; } + +async fn handle_start( + bot: AutoSend, + msg: Message, + dialogue: MyDialogue, +) -> anyhow::Result<()> { + match msg.text().unwrap().parse() { + Ok(number) => { + dialogue.update(State::GotNumber(number)).await?; + bot.send_message( + msg.chat.id, + format!("Remembered number {}. Now use /get or /reset", number), + ) + .await?; + } + _ => { + bot.send_message(msg.chat.id, "Please, send me a number").await?; + } + } + + Ok(()) +} + +async fn handle_got_number( + bot: AutoSend, + msg: Message, + dialogue: MyDialogue, + num: i32, +) -> anyhow::Result<()> { + let ans = msg.text().unwrap(); + + if ans.starts_with("/get") { + bot.send_message(msg.chat.id, format!("Here is your number: {}", num)).await?; + } else if ans.starts_with("/reset") { + dialogue.reset().await?; + bot.send_message(msg.chat.id, "Resetted number").await?; + } else { + bot.send_message(msg.chat.id, "Please, send /get or /reset").await?; + } + + Ok(()) +}