From c9eb89d4e807bc3292773cbcba771798a1338e0f Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 2 Mar 2024 04:55:23 +0200 Subject: [PATCH] implement op command to give myself admin permissions --- src/bot.rs | 1 + src/bot/bot.rs | 10 ++++++++-- src/bot/op.rs | 30 ++++++++++++++++++++++++++++++ src/db/user.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/bot/op.rs create mode 100644 src/db/user.rs diff --git a/src/bot.rs b/src/bot.rs index 3ae8ce4..7e137ac 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -1,4 +1,5 @@ pub mod bot; pub mod dl; +pub mod op; pub mod sanitize; pub mod types; diff --git a/src/bot/bot.rs b/src/bot/bot.rs index ceb293e..0ed28c1 100644 --- a/src/bot/bot.rs +++ b/src/bot/bot.rs @@ -9,10 +9,12 @@ use teloxide::dispatching::{dialogue, dialogue::InMemStorage, UpdateHandler}; use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands}; use tracing::{event, Level}; -use super::dl::cmd_download; use super::types::*; use crate::db::DbPool; +use super::dl::cmd_download; +use super::op::cmd_op; + fn parse_env(name: &str) -> T where T: FromStr, @@ -54,7 +56,8 @@ fn schema() -> UpdateHandler { let command_handler = teloxide::filter_command::() .branch(case![Command::Test].endpoint(cmd_test)) - .branch(case![Command::Download(url)].endpoint(cmd_download)); + .branch(case![Command::Download(url)].endpoint(cmd_download)) + .branch(case![Command::OP].endpoint(cmd_op)); let message_handler = Update::filter_message().branch(command_handler); let raw_message_handler = Update::filter_message().branch(dptree::endpoint(handle_message)); @@ -71,6 +74,9 @@ enum Command { #[command(alias = "dl")] Download(String), + + #[command(alias = "op")] + OP } async fn cmd_test(bot: Bot, msg: Message, _db: DbPool) -> HandlerResult { diff --git a/src/bot/op.rs b/src/bot/op.rs new file mode 100644 index 0000000..975c0da --- /dev/null +++ b/src/bot/op.rs @@ -0,0 +1,30 @@ +use sqlx::Row; +use teloxide::prelude::*; +use tracing::{event, Level}; + +use super::types::HandlerResult; +use crate::db::{user::create_user, DbPool}; + +pub async fn cmd_op(bot: Bot, msg: Message, db: DbPool) -> HandlerResult { + let admins: i64 = sqlx::query("SELECT COUNT(*) FROM user WHERE is_admin = 1") + .fetch_one(&db) + .await? + .get(0); + + if let Some(user) = msg.from() { + if admins == 0 { + let user = create_user(db, user, true, true).await?; + event!( + Level::INFO, + "opped {} - {}", + user.tg_id, + user.username.unwrap_or(user.first_name) + ); + bot.send_message(msg.chat.id, "Now you're an admin").await?; + } else { + bot.send_message(msg.chat.id, "You can't do that anymore").await?; + } + } + + Ok(()) +} diff --git a/src/db/user.rs b/src/db/user.rs new file mode 100644 index 0000000..d9413df --- /dev/null +++ b/src/db/user.rs @@ -0,0 +1,30 @@ +use teloxide::types; + +use super::{DbPool, User}; + +pub async fn create_user( + db: DbPool, + user: &types::User, + can_download: bool, + is_admin: bool, +) -> Result { + sqlx::query( + "INSERT OR IGNORE INTO user + (tg_id, username, first_name, last_name, can_download, is_admin) + VALUES ($1,$2,$3,$4,$5,$6);", + ) + .bind(user.id.0 as i64) + .bind(&user.username) + .bind(&user.first_name) + .bind(&user.last_name) + .bind(can_download as i64) + .bind(is_admin as i64) + .execute(&db) + .await?; + + let user: User = sqlx::query_as("SELECT * FROM user WHERE tg_id = $1 LIMIT 1;") + .bind(user.id.0 as i64) + .fetch_one(&db) + .await?; + Ok(user) +}