Compare commits
No commits in common. "7b31cccf314b819e21836d9b0d4a434fa9982b6a" and "9a64001926a79e2639cb31269889921f2b53cc6c" have entirely different histories.
7b31cccf31
...
9a64001926
|
@ -1,12 +0,0 @@
|
|||
<b>Команды (для админов)</b>
|
||||
|
||||
<code>/mute {ID | REPLY} <DURATION> [TIME METRIC]</code> - выдаёт мут на заданное время;
|
||||
<code>/unmute {ID | REPLY}</code> - снимает мут;
|
||||
|
||||
Для более подробного описания, введите команды без аргументов.
|
||||
|
||||
<b>Эмодзи (для админов)</b>
|
||||
|
||||
🎲 - выдаёт мут пользователю на случайно заданное время (от 1 до 6 дней);
|
||||
🎰 - выдаёт мут пользователю на случайно заданное время (от 1 до 63 дней), в случае джекпота участник отправляется в бан.
|
||||
|
|
@ -3,7 +3,6 @@ use std::include_str;
|
|||
pub mod files {
|
||||
use super::*;
|
||||
|
||||
pub const HELP_COMMAND_TEXT: &str = include_str!("help_command.html");
|
||||
pub const MUTE_COMMAND_HELP: &str = include_str!("mute_command_help.html");
|
||||
pub const UNMUTE_COMMAND_HELP: &str = include_str!("unmute_command_help.html");
|
||||
}
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
<code>/mute {ID | REPLY} <DURATION> [TIME METRIC]</code>
|
||||
<code>/mute [ID | REPLY] <DURATION> [TIME METRIC]</code>
|
||||
|
||||
<b>Выдаёт мут.</b>
|
||||
<b>Выдать мут участнику чата.</b>
|
||||
|
||||
Использовать при ответе на сообщение или указать ID пользователя.
|
||||
Использовать при ответе на сообщение или указать <code>ID</code> пользователя.
|
||||
|
||||
<b><em>1. ID | REPLY.</em></b> ID или ответ на сообщение пользователя;
|
||||
<b><em>2. DURATION.</em></b> Продолжительность мута (DURATION > 0);
|
||||
<b><em>3. TIME METRIC.</em></b> Временная метрика. Измеряется в минутах/часах/днях/неделях/месяцах. По умолчанию применяется в днях.
|
||||
|
||||
<b><u>Команда доступна только администраторам.</u></b>
|
||||
<i>DURATION<i> - длительность мута.
|
||||
<i>TIME METRIC<i> - метрика времени в секундах, минутах, часах и днях ([s|min|h|d|w|m]/[с|мин|ч|д|н|м]); по умолчанию используются дни.
|
||||
|
||||
Доступно для пользователей с административными привилегиями в чате.
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<code>/unmute {ID | REPLY}</code>
|
||||
<code>/unmute [ID | UNMUTE]</code>
|
||||
|
||||
<b>Cнимает мут с пользователя.</b>
|
||||
<b>Снять мут с участника чата.</b>
|
||||
|
||||
<b><em>1. ID | REPLY.</em></b> ID или ответ на сообщение пользователя.
|
||||
|
||||
<b><u>Команда доступна только администраторам.</u></b>
|
||||
Использовать при ответе на сообщение или указать <code>ID</code> пользователя.
|
||||
|
||||
Доступно для пользователей с административными привилегиями в чате.
|
||||
|
|
|
@ -25,7 +25,7 @@ pub async fn ban_member(
|
|||
Some(id) => id,
|
||||
None => {
|
||||
sender_builder
|
||||
.text("Нет ID или ответа на сообщение пользователя.")
|
||||
.text("ban: нет ответа на сообщение пользователя.")
|
||||
.reply_to(message.id())
|
||||
.build()
|
||||
.send(&bot)
|
||||
|
@ -39,19 +39,21 @@ pub async fn ban_member(
|
|||
|
||||
let callback = || async { ban_chat_member(&bot, user_id, chat_id).await };
|
||||
let demote_args: (&Bot, i64, i64) = (&bot, user_id, chat_id);
|
||||
sender_builder.set_text("Невозможно забанить пользователя.");
|
||||
sender_builder
|
||||
.set_text("ban: невозможно забанить пользователя.");
|
||||
|
||||
if try_restrict(callback, demote_args, sender_builder.clone().build())
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
sender_builder.build().send(&bot).await?;
|
||||
Ok(EventReturn::Cancel)
|
||||
} else {
|
||||
let banned_user_name: String = user.get_user_name(&bot, &message).await.unwrap();
|
||||
|
||||
sender_builder
|
||||
.reply_to(message.id())
|
||||
.text(format!("Пользователь {banned_user_name} забанен."))
|
||||
.text(format!("ban: пользователь {} забанен.", banned_user_name))
|
||||
.build()
|
||||
.send(&bot)
|
||||
.await?;
|
||||
|
|
|
@ -25,7 +25,19 @@ pub async fn mute_member(
|
|||
) -> HandlerResult {
|
||||
let (bot, message, mut sender_builder): ExtractedEntityData = handler_entity.extract();
|
||||
|
||||
let user_id: i64 = user.get_id().unwrap();
|
||||
let user_id: i64 = match user.get_id() {
|
||||
Some(id) => id,
|
||||
None => {
|
||||
sender_builder
|
||||
.text("mute: нет ответа на сообщение пользователя.")
|
||||
.reply_to(message.id())
|
||||
.build()
|
||||
.send(&bot)
|
||||
.await
|
||||
.unwrap();
|
||||
return Ok(EventReturn::Cancel);
|
||||
}
|
||||
};
|
||||
|
||||
sleep(Duration::from_millis(time.1)).await;
|
||||
|
||||
|
@ -34,12 +46,13 @@ pub async fn mute_member(
|
|||
|
||||
let callback = || async { restrict(&bot, user_id, unmute_date, chat_id).await };
|
||||
|
||||
sender_builder.set_text("Невозможно выдать мут.");
|
||||
sender_builder.set_text("mute: невозможно выдать мут.");
|
||||
|
||||
if try_restrict(callback, demote_args, sender_builder.clone().build())
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
sender_builder.build().send(&bot).await?;
|
||||
Ok(EventReturn::Cancel)
|
||||
} else {
|
||||
let muted_user_name: String = user.get_user_name(&bot, &message).await.unwrap();
|
||||
|
@ -47,7 +60,8 @@ pub async fn mute_member(
|
|||
sender_builder
|
||||
.reply_to(message.id())
|
||||
.text(format!(
|
||||
"Пользователю {muted_user_name} выдан мут на {mute_duration} {postfix}."
|
||||
"mute: пользователю {} выдан мут на {:?} {}.",
|
||||
muted_user_name, mute_duration, postfix
|
||||
))
|
||||
.build()
|
||||
.send(&bot)
|
||||
|
|
|
@ -28,7 +28,9 @@ pub async fn unmute_member(
|
|||
|
||||
if let Err(error) = bot.send(bot_action).await {
|
||||
sender_builder
|
||||
.text(format!("Невозможно снять мут с пользователя: {error:?}."))
|
||||
.text(format!(
|
||||
"unmute: невозможно снять мут с пользователя: {error:?}"
|
||||
))
|
||||
.build()
|
||||
.send(&bot)
|
||||
.await?;
|
||||
|
@ -38,7 +40,7 @@ pub async fn unmute_member(
|
|||
|
||||
sender_builder
|
||||
.reply_to(message.id())
|
||||
.text(format!("С пользователя {muted_user_name} снят мут."))
|
||||
.text(format!("unmute: пользователю {} удален мут.", muted_user_name))
|
||||
.build()
|
||||
.send(&bot)
|
||||
.await
|
||||
|
|
|
@ -1,16 +1,28 @@
|
|||
use telers::{
|
||||
enums::parse_mode::ParseMode,
|
||||
event::{telegram::HandlerResult, EventReturn},
|
||||
types::Message,
|
||||
Bot,
|
||||
};
|
||||
|
||||
use crate::{assets::files::HELP_COMMAND_TEXT, types::structs::message_sender::MessageSender};
|
||||
use crate::types::structs::message_sender::MessageSender;
|
||||
|
||||
const HELP_TEXT: &str = "\
|
||||
Команды:\n\
|
||||
/unmute [ID] - снять мут с участника чата.\n\
|
||||
/mute [ID] - выдать мут участнику чата.\n\
|
||||
\n\
|
||||
Для получения подробной помощи по командам использовать их без аргументов.\n\
|
||||
\n\
|
||||
Эмодзи:\n\
|
||||
Отправлять в чат в ответ на сообщение другого пользователя.\n\
|
||||
\n\
|
||||
🎲 - мут участнику чата на рандомный интервал времени.\n\
|
||||
🎰 - мут участнику чата на рандомный интервал времени; выпадание джекпота \
|
||||
отправляет в бан.";
|
||||
|
||||
pub async fn help(bot: Bot, message: Message) -> HandlerResult {
|
||||
MessageSender::builder(message.chat().id())
|
||||
.text(HELP_COMMAND_TEXT)
|
||||
.parse_mode(ParseMode::HTML)
|
||||
.text(HELP_TEXT)
|
||||
.build()
|
||||
.send(&bot)
|
||||
.await
|
||||
|
|
|
@ -35,9 +35,8 @@ pub async fn mute(bot: Bot, message: Message, command: CommandObject) -> Handler
|
|||
if let Ok(id) = raw_id.parse::<i64>() {
|
||||
TargetUser::Id(id)
|
||||
} else {
|
||||
handler_entity
|
||||
.message_sender_builder
|
||||
.text("Нет ID или ответа на сообщение пользователя.")
|
||||
handler_entity.message_sender_builder
|
||||
.text("mute: нет ответа на сообщение или не указано ID пользователя.")
|
||||
.build()
|
||||
.send(&handler_entity.bot_instance)
|
||||
.await?;
|
||||
|
@ -60,7 +59,7 @@ pub async fn mute(bot: Bot, message: Message, command: CommandObject) -> Handler
|
|||
|
||||
handler_entity
|
||||
.message_sender_builder
|
||||
.set_text("Не указана длительность мута.");
|
||||
.set_text("mute: не указана длительность (число).");
|
||||
|
||||
match args.get(duration_argument_position).cloned() {
|
||||
Some(duration_str) => {
|
||||
|
|
|
@ -27,7 +27,7 @@ pub async fn unmute(bot: Bot, message: Message, command: CommandObject) -> Handl
|
|||
Some(raw_id) => {
|
||||
handler_entity
|
||||
.message_sender_builder
|
||||
.set_text("Нет ID или ответа на сообщение пользователя.");
|
||||
.set_text("unmute: ID пользователя не указан.");
|
||||
|
||||
if let Ok(parsed_id) = raw_id.parse::<i64>() {
|
||||
let on_id: TargetUser = TargetUser::Id(parsed_id);
|
||||
|
|
|
@ -22,20 +22,8 @@ pub async fn dice_handler(bot: Bot, message: Message) -> HandlerResult {
|
|||
let handler_entity: HandlerEntity = HandlerEntity::new(bot, message, sender);
|
||||
|
||||
let (mute_time, emoji): (TimeMetrics, &str) = (TimeMetrics::Days(dice.value), &dice.emoji);
|
||||
|
||||
let target: TargetUser = TargetUser::Reply(handler_entity.message_reciever.clone());
|
||||
|
||||
if !target.exist() {
|
||||
handler_entity
|
||||
.message_sender_builder
|
||||
.text("Нет ответа на сообщение пользователя.")
|
||||
.build()
|
||||
.send(&handler_entity.bot_instance)
|
||||
.await?;
|
||||
|
||||
return Ok(EventReturn::Cancel);
|
||||
}
|
||||
|
||||
match emoji {
|
||||
"🎲" => {
|
||||
mute_member(handler_entity, chat_id, target, (mute_time, DICE_DELAY_MS)).await?;
|
||||
|
|
|
@ -30,10 +30,11 @@ impl InnerMiddleware for AdminCheck {
|
|||
|
||||
let chat_id: i64 = message.chat_id().unwrap();
|
||||
|
||||
if is_admin(&admins_list, message.from().unwrap().id) {
|
||||
if is_admin(&admins_list, message.from().unwrap()) {
|
||||
let response = next(request).await?;
|
||||
return Ok(response);
|
||||
} else {
|
||||
println!("lol");
|
||||
MessageSender::builder(chat_id)
|
||||
.text("Недостаточно прав для использования данной команды.")
|
||||
.build()
|
||||
|
|
|
@ -15,21 +15,6 @@ pub enum TargetUser {
|
|||
}
|
||||
|
||||
impl TargetUser {
|
||||
pub fn exist(&self) -> bool {
|
||||
match self {
|
||||
Self::Id(_id) => true,
|
||||
Self::Reply(msg) => {
|
||||
if let Some(replied_msg) = msg.reply_to_message() {
|
||||
return replied_msg.from().map(|user| user.id).is_some();
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
Self::CurrentMessage(msg) => msg.from().map(|user| user.id).is_some(),
|
||||
Self::None => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_id(&self) -> Option<i64> {
|
||||
match self {
|
||||
Self::Id(id) => Some(*id),
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
use telers::types::chat_member::ChatMember;
|
||||
use telers::types::{chat_member::ChatMember, User};
|
||||
|
||||
pub fn is_admin(all_admin_members: &Vec<ChatMember>, user_id: i64) -> bool {
|
||||
pub fn is_admin(all_admin_members: &Vec<ChatMember>, user: &User) -> bool {
|
||||
all_admin_members
|
||||
.iter()
|
||||
.any(|admin: &ChatMember| match admin {
|
||||
ChatMember::Administrator(admin) => admin.user.id == user_id,
|
||||
ChatMember::Owner(owner) => owner.user.id == user_id,
|
||||
ChatMember::Administrator(admin) => &admin.user == user,
|
||||
ChatMember::Owner(owner) => &owner.user == user,
|
||||
_ => false,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
use telers::{errors::SessionErrorKind as ErrorKind, event::EventReturn, types::ChatMember, Bot};
|
||||
use telers::{errors::SessionErrorKind as ErrorKind, event::EventReturn, Bot};
|
||||
|
||||
use crate::types::structs::message_sender::MessageSender;
|
||||
use std::future::Future;
|
||||
|
||||
use super::{admin_check::is_admin, demote::demote_user, get_all_admins::get_all_admins};
|
||||
use super::demote::demote_user;
|
||||
|
||||
const DEMOTE_FAILURE_MESSAGE: &str = "Команда не может быть выполнена: \
|
||||
не удалось удалить административные привилегии пользователя.";
|
||||
|
@ -19,18 +19,6 @@ where
|
|||
{
|
||||
let (bot, user_id, chat_id): (&Bot, i64, i64) = demote_args;
|
||||
|
||||
let admins: Vec<ChatMember> = 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)
|
||||
|
|
Loading…
Reference in New Issue