implement op command to give myself admin permissions
This commit is contained in:
parent
cd92f2de43
commit
296aa0f043
4 changed files with 69 additions and 2 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
pub mod bot;
|
pub mod bot;
|
||||||
pub mod dl;
|
pub mod dl;
|
||||||
|
pub mod op;
|
||||||
pub mod sanitize;
|
pub mod sanitize;
|
||||||
pub mod types;
|
pub mod types;
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,12 @@ use teloxide::dispatching::{dialogue, dialogue::InMemStorage, UpdateHandler};
|
||||||
use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands};
|
use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands};
|
||||||
use tracing::{event, Level};
|
use tracing::{event, Level};
|
||||||
|
|
||||||
use super::dl::cmd_download;
|
|
||||||
use super::types::*;
|
use super::types::*;
|
||||||
use crate::db::DbPool;
|
use crate::db::DbPool;
|
||||||
|
|
||||||
|
use super::dl::cmd_download;
|
||||||
|
use super::op::cmd_op;
|
||||||
|
|
||||||
fn parse_env<T>(name: &str) -> T
|
fn parse_env<T>(name: &str) -> T
|
||||||
where
|
where
|
||||||
T: FromStr,
|
T: FromStr,
|
||||||
|
|
@ -54,7 +56,8 @@ fn schema() -> UpdateHandler<HandlerErr> {
|
||||||
|
|
||||||
let command_handler = teloxide::filter_command::<Command, _>()
|
let command_handler = teloxide::filter_command::<Command, _>()
|
||||||
.branch(case![Command::Test].endpoint(cmd_test))
|
.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 message_handler = Update::filter_message().branch(command_handler);
|
||||||
let raw_message_handler = Update::filter_message().branch(dptree::endpoint(handle_message));
|
let raw_message_handler = Update::filter_message().branch(dptree::endpoint(handle_message));
|
||||||
|
|
@ -71,6 +74,9 @@ enum Command {
|
||||||
|
|
||||||
#[command(alias = "dl")]
|
#[command(alias = "dl")]
|
||||||
Download(String),
|
Download(String),
|
||||||
|
|
||||||
|
#[command(alias = "op")]
|
||||||
|
OP
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn cmd_test(bot: Bot, msg: Message, _db: DbPool) -> HandlerResult {
|
async fn cmd_test(bot: Bot, msg: Message, _db: DbPool) -> HandlerResult {
|
||||||
|
|
|
||||||
30
src/bot/op.rs
Normal file
30
src/bot/op.rs
Normal file
|
|
@ -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(())
|
||||||
|
}
|
||||||
30
src/db/user.rs
Normal file
30
src/db/user.rs
Normal file
|
|
@ -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<User, sqlx::Error> {
|
||||||
|
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)
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue