shared_state/
shared_state.rs

1// This bot answers how many messages it received in total on every message.
2
3use std::sync::{
4    atomic::{AtomicU64, Ordering},
5    Arc,
6};
7
8use teloxide::prelude::*;
9
10#[tokio::main]
11async fn main() {
12    pretty_env_logger::init();
13    log::info!("Starting shared state bot...");
14
15    let bot = Bot::from_env();
16    let messages_total = Arc::new(AtomicU64::new(0));
17
18    let handler = Update::filter_message().endpoint(
19        |bot: Bot, messages_total: Arc<AtomicU64>, msg: Message| async move {
20            let previous = messages_total.fetch_add(1, Ordering::Relaxed);
21            bot.send_message(msg.chat.id, format!("I received {previous} messages in total."))
22                .await?;
23            respond(())
24        },
25    );
26
27    Dispatcher::builder(bot, handler)
28        // Pass the shared state to the handler as a dependency.
29        .dependencies(dptree::deps![messages_total])
30        .enable_ctrlc_handler()
31        .build()
32        .dispatch()
33        .await;
34}