diff --git a/Cargo.toml b/Cargo.toml index 94be4d36..a4ece2c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,7 +95,6 @@ tower-http = { version = "0.2.5", features = ["trace"], optional = true } [dev-dependencies] rand = "0.8.3" pretty_env_logger = "0.4.0" -once_cell = "1.9.0" serde = "1" serde_json = "1" tokio = { version = "1.8", features = ["fs", "rt-multi-thread", "macros"] } diff --git a/examples/shared_state.rs b/examples/shared_state.rs index 33f5d4b6..c09fab93 100644 --- a/examples/shared_state.rs +++ b/examples/shared_state.rs @@ -1,27 +1,34 @@ // This bot answers how many messages it received in total on every message. -use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{ + atomic::{AtomicU64, Ordering}, + Arc, +}; -use once_cell::sync::Lazy; use teloxide::prelude::*; -static MESSAGES_TOTAL: Lazy = Lazy::new(AtomicU64::default); - #[tokio::main] async fn main() { pretty_env_logger::init(); log::info!("Starting shared state bot..."); let bot = Bot::from_env().auto_send(); + let messages_total = Arc::new(AtomicU64::new(0)); - let handler = Update::filter_message().branch(dptree::endpoint( - |msg: Message, bot: AutoSend| async move { - let previous = MESSAGES_TOTAL.fetch_add(1, Ordering::Relaxed); + let handler = Update::filter_message().endpoint( + |msg: Message, bot: AutoSend, messages_total: Arc| async move { + let previous = messages_total.fetch_add(1, Ordering::Relaxed); bot.send_message(msg.chat.id, format!("I received {previous} messages in total.")) .await?; respond(()) }, - )); + ); - Dispatcher::builder(bot, handler).build().setup_ctrlc_handler().dispatch().await; + Dispatcher::builder(bot, handler) + // Pass the shared state to the handler as a dependency. + .dependencies(dptree::deps![messages_total]) + .build() + .setup_ctrlc_handler() + .dispatch() + .await; } diff --git a/src/dispatching.rs b/src/dispatching.rs index 902c601a..6b05d88c 100644 --- a/src/dispatching.rs +++ b/src/dispatching.rs @@ -29,31 +29,7 @@ //! ([Full](https://github.com/teloxide/teloxide/blob/master/examples/shared_state.rs)) //! //! ```no_run -//! use std::sync::atomic::{AtomicU64, Ordering}; -//! -//! use once_cell::sync::Lazy; -//! use teloxide::prelude::*; -//! -//! static MESSAGES_TOTAL: Lazy = Lazy::new(AtomicU64::default); -//! -//! # #[tokio::main] -//! # async fn main() { -//! pretty_env_logger::init(); -//! log::info!("Starting shared state bot..."); -//! -//! let bot = Bot::from_env().auto_send(); -//! -//! let handler = Update::filter_message().branch(dptree::endpoint( -//! |msg: Message, bot: AutoSend| async move { -//! let previous = MESSAGES_TOTAL.fetch_add(1, Ordering::Relaxed); -//! bot.send_message(msg.chat.id, format!("I received {} messages in total.", previous)) -//! .await?; -//! respond(()) -//! }, -//! )); -//! -//! Dispatcher::builder(bot, handler).build().setup_ctrlc_handler().dispatch().await; -//! # } +//! // TODO: examples/purchase.rs //! ``` //! //! 1. First, we create the bot: `let bot = Bot::from_env().auto_send()`. @@ -61,8 +37,8 @@ //! kinds of [`crate::types::Update`], here we are only interested in //! [`crate::types::Message`]: [`UpdateFilterExt::filter_message`] create a //! handler object which filters all messages out of a generic update. -//! 3. By doing `.branch(dptree::endpoint(...))`, we set up a custom handling -//! closure that receives `msg: Message` and `bot: AutoSend`. There are +//! 3. By doing `.endpoint(...)` we set up a custom handling closure that +//! receives `msg: Message` and `bot: AutoSend`. There are //! called dependencies: `msg` is supplied by //! [`UpdateFilterExt::filter_message`], while `bot` is supplied by //! [`Dispatcher`].