From 7b31cccf314b819e21836d9b0d4a434fa9982b6a Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 8 Jun 2024 03:12:16 +0400 Subject: [PATCH] Now the admin_check function gets a second argument in the form of user_id, and this function is used in try_restrict --- src/utils/telegram/admin_check.rs | 8 ++++---- src/utils/telegram/try_do.rs | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/utils/telegram/admin_check.rs b/src/utils/telegram/admin_check.rs index e1ff368..060fa0a 100644 --- a/src/utils/telegram/admin_check.rs +++ b/src/utils/telegram/admin_check.rs @@ -1,11 +1,11 @@ -use telers::types::{chat_member::ChatMember, User}; +use telers::types::chat_member::ChatMember; -pub fn is_admin(all_admin_members: &Vec, user: &User) -> bool { +pub fn is_admin(all_admin_members: &Vec, user_id: i64) -> bool { all_admin_members .iter() .any(|admin: &ChatMember| match admin { - ChatMember::Administrator(admin) => &admin.user == user, - ChatMember::Owner(owner) => &owner.user == user, + ChatMember::Administrator(admin) => admin.user.id == user_id, + ChatMember::Owner(owner) => owner.user.id == user_id, _ => false, }) } diff --git a/src/utils/telegram/try_do.rs b/src/utils/telegram/try_do.rs index ca90bc3..a6d5635 100644 --- a/src/utils/telegram/try_do.rs +++ b/src/utils/telegram/try_do.rs @@ -1,9 +1,9 @@ -use telers::{errors::SessionErrorKind as ErrorKind, event::EventReturn, Bot}; +use telers::{errors::SessionErrorKind as ErrorKind, event::EventReturn, types::ChatMember, Bot}; use crate::types::structs::message_sender::MessageSender; use std::future::Future; -use super::demote::demote_user; +use super::{admin_check::is_admin, demote::demote_user, get_all_admins::get_all_admins}; const DEMOTE_FAILURE_MESSAGE: &str = "Команда не может быть выполнена: \ не удалось удалить административные привилегии пользователя."; @@ -19,6 +19,18 @@ where { let (bot, user_id, chat_id): (&Bot, i64, i64) = demote_args; + let admins: Vec = get_all_admins(bot, chat_id).await.unwrap(); + + if is_admin(&admins, user_id) { + MessageSender::builder(chat_id) + .text("Нельзя применить эту команду на администраторе или бота.") + .build() + .send(bot) + .await + .unwrap(); + return Err(EventReturn::Cancel); + } + if future_callback().await.is_err() { if demote_user(bot, user_id, chat_id).await.is_err() { MessageSender::builder(chat_id)