use crate::{
errors::UserBotError,
userbot::{CommandHandlerResult, UserBot},
*,
};
use grammers_client::types::{InputMessage, Message};
use reusable_fmt::fmt;
use std::cmp::min;
pub async fn msg_del(bot: &mut UserBot, message: &mut Message) -> CommandHandlerResult {
let rep = bot
.get_reply_to_message(message)
.await
.ok_or(UserBotError::NoArguments)?;
let chat = message.chat();
if bot.client.delete_messages(&chat, &[rep.id()]).await? != 0 {
bot.client.delete_messages(&chat, &[message.id()]).await?;
Ok(())
} else {
Err(UserBotError::MessageDeleteFailed)
}
}
pub async fn purge_msg(bot: &mut UserBot, message: &mut Message) -> CommandHandlerResult {
let rep = bot
.get_reply_to_message(message)
.await
.ok_or(UserBotError::NoArguments)?;
let chat = message.chat();
let mut futs = Vec::new();
let mut msg_iter = bot.client.iter_messages(&chat);
let mut ids = Vec::<i32>::new(); while let Some(msg) = msg_iter.next().await? {
ids.push(msg.id());
if msg.id() == rep.id() {
break;
}
}
loop {
let chat_c = chat.clone();
let handle_c = bot.client.clone();
let col: Vec<i32> = ids.drain(..min(ids.len(), 100)).collect(); futs.push(tokio::spawn(async move {
handle_c.delete_messages(&chat_c, &col).await.unwrap_or(0)
}));
if ids.is_empty() {
break;
}
}
let mut num_del: usize = 0;
for fut in futs {
num_del += fut.await.unwrap_or(0);
}
message
.respond(InputMessage::markdown(fmt!(PURGED_TEMPLATE, num_del)))
.await?;
Ok(())
}