42 lines
1.3 KiB
Rust
42 lines
1.3 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::new(chat_id)
|
|||
|
.text(DEMOTE_FAILURE_MESSAGE)
|
|||
|
.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(())
|
|||
|
}
|