2020-10-24 18:57:51 +02:00
|
|
|
use teloxide::{
|
2021-12-15 12:46:32 +01:00
|
|
|
dispatching2::dialogue::{serializer::Json, SqliteStorage, Storage},
|
2020-10-24 18:57:51 +02:00
|
|
|
prelude::*,
|
2021-03-15 04:22:10 +01:00
|
|
|
RequestError,
|
2020-10-24 18:57:51 +02:00
|
|
|
};
|
|
|
|
use thiserror::Error;
|
2021-12-15 12:46:32 +01:00
|
|
|
use std::sync::Arc;
|
2020-10-24 18:57:51 +02:00
|
|
|
|
2021-12-15 12:46:32 +01:00
|
|
|
type Store = SqliteStorage<Json>;
|
|
|
|
// FIXME: naming
|
|
|
|
type MyDialogue = Dialogue<BotDialogue, Store>;
|
|
|
|
type StorageError = <SqliteStorage<Json> as Storage<BotDialogue>>::Error;
|
2020-10-24 18:57:51 +02:00
|
|
|
|
|
|
|
#[derive(Debug, Error)]
|
|
|
|
enum Error {
|
|
|
|
#[error("error from Telegram: {0}")]
|
|
|
|
TelegramError(#[from] RequestError),
|
|
|
|
#[error("error from storage: {0}")]
|
|
|
|
StorageError(#[from] StorageError),
|
|
|
|
}
|
|
|
|
|
2021-12-15 12:46:32 +01:00
|
|
|
#[derive(serde::Serialize, serde::Deserialize)]
|
|
|
|
pub enum BotDialogue {
|
|
|
|
Start,
|
|
|
|
HaveNumber(i32),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for BotDialogue {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self::Start
|
|
|
|
}
|
|
|
|
}
|
2020-10-24 18:57:51 +02:00
|
|
|
|
2021-03-05 22:24:10 +01:00
|
|
|
async fn handle_message(
|
2021-12-15 12:46:32 +01:00
|
|
|
bot: Arc<AutoSend<Bot>>,
|
|
|
|
mes: Arc<Message>,
|
|
|
|
dialogue: Arc<MyDialogue>,
|
|
|
|
) -> Result<(), Error> {
|
|
|
|
match mes.text() {
|
2020-10-24 18:57:51 +02:00
|
|
|
None => {
|
2021-12-15 12:46:32 +01:00
|
|
|
bot.send_message(mes.chat.id, "Send me a text message.").await?;
|
2020-10-24 18:57:51 +02:00
|
|
|
}
|
2021-12-15 12:46:32 +01:00
|
|
|
Some(ans) => {
|
|
|
|
let state = dialogue.current_state_or_default().await?;
|
|
|
|
match state {
|
|
|
|
BotDialogue::Start => {
|
|
|
|
if let Ok(number) = ans.parse() {
|
|
|
|
dialogue.next(BotDialogue::HaveNumber(number)).await?;
|
|
|
|
bot.send_message(mes.chat.id, format!("Remembered number {}. Now use /get or /reset", number)).await?;
|
|
|
|
} else {
|
|
|
|
bot.send_message(mes.chat.id, "Please, send me a number").await?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BotDialogue::HaveNumber(num) => {
|
|
|
|
if ans.starts_with("/get") {
|
|
|
|
bot.send_message(mes.chat.id, format!("Here is your number: {}", num)).await?;
|
|
|
|
} else if ans.starts_with("/reset") {
|
|
|
|
dialogue.reset().await?;
|
|
|
|
bot.send_message(mes.chat.id, "Resetted number").await?;
|
|
|
|
} else {
|
|
|
|
bot.send_message(mes.chat.id, "Please, send /get or /reset").await?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2020-10-24 18:57:51 +02:00
|
|
|
}
|
2021-12-15 12:46:32 +01:00
|
|
|
Ok(())
|
2020-10-24 18:57:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
async fn main() {
|
2021-12-15 12:46:32 +01:00
|
|
|
let bot = Arc::new(Bot::from_env().auto_send());
|
|
|
|
let storage = SqliteStorage::open("db.sqlite", Json).await.unwrap();
|
2021-03-05 22:24:10 +01:00
|
|
|
|
2020-10-24 18:57:51 +02:00
|
|
|
Dispatcher::new(bot)
|
2021-12-15 12:46:32 +01:00
|
|
|
.dependencies({
|
|
|
|
let mut map = dptree::di::DependencyMap::new();
|
|
|
|
map.insert_arc(storage);
|
|
|
|
map
|
|
|
|
})
|
|
|
|
.messages_handler(|h| {
|
|
|
|
h.add_dialogue::<Message, Store, BotDialogue>()
|
|
|
|
.branch(dptree::endpoint(handle_message))
|
|
|
|
})
|
2020-10-24 18:57:51 +02:00
|
|
|
.dispatch()
|
|
|
|
.await;
|
|
|
|
}
|