summaryrefslogtreecommitdiff
path: root/src/bot.rs
diff options
context:
space:
mode:
authorKeuin <[email protected]>2022-03-27 17:40:18 +0800
committerKeuin <[email protected]>2022-03-27 17:40:18 +0800
commitaae1f386456a605c12263e2ba5f09dc36bb180b3 (patch)
treed125ec6c6ecc0e53389713578374b1f510e65416 /src/bot.rs
Finally, it works.
Further cleanup work is needed.
Diffstat (limited to 'src/bot.rs')
-rw-r--r--src/bot.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/bot.rs b/src/bot.rs
new file mode 100644
index 0000000..b1a4ea2
--- /dev/null
+++ b/src/bot.rs
@@ -0,0 +1,63 @@
+use std::error::Error;
+use std::ops::Deref;
+use std::sync::Arc;
+
+use teloxide::{prelude2::*, types::MessageKind, utils::command::BotCommand};
+
+use crate::{database, DbPool, token};
+use crate::user::User;
+
+#[derive(BotCommand, Clone)]
+#[command(rename = "lowercase", description = "These commands are supported:")]
+enum Command {
+ #[command(description = "display this text.")]
+ Help,
+ #[command(description = "get your personal token.")]
+ Start,
+}
+
+async fn answer(bot: AutoSend<Bot>, message: Message, command: Command, db: Arc<DbPool>)
+ -> Result<(), Box<dyn Error + Send + Sync>> {
+ match command {
+ Command::Help => {
+ bot.send_message(message.chat.id, Command::descriptions()).await?;
+ }
+ Command::Start => {
+ if let MessageKind::Common(msg) = message.kind {
+ if msg.from.is_none() {
+ return Ok(()); // ignore messages from channel
+ }
+ let from = msg.from.unwrap();
+ let db = db.deref();
+ let chat_id = message.chat.id;
+ match database::create_user(db, User {
+ id: from.id as u64,
+ name: from.username.unwrap_or_else(|| String::from("")),
+ token: token::generate(),
+ chat_id: chat_id as u64,
+ }).await {
+ Ok(_) => {}
+ Err(why) => println!("cannot create user: {:?}", why),
+ }
+ bot.send_message(
+ chat_id,
+ match database::get_user_by_chat_id(db, chat_id as u64).await? {
+ Some(user) =>
+ format!("Your token is `{}`. Treat it as a secret!", user.token),
+ _ =>
+ String::from("Error: cannot fetch token.")
+ },
+ ).await?;
+ }
+ }
+ };
+ Ok(())
+}
+
+pub async fn repl(bot: Bot, db: Arc<database::DbPool>) {
+ teloxide::repls2::commands_repl(
+ bot.auto_send(),
+ move |bot, msg, cmd|
+ answer(bot, msg, cmd, Arc::clone(&db)), Command::ty(),
+ ).await;
+}