gluon/src/utils/telegram/try_do.rs

44 lines
1.4 KiB
Rust

use telers::{errors::SessionErrorKind as ErrorKind, event::EventReturn, Bot};
use crate::types::structs::message_sender::MessageSender;
use std::future::Future;
use super::demote::demote_user;
const DEMOTE_FAILURE_MESSAGE: &str = "\
Нельзя выдать ограничение пользователю, т.к. невозможно демотнуть \
участника посредством бота, если ему выдан админ при помощи других \
админов или владельца чата.\
";
pub async fn try_restrict<F, R>(
future_callback: F,
demote_args: (&Bot, i64, i64),
failure_sender: MessageSender,
) -> Result<(), EventReturn>
where
R: Future<Output = Result<bool, ErrorKind>>,
F: Copy + Fn() -> R,
{
let (bot, user_id, chat_id): (&Bot, i64, i64) = demote_args;
if future_callback().await.is_err() {
if demote_user(bot, user_id, chat_id).await.is_err() {
MessageSender::builder(chat_id)
.text(DEMOTE_FAILURE_MESSAGE)
.build()
.send(bot)
.await
.unwrap();
return Err(EventReturn::Cancel);
}
if future_callback().await.is_err() {
failure_sender.send(bot).await.unwrap();
return Err(EventReturn::Cancel);
}
}
Ok(())
}