gluon/src/handlers/actions/mute.rs

71 lines
2.1 KiB
Rust

use telers::{
event::{telegram::HandlerResult, EventReturn},
Bot,
};
use tokio::time::{sleep, Duration};
use crate::{
types::{
enums::target_user::TargetUser,
structs::handler_entity::{ExtractedEntityData, HandlerEntity},
TimeValues,
},
utils::{
general::get_duration::{get_duration, ExtractedDuration},
telegram::{restrict::restrict, try_do::try_restrict},
},
};
pub async fn mute(
handler_entity: HandlerEntity,
chat_id: i64,
user: TargetUser,
time: TimeValues,
) -> HandlerResult {
let (bot, message, mut sender_builder): ExtractedEntityData = handler_entity.extract();
let user_id: i64 = match user.get_id() {
Some(id) => id,
None => {
sender_builder
.text("Ответьте на сообщение, чтобы замьютить участника чата.")
.reply_to(message.id())
.build()
.send(&bot)
.await
.unwrap();
return Ok(EventReturn::Cancel);
}
};
sleep(Duration::from_millis(time.1)).await;
let (unmute_date, postfix, mute_duration): ExtractedDuration = get_duration(time);
let demote_args: (&Bot, i64, i64) = (&bot, user_id, chat_id);
let callback = || async { restrict(&bot, user_id, unmute_date, chat_id).await };
sender_builder.set_text("Невозможно замьютить участника чата, демотните и попробуйте снова");
if try_restrict(callback, demote_args, sender_builder.clone().build())
.await
.is_err()
{
Ok(EventReturn::Cancel)
} else {
let muted_user_name = message.from().unwrap().clone().username.unwrap();
sender_builder
.reply_to(message.id())
.text(format!(
"Пользователь {} замьючен на {:?} {}.",
muted_user_name, mute_duration, postfix
))
.build()
.send(&bot)
.await?;
Ok(EventReturn::Finish)
}
}