pub struct DispatcherBuilder<R, Err, Key> { /* private fields */ }Expand description
The builder for Dispatcher.
See also: “Dispatching or REPLs?”
Implementations§
Source§impl<R, Err, Key> DispatcherBuilder<R, Err, Key>
impl<R, Err, Key> DispatcherBuilder<R, Err, Key>
Sourcepub fn default_handler<H, Fut>(self, handler: H) -> Self
pub fn default_handler<H, Fut>(self, handler: H) -> Self
Specifies a handler that will be called for an unhandled update.
By default, it is a mere log::warn.
Examples found in repository?
12async fn main() {
13 pretty_env_logger::init();
14 log::info!("Starting dispatching features bot...");
15
16 let bot = Bot::from_env();
17
18 let parameters = ConfigParameters {
19 bot_maintainer: UserId(0), // Paste your ID to run this bot.
20 maintainer_username: None,
21 };
22
23 let handler = Update::filter_message()
24 // You can use branching to define multiple ways in which an update will be handled. If the
25 // first branch fails, an update will be passed to the second branch, and so on.
26 .branch(
27 dptree::entry()
28 // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29 .filter_command::<SimpleCommand>()
30 // If a command parsing fails, this handler will not be executed.
31 .endpoint(simple_commands_handler),
32 )
33 .branch(
34 // Filter a maintainer by a user ID.
35 dptree::filter(|cfg: ConfigParameters, msg: Message| {
36 msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37 })
38 .filter_command::<MaintainerCommands>()
39 .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40 match cmd {
41 MaintainerCommands::Rand { from, to } => {
42 let mut rng = rand::rngs::OsRng;
43 let value: u64 = rng.gen_range(from..=to);
44
45 bot.send_message(msg.chat.id, value.to_string()).await?;
46 Ok(())
47 }
48 }
49 }),
50 )
51 .branch(
52 // Filtering allow you to filter updates by some condition.
53 dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54 .branch(
55 // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56 // Use if you want to make sure that users refer specifically to your bot.
57 // Same as filter_command, the next handlers will receive a parsed
58 // `GroupCommand`.
59 dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60 |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61 match cmd {
62 GroupCommand::Repeat { text } => {
63 bot.send_message(msg.chat.id, format!("You said: {text}"))
64 .await?;
65 Ok(())
66 }
67 }
68 },
69 ),
70 )
71 .branch(
72 // An endpoint is the last update handler.
73 dptree::endpoint(|msg: Message, bot: Bot| async move {
74 log::info!("Received a message from a group chat.");
75 bot.send_message(msg.chat.id, "This is a group chat.").await?;
76 respond(())
77 }),
78 ),
79 )
80 .branch(
81 // There are some extension filtering functions on `Message`. The following filter will
82 // filter only messages with dices.
83 Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84 bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85 .reply_to(msg)
86 .await?;
87 Ok(())
88 }),
89 );
90
91 Dispatcher::builder(bot, handler)
92 // Here you specify initial dependencies that all handlers will receive; they can be
93 // database connections, configurations, and other auxiliary arguments. It is similar to
94 // `actix_web::Extensions`.
95 .dependencies(dptree::deps![parameters])
96 // If no handler succeeded to handle an update, this closure will be called.
97 .default_handler(|upd| async move {
98 log::warn!("Unhandled update: {upd:?}");
99 })
100 // If the dispatcher fails for some reason, execute this handler.
101 .error_handler(LoggingErrorHandler::with_custom_text(
102 "An error has occurred in the dispatcher",
103 ))
104 .enable_ctrlc_handler()
105 .build()
106 .dispatch()
107 .await;
108}Sourcepub fn error_handler(
self,
handler: Arc<dyn ErrorHandler<Err> + Send + Sync>,
) -> Self
pub fn error_handler( self, handler: Arc<dyn ErrorHandler<Err> + Send + Sync>, ) -> Self
Specifies a handler that will be called on a handler error.
By default, it is LoggingErrorHandler.
Examples found in repository?
12async fn main() {
13 pretty_env_logger::init();
14 log::info!("Starting dispatching features bot...");
15
16 let bot = Bot::from_env();
17
18 let parameters = ConfigParameters {
19 bot_maintainer: UserId(0), // Paste your ID to run this bot.
20 maintainer_username: None,
21 };
22
23 let handler = Update::filter_message()
24 // You can use branching to define multiple ways in which an update will be handled. If the
25 // first branch fails, an update will be passed to the second branch, and so on.
26 .branch(
27 dptree::entry()
28 // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29 .filter_command::<SimpleCommand>()
30 // If a command parsing fails, this handler will not be executed.
31 .endpoint(simple_commands_handler),
32 )
33 .branch(
34 // Filter a maintainer by a user ID.
35 dptree::filter(|cfg: ConfigParameters, msg: Message| {
36 msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37 })
38 .filter_command::<MaintainerCommands>()
39 .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40 match cmd {
41 MaintainerCommands::Rand { from, to } => {
42 let mut rng = rand::rngs::OsRng;
43 let value: u64 = rng.gen_range(from..=to);
44
45 bot.send_message(msg.chat.id, value.to_string()).await?;
46 Ok(())
47 }
48 }
49 }),
50 )
51 .branch(
52 // Filtering allow you to filter updates by some condition.
53 dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54 .branch(
55 // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56 // Use if you want to make sure that users refer specifically to your bot.
57 // Same as filter_command, the next handlers will receive a parsed
58 // `GroupCommand`.
59 dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60 |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61 match cmd {
62 GroupCommand::Repeat { text } => {
63 bot.send_message(msg.chat.id, format!("You said: {text}"))
64 .await?;
65 Ok(())
66 }
67 }
68 },
69 ),
70 )
71 .branch(
72 // An endpoint is the last update handler.
73 dptree::endpoint(|msg: Message, bot: Bot| async move {
74 log::info!("Received a message from a group chat.");
75 bot.send_message(msg.chat.id, "This is a group chat.").await?;
76 respond(())
77 }),
78 ),
79 )
80 .branch(
81 // There are some extension filtering functions on `Message`. The following filter will
82 // filter only messages with dices.
83 Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84 bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85 .reply_to(msg)
86 .await?;
87 Ok(())
88 }),
89 );
90
91 Dispatcher::builder(bot, handler)
92 // Here you specify initial dependencies that all handlers will receive; they can be
93 // database connections, configurations, and other auxiliary arguments. It is similar to
94 // `actix_web::Extensions`.
95 .dependencies(dptree::deps![parameters])
96 // If no handler succeeded to handle an update, this closure will be called.
97 .default_handler(|upd| async move {
98 log::warn!("Unhandled update: {upd:?}");
99 })
100 // If the dispatcher fails for some reason, execute this handler.
101 .error_handler(LoggingErrorHandler::with_custom_text(
102 "An error has occurred in the dispatcher",
103 ))
104 .enable_ctrlc_handler()
105 .build()
106 .dispatch()
107 .await;
108}Sourcepub fn dependencies(self, dependencies: DependencyMap) -> Self
pub fn dependencies(self, dependencies: DependencyMap) -> Self
Specifies dependencies that can be used inside of handlers.
By default, there is no dependencies.
Examples found in repository?
48async fn main() {
49 pretty_env_logger::init();
50 log::info!("Starting purchase bot...");
51
52 let bot = Bot::from_env();
53
54 Dispatcher::builder(bot, schema())
55 .dependencies(dptree::deps![InMemStorage::<State>::new()])
56 .enable_ctrlc_handler()
57 .build()
58 .dispatch()
59 .await;
60}More examples
40async fn main() {
41 pretty_env_logger::init();
42 log::info!("Starting deep linking bot...");
43
44 let bot = Bot::from_env();
45
46 let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47 .branch(
48 Update::filter_message()
49 .filter_command::<StartCommand>()
50 .branch(case![StartCommand::Start(start)].endpoint(start)),
51 )
52 .branch(
53 Update::filter_message()
54 .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55 );
56
57 Dispatcher::builder(bot, handler)
58 .dependencies(deps![InMemStorage::<State>::new()])
59 .enable_ctrlc_handler()
60 .build()
61 .dispatch()
62 .await;
63}36async fn main() {
37 pretty_env_logger::init();
38 log::info!("Starting dialogue bot...");
39
40 let bot = Bot::from_env();
41
42 Dispatcher::builder(
43 bot,
44 Update::filter_message()
45 .enter_dialogue::<Message, InMemStorage<State>, State>()
46 .branch(dptree::case![State::Start].endpoint(start))
47 .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48 .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49 .branch(
50 dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51 ),
52 )
53 .dependencies(dptree::deps![InMemStorage::<State>::new()])
54 .enable_ctrlc_handler()
55 .build()
56 .dispatch()
57 .await;
58}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}35async fn main() {
36 pretty_env_logger::init();
37 log::info!("Starting DB remember bot...");
38
39 let bot = Bot::from_env();
40
41 let storage: MyStorage = if std::env::var("DB_REMEMBER_REDIS").is_ok() {
42 RedisStorage::open("redis://127.0.0.1:6379", Bincode).await.unwrap().erase()
43 } else {
44 SqliteStorage::open("db.sqlite", Json).await.unwrap().erase()
45 };
46
47 let handler = Update::filter_message()
48 .enter_dialogue::<Message, ErasedStorage<State>, State>()
49 .branch(dptree::case![State::Start].endpoint(start))
50 .branch(
51 dptree::case![State::GotNumber(n)]
52 .branch(dptree::entry().filter_command::<Command>().endpoint(got_number))
53 .branch(dptree::endpoint(invalid_command)),
54 );
55
56 Dispatcher::builder(bot, handler)
57 .dependencies(dptree::deps![storage])
58 .enable_ctrlc_handler()
59 .build()
60 .dispatch()
61 .await;
62}12async fn main() {
13 pretty_env_logger::init();
14 log::info!("Starting dispatching features bot...");
15
16 let bot = Bot::from_env();
17
18 let parameters = ConfigParameters {
19 bot_maintainer: UserId(0), // Paste your ID to run this bot.
20 maintainer_username: None,
21 };
22
23 let handler = Update::filter_message()
24 // You can use branching to define multiple ways in which an update will be handled. If the
25 // first branch fails, an update will be passed to the second branch, and so on.
26 .branch(
27 dptree::entry()
28 // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29 .filter_command::<SimpleCommand>()
30 // If a command parsing fails, this handler will not be executed.
31 .endpoint(simple_commands_handler),
32 )
33 .branch(
34 // Filter a maintainer by a user ID.
35 dptree::filter(|cfg: ConfigParameters, msg: Message| {
36 msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37 })
38 .filter_command::<MaintainerCommands>()
39 .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40 match cmd {
41 MaintainerCommands::Rand { from, to } => {
42 let mut rng = rand::rngs::OsRng;
43 let value: u64 = rng.gen_range(from..=to);
44
45 bot.send_message(msg.chat.id, value.to_string()).await?;
46 Ok(())
47 }
48 }
49 }),
50 )
51 .branch(
52 // Filtering allow you to filter updates by some condition.
53 dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54 .branch(
55 // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56 // Use if you want to make sure that users refer specifically to your bot.
57 // Same as filter_command, the next handlers will receive a parsed
58 // `GroupCommand`.
59 dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60 |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61 match cmd {
62 GroupCommand::Repeat { text } => {
63 bot.send_message(msg.chat.id, format!("You said: {text}"))
64 .await?;
65 Ok(())
66 }
67 }
68 },
69 ),
70 )
71 .branch(
72 // An endpoint is the last update handler.
73 dptree::endpoint(|msg: Message, bot: Bot| async move {
74 log::info!("Received a message from a group chat.");
75 bot.send_message(msg.chat.id, "This is a group chat.").await?;
76 respond(())
77 }),
78 ),
79 )
80 .branch(
81 // There are some extension filtering functions on `Message`. The following filter will
82 // filter only messages with dices.
83 Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84 bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85 .reply_to(msg)
86 .await?;
87 Ok(())
88 }),
89 );
90
91 Dispatcher::builder(bot, handler)
92 // Here you specify initial dependencies that all handlers will receive; they can be
93 // database connections, configurations, and other auxiliary arguments. It is similar to
94 // `actix_web::Extensions`.
95 .dependencies(dptree::deps![parameters])
96 // If no handler succeeded to handle an update, this closure will be called.
97 .default_handler(|upd| async move {
98 log::warn!("Unhandled update: {upd:?}");
99 })
100 // If the dispatcher fails for some reason, execute this handler.
101 .error_handler(LoggingErrorHandler::with_custom_text(
102 "An error has occurred in the dispatcher",
103 ))
104 .enable_ctrlc_handler()
105 .build()
106 .dispatch()
107 .await;
108}Sourcepub fn enable_ctrlc_handler(self) -> Self
Available on crate feature ctrlc_handler only.
pub fn enable_ctrlc_handler(self) -> Self
ctrlc_handler only.Enables the ^C handler that shutdowns dispatching.
Examples found in repository?
48async fn main() {
49 pretty_env_logger::init();
50 log::info!("Starting purchase bot...");
51
52 let bot = Bot::from_env();
53
54 Dispatcher::builder(bot, schema())
55 .dependencies(dptree::deps![InMemStorage::<State>::new()])
56 .enable_ctrlc_handler()
57 .build()
58 .dispatch()
59 .await;
60}More examples
24async fn main() -> Result<(), Box<dyn Error>> {
25 pretty_env_logger::init();
26 log::info!("Starting buttons bot...");
27
28 let bot = Bot::from_env();
29
30 let handler = dptree::entry()
31 .branch(Update::filter_message().endpoint(message_handler))
32 .branch(Update::filter_callback_query().endpoint(callback_handler))
33 .branch(Update::filter_inline_query().endpoint(inline_query_handler));
34
35 Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
36 Ok(())
37}40async fn main() {
41 pretty_env_logger::init();
42 log::info!("Starting deep linking bot...");
43
44 let bot = Bot::from_env();
45
46 let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47 .branch(
48 Update::filter_message()
49 .filter_command::<StartCommand>()
50 .branch(case![StartCommand::Start(start)].endpoint(start)),
51 )
52 .branch(
53 Update::filter_message()
54 .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55 );
56
57 Dispatcher::builder(bot, handler)
58 .dependencies(deps![InMemStorage::<State>::new()])
59 .enable_ctrlc_handler()
60 .build()
61 .dispatch()
62 .await;
63}36async fn main() {
37 pretty_env_logger::init();
38 log::info!("Starting dialogue bot...");
39
40 let bot = Bot::from_env();
41
42 Dispatcher::builder(
43 bot,
44 Update::filter_message()
45 .enter_dialogue::<Message, InMemStorage<State>, State>()
46 .branch(dptree::case![State::Start].endpoint(start))
47 .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48 .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49 .branch(
50 dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51 ),
52 )
53 .dependencies(dptree::deps![InMemStorage::<State>::new()])
54 .enable_ctrlc_handler()
55 .build()
56 .dispatch()
57 .await;
58}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}6async fn main() {
7 pretty_env_logger::init();
8 log::info!("Starting middlewares bot...");
9
10 let bot = Bot::from_env();
11
12 let handler = Update::filter_message()
13 // Executes before the endpoint.
14 .inspect(|msg: Message| println!("Before (message #{}).", msg.id))
15 // Our "endpoint".
16 .map_async(my_endpoint)
17 // Executes after the endpoint (even if it fails).
18 .inspect(|msg: Message| {
19 println!("After (message #{}).", msg.id);
20 })
21 // Retrieve the result of the endpoint and pass it to the dispatcher.
22 .endpoint(|result: HandlerResult| async move {
23 // Alternatively, we could also pattern-match on this value for more
24 // fine-grained behaviour.
25 result
26 });
27
28 Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
29}Sourcepub fn worker_queue_size(self, size: usize) -> Self
pub fn worker_queue_size(self, size: usize) -> Self
Specifies size of the queue for workers.
By default it’s 64.
Sourcepub fn stack_size(self, _size: usize) -> Self
👎Deprecated since 0.15.0: This method is a no-op; you can just remove it.
pub fn stack_size(self, _size: usize) -> Self
Specifies the stack size available to the dispatcher.
By default, it’s 8 * 1024 * 1024 bytes (8 MiB).
Sourcepub fn distribution_function<K>(
self,
f: fn(&Update) -> Option<K>,
) -> DispatcherBuilder<R, Err, K>
pub fn distribution_function<K>( self, f: fn(&Update) -> Option<K>, ) -> DispatcherBuilder<R, Err, K>
Specifies the distribution function that decides how updates are grouped before execution.
§Update grouping
When Dispatcher receives updates, it runs dispatching tree
(handlers) concurrently. This means that multiple updates can be
processed at the same time.
However, this is not always convenient. For example, if you have global state, then you may want to process some updates sequentially, to prevent state inconsistencies.
This is why teloxide allows grouping updates. Updates for which the
distribution function f returns the same “distribution key” K will
be run in sequence (while still being processed concurrently with the
updates with different distribution keys).
Updates for which f returns None will always be processed in
parallel.
§Default distribution function
By default the distribution function is equivalent to |upd| upd.chat().map(|chat| chat.id), so updates from the same chat will be
processed sequentially.
This pair nicely with dialogue system, which has state attached to chats.
§Examples
Grouping updates by user who caused this update to happen:
use teloxide::{dispatching::Dispatcher, dptree, Bot};
let bot = Bot::new("TOKEN");
let handler = dptree::entry() /* ... */;
let dp = Dispatcher::builder(bot, handler)
.distribution_function(|upd| upd.from().map(|user| user.id))
.build();Not grouping updates at all, always processing updates concurrently:
use teloxide::{dispatching::Dispatcher, dptree, Bot};
let bot = Bot::new("TOKEN");
let handler = dptree::entry() /* ... */;
let dp = Dispatcher::builder(bot, handler).distribution_function(|_| None::<()>).build();Sourcepub fn build(self) -> Dispatcher<R, Err, Key>
pub fn build(self) -> Dispatcher<R, Err, Key>
Constructs Dispatcher.
§Panics
This function will panic at run-time if dptree fails to type-check
the provided handler. An appropriate error message will be emitted.
Examples found in repository?
48async fn main() {
49 pretty_env_logger::init();
50 log::info!("Starting purchase bot...");
51
52 let bot = Bot::from_env();
53
54 Dispatcher::builder(bot, schema())
55 .dependencies(dptree::deps![InMemStorage::<State>::new()])
56 .enable_ctrlc_handler()
57 .build()
58 .dispatch()
59 .await;
60}More examples
24async fn main() -> Result<(), Box<dyn Error>> {
25 pretty_env_logger::init();
26 log::info!("Starting buttons bot...");
27
28 let bot = Bot::from_env();
29
30 let handler = dptree::entry()
31 .branch(Update::filter_message().endpoint(message_handler))
32 .branch(Update::filter_callback_query().endpoint(callback_handler))
33 .branch(Update::filter_inline_query().endpoint(inline_query_handler));
34
35 Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
36 Ok(())
37}40async fn main() {
41 pretty_env_logger::init();
42 log::info!("Starting deep linking bot...");
43
44 let bot = Bot::from_env();
45
46 let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47 .branch(
48 Update::filter_message()
49 .filter_command::<StartCommand>()
50 .branch(case![StartCommand::Start(start)].endpoint(start)),
51 )
52 .branch(
53 Update::filter_message()
54 .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55 );
56
57 Dispatcher::builder(bot, handler)
58 .dependencies(deps![InMemStorage::<State>::new()])
59 .enable_ctrlc_handler()
60 .build()
61 .dispatch()
62 .await;
63}36async fn main() {
37 pretty_env_logger::init();
38 log::info!("Starting dialogue bot...");
39
40 let bot = Bot::from_env();
41
42 Dispatcher::builder(
43 bot,
44 Update::filter_message()
45 .enter_dialogue::<Message, InMemStorage<State>, State>()
46 .branch(dptree::case![State::Start].endpoint(start))
47 .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48 .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49 .branch(
50 dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51 ),
52 )
53 .dependencies(dptree::deps![InMemStorage::<State>::new()])
54 .enable_ctrlc_handler()
55 .build()
56 .dispatch()
57 .await;
58}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}6async fn main() {
7 pretty_env_logger::init();
8 log::info!("Starting middlewares bot...");
9
10 let bot = Bot::from_env();
11
12 let handler = Update::filter_message()
13 // Executes before the endpoint.
14 .inspect(|msg: Message| println!("Before (message #{}).", msg.id))
15 // Our "endpoint".
16 .map_async(my_endpoint)
17 // Executes after the endpoint (even if it fails).
18 .inspect(|msg: Message| {
19 println!("After (message #{}).", msg.id);
20 })
21 // Retrieve the result of the endpoint and pass it to the dispatcher.
22 .endpoint(|result: HandlerResult| async move {
23 // Alternatively, we could also pattern-match on this value for more
24 // fine-grained behaviour.
25 result
26 });
27
28 Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
29}Auto Trait Implementations§
impl<R, Err, Key> Freeze for DispatcherBuilder<R, Err, Key>where
R: Freeze,
impl<R, Err, Key> !RefUnwindSafe for DispatcherBuilder<R, Err, Key>
impl<R, Err, Key> Send for DispatcherBuilder<R, Err, Key>where
R: Send,
impl<R, Err, Key> Sync for DispatcherBuilder<R, Err, Key>where
R: Sync,
impl<R, Err, Key> Unpin for DispatcherBuilder<R, Err, Key>where
R: Unpin,
impl<R, Err, Key> !UnwindSafe for DispatcherBuilder<R, Err, Key>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Erasable for T
impl<T> Erasable for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more