gluon/src/handlers/actions/mute.rs

92 lines
2.6 KiB
Rust
Raw Normal View History

2024-05-30 23:37:47 +03:00
use telers::{
event::{telegram::HandlerResult, EventReturn},
types::{Message, User},
Bot,
};
2024-06-02 01:30:52 +03:00
use tokio::time::{sleep, Duration};
2024-05-30 23:37:47 +03:00
use crate::{
types::{
enums::time_metrics::TimeMetrics,
structs::{
2024-06-02 01:30:52 +03:00
countable_time::CountableTime, handler_entity::HandlerEntity,
message_sender::MessageSenderBuilder,
2024-05-30 23:37:47 +03:00
},
traits::countable_interface::ICountable,
},
2024-06-02 01:30:52 +03:00
utils::{
general::unrestrict_date::unrestrict_date,
telegram::{restrict::restrict, try_do::try_restrict},
},
2024-05-30 23:37:47 +03:00
};
2024-06-02 01:30:52 +03:00
type HandlerEntityExtract = (Bot, Message, MessageSenderBuilder);
type TimeValues = (TimeMetrics, u64);
2024-05-30 23:37:47 +03:00
2024-06-02 01:30:52 +03:00
pub async fn mute(
handler_entity: HandlerEntity,
chat_id: i64,
values: TimeValues,
) -> HandlerResult {
let (bot, message, sender_builder): HandlerEntityExtract = (
handler_entity.bot_instance,
handler_entity.message_reciever,
handler_entity.message_sender_builder,
2024-05-30 23:37:47 +03:00
);
2024-06-02 01:30:52 +03:00
let (metric, delay): TimeValues = values;
2024-05-30 23:37:47 +03:00
let reply_to: Message;
if let Some(msg) = message.reply_to_message() {
reply_to = msg.clone();
} else {
2024-06-02 01:30:52 +03:00
sender_builder
2024-05-30 23:37:47 +03:00
.reply_to(message.id())
2024-06-02 01:30:52 +03:00
.text("Ответьте на сообщение, чтобы забанить.")
.build()
2024-05-30 23:37:47 +03:00
.send(&bot)
.await?;
return Ok(EventReturn::Cancel);
}
2024-06-02 01:30:52 +03:00
sleep(Duration::from_millis(delay)).await;
2024-05-30 23:37:47 +03:00
2024-06-02 01:30:52 +03:00
let user: &User = reply_to.from().unwrap();
let time_duration = metric.extract();
2024-05-30 23:37:47 +03:00
let postfix = CountableTime::from_value(time_duration)
2024-06-02 01:30:52 +03:00
.get_postfix(metric)
2024-05-30 23:37:47 +03:00
.unwrap();
2024-06-02 01:30:52 +03:00
let unmute_date = unrestrict_date(time_duration);
let future = || async { restrict(&bot, user.id, unmute_date, chat_id).await };
let demote_args: (&Bot, i64, i64) = (&bot, user.id, chat_id);
2024-05-30 23:37:47 +03:00
2024-06-02 01:30:52 +03:00
let failure = sender_builder
2024-05-30 23:37:47 +03:00
.clone()
.text("Невозможно замьютить участника чата, демотните и попробуйте снова");
2024-06-02 01:30:52 +03:00
if try_restrict(future, demote_args, failure.build())
2024-05-30 23:37:47 +03:00
.await
.is_err()
{
Ok(EventReturn::Cancel)
} else {
let muted_user_name = reply_to.from().unwrap().clone().username.unwrap();
2024-06-02 01:30:52 +03:00
sender_builder
2024-05-30 23:37:47 +03:00
.reply_to(message.id())
.text(format!(
"Пользователь {} замьючен на {:?} {}.",
muted_user_name, time_duration, postfix
))
2024-06-02 01:30:52 +03:00
.build()
2024-05-30 23:37:47 +03:00
.send(&bot)
.await?;
Ok(EventReturn::Finish)
}
}