summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-07-29 20:02:47 +0200
committerSanto Cariotti <santo@dcariotti.me>2021-07-29 20:02:47 +0200
commit89168ff11d4adb4ca51fe14e7d54fb2d69d392a8 (patch)
tree852241fc743b8f600bdf1c1787c1b7c283d2de27 /src
parenta3be99079e9a644eaeaef857c52d7eebcc77e77e (diff)
refactor: manage callbacks with tokio-stream
Diffstat (limited to 'src')
-rw-r--r--src/commands.rs29
-rw-r--r--src/main.rs20
2 files changed, 44 insertions, 5 deletions
diff --git a/src/commands.rs b/src/commands.rs
index 1aee098..e498916 100644
--- a/src/commands.rs
+++ b/src/commands.rs
@@ -1,5 +1,7 @@
use std::error::Error;
+use teloxide::payloads::SendMessageSetters;
use teloxide::prelude::{AutoSend, Bot, Message, UpdateWithCx};
+use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup};
use teloxide::utils::command::BotCommand;
#[derive(BotCommand)]
@@ -7,14 +9,33 @@ use teloxide::utils::command::BotCommand;
pub enum Command {
#[command(description = "Display this text")]
Help,
+ #[command(description = "Reserve a classroom for tomorrow", parse_with = "split")]
+ Room,
}
pub async fn handler(
cx: UpdateWithCx<AutoSend<Bot>, Message>,
- command: Command,
) -> Result<(), Box<dyn Error + Send + Sync>> {
- match command {
- Command::Help => cx.answer(Command::descriptions()).await?,
- };
+ let txt = cx.update.text();
+ if txt.is_none() {
+ return Ok(());
+ }
+
+ if let Ok(command) = BotCommand::parse(txt.unwrap(), "unict-reservation") {
+ match command {
+ Command::Help => {
+ cx.answer(Command::descriptions()).await?;
+ }
+ Command::Room => {
+ let url_button =
+ InlineKeyboardButton::callback("hello".to_string(), "hello_call".to_string());
+ let keyboard = InlineKeyboardMarkup::default().append_row(vec![url_button]);
+ cx.answer("Where?").reply_markup(keyboard).await?;
+ }
+ }
+ } else {
+ cx.reply_to("Command not found!").await?;
+ }
+
Ok(())
}
diff --git a/src/main.rs b/src/main.rs
index 0ac5a4d..220b7ce 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,6 +8,8 @@ mod config;
use crate::config::Config;
+use tokio_stream::wrappers::UnboundedReceiverStream;
+
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
teloxide::enable_logging!();
@@ -23,7 +25,23 @@ async fn main() -> Result<(), Box<dyn Error>> {
panic!("You can't connect: `{}`, credentials are {:?}", e, config);
}
};
- teloxide::commands_repl(bot, "unict-reservation", commands::handler).await;
+
+ Dispatcher::new(bot)
+ .messages_handler(|rx: DispatcherHandlerRx<AutoSend<Bot>, Message>| {
+ UnboundedReceiverStream::new(rx).for_each_concurrent(None, |cx| async move {
+ commands::handler(cx).await.log_on_error().await;
+ })
+ })
+ .callback_queries_handler(|rx: DispatcherHandlerRx<AutoSend<Bot>, CallbackQuery>| {
+ UnboundedReceiverStream::new(rx).for_each_concurrent(None, |cx| async move {
+ let data = &cx.update.data;
+ if let Some(d) = data {
+ println!("{}", d);
+ }
+ })
+ })
+ .dispatch()
+ .await;
log::info!("Closing bot... Goodbye!");
Ok(())