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)
|
|
|
|
}
|
|
|
|
}
|