Implement dialogue::enter

This commit is contained in:
Hirrolot 2022-04-23 00:11:27 +06:00
parent 4a4990e207
commit a60e19a8c2
4 changed files with 40 additions and 20 deletions

View file

@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Implement `GetChatId` for `Update`. - Implement `GetChatId` for `Update`.
- The `dialogue::enter()` function as a shortcut for `dptree::entry().enter_dialogue()`.
## 0.8.0 - 2022-04-18 ## 0.8.0 - 2022-04-18

View file

@ -13,7 +13,7 @@
// ``` // ```
use teloxide::{ use teloxide::{
dispatching::dialogue::{GetChatId, InMemStorage}, dispatching::dialogue::{self, GetChatId, InMemStorage},
prelude::*, prelude::*,
types::{InlineKeyboardButton, InlineKeyboardMarkup}, types::{InlineKeyboardButton, InlineKeyboardMarkup},
utils::command::BotCommands, utils::command::BotCommands,
@ -53,8 +53,7 @@ async fn main() {
Dispatcher::builder( Dispatcher::builder(
bot, bot,
dptree::entry() dialogue::enter::<Update, InMemStorage<State>, State, _>()
.enter_dialogue::<Update, InMemStorage<State>, State>()
.branch( .branch(
Update::filter_message() Update::filter_message()
.chain(teloxide::handler![State::ReceiveFullName].endpoint(receive_full_name)), .chain(teloxide::handler![State::ReceiveFullName].endpoint(receive_full_name)),

View file

@ -83,11 +83,14 @@ pub use crate::dispatching::dialogue::{RedisStorage, RedisStorageError};
#[cfg(feature = "sqlite-storage")] #[cfg(feature = "sqlite-storage")]
pub use crate::dispatching::dialogue::{SqliteStorage, SqliteStorageError}; pub use crate::dispatching::dialogue::{SqliteStorage, SqliteStorageError};
use dptree::{prelude::DependencyMap, Handler};
pub use get_chat_id::GetChatId; pub use get_chat_id::GetChatId;
pub use storage::*; pub use storage::*;
use teloxide_core::types::ChatId; use teloxide_core::types::ChatId;
use std::{marker::PhantomData, sync::Arc}; use std::{fmt::Debug, marker::PhantomData, sync::Arc};
use super::DpHandlerDescription;
mod get_chat_id; mod get_chat_id;
mod storage; mod storage;
@ -180,6 +183,37 @@ where
} }
} }
/// Enters a dialogue context.
///
/// A call to this function is the same as `dptree::entry().enter_dialogue()`.
///
/// See [`HandlerExt::enter_dialogue`].
///
/// [`HandlerExt::enter_dialogue`]: super::HandlerExt::enter_dialogue
pub fn enter<Upd, S, D, Output>() -> Handler<'static, DependencyMap, Output, DpHandlerDescription>
where
S: Storage<D> + ?Sized + Send + Sync + 'static,
<S as Storage<D>>::Error: Debug + Send,
D: Default + Send + Sync + 'static,
Upd: GetChatId + Clone + Send + Sync + 'static,
Output: Send + Sync + 'static,
{
dptree::entry()
.chain(dptree::filter_map(|storage: Arc<S>, upd: Upd| {
let chat_id = upd.chat_id()?;
Some(Dialogue::new(storage, chat_id))
}))
.chain(dptree::filter_map_async(|dialogue: Dialogue<D, S>| async move {
match dialogue.get_or_default().await {
Ok(dialogue) => Some(dialogue),
Err(err) => {
log::error!("dialogue.get_or_default() failed: {:?}", err);
None
}
}
}))
}
/// Perform a dialogue FSM transition. /// Perform a dialogue FSM transition.
/// ///
/// This macro expands to a [`dptree::Handler`] that filters your dialogue /// This macro expands to a [`dptree::Handler`] that filters your dialogue

View file

@ -1,8 +1,6 @@
use std::sync::Arc;
use crate::{ use crate::{
dispatching::{ dispatching::{
dialogue::{Dialogue, GetChatId, Storage}, dialogue::{GetChatId, Storage},
DpHandlerDescription, DpHandlerDescription,
}, },
types::{Me, Message}, types::{Me, Message},
@ -82,19 +80,7 @@ where
D: Default + Send + Sync + 'static, D: Default + Send + Sync + 'static,
Upd: GetChatId + Clone + Send + Sync + 'static, Upd: GetChatId + Clone + Send + Sync + 'static,
{ {
self.chain(dptree::filter_map(|storage: Arc<S>, upd: Upd| { self.chain(super::dialogue::enter::<Upd, S, D, Output>())
let chat_id = upd.chat_id()?;
Some(Dialogue::new(storage, chat_id))
}))
.chain(dptree::filter_map_async(|dialogue: Dialogue<D, S>| async move {
match dialogue.get_or_default().await {
Ok(dialogue) => Some(dialogue),
Err(err) => {
log::error!("dialogue.get_or_default() failed: {:?}", err);
None
}
}
}))
} }
#[allow(deprecated)] #[allow(deprecated)]