maxbot 0.7.6

Автоматизация работы с чат-ботами на платформе MAX (max.ru)
Documentation
//! Демонстрация снятия прав администратора с пользователей группового чата.
//!
//! Запуск:
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! export CHAT_ID=-1234567890
//! export USER_IDS="111,222"   # опционально
//! cargo run --example remove-chat-admin-demo
//! ```
//!
//! Если переменная USER_IDS не задана, пример запросит ввод одного user_id в интерактивном режиме.

use maxbot::MaxClient;
use std::env;
use std::io::{self, Write};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let token = env::var("MAXBOT_TOKEN").expect("Missing MAXBOT_TOKEN");
    let chat_id: i64 = env::var("CHAT_ID")
        .expect("Missing CHAT_ID")
        .parse()?;

    if let Ok(proxy_url) = env::var("MAXBOT_PROXY") {
        maxbot::set_global_base_url(proxy_url);
    }

    let client = MaxClient::new(token);

    // 1. Получаем текущий список администраторов
    println!("🔍 Текущие администраторы чата {}:", chat_id);
    let admins_before = match client.get_chat_admins(chat_id).await {
        Ok(admins) => admins,
        Err(e) => {
            eprintln!("❌ Не удалось получить список администраторов: {}", e);
            vec![]
        }
    };
    if admins_before.is_empty() {
        println!("   (нет администраторов или нет прав на просмотр)");
    } else {
        for admin in &admins_before {
            println!(
                "   - {} {} (ID: {}){}",
                admin.user.first_name,
                admin.user.last_name.as_deref().unwrap_or(""),
                admin.user.user_id,
                if admin.is_owner { " [владелец]" } else { "" }
            );
        }
    }

    // 2. Определяем, у кого снимать права
    let user_ids: Vec<i64> = if let Ok(ids_str) = env::var("USER_IDS") {
        ids_str
            .split(',')
            .filter_map(|s| s.trim().parse().ok())
            .collect()
    } else {
        print!("Введите user_id пользователя для снятия прав администратора: ");
        io::stdout().flush()?;
        let mut input = String::new();
        io::stdin().read_line(&mut input)?;
        if let Ok(id) = input.trim().parse() {
            vec![id]
        } else {
            println!("❌ Некорректный ввод, завершаем.");
            return Ok(());
        }
    };

    if user_ids.is_empty() {
        println!("❌ Нет user_id для снятия прав.");
        return Ok(());
    }

    // 3. Снимаем права с первого пользователя (демо одиночного удаления)
    let first_id = user_ids[0];
    println!("\n📌 Снимаем права администратора с пользователя {}...", first_id);
    match client.remove_chat_admin(chat_id, first_id).await {
        Ok(()) => println!("✅ Права администратора сняты с пользователя {}.", first_id),
        Err(e) => eprintln!("❌ Ошибка при снятии прав: {}", e),
    }

    // 4. Если есть ещё пользователи, снимаем права массово
    if user_ids.len() > 1 {
        println!("\n📌 Снимаем права администратора с остальных пользователей массово...");
        let rest_ids = user_ids[1..].to_vec();
        match client.remove_chat_admins(chat_id, rest_ids).await {
            Ok(()) => println!("✅ Попытки снятия прав завершены."),
            Err(e) => eprintln!("❌ Ошибка при массовом снятии прав: {}", e),
        }
    }

    // 5. Повторно выводим список администраторов для проверки
    println!("\n🔍 Обновлённый список администраторов:");
    match client.get_chat_admins(chat_id).await {
        Ok(admins) => {
            if admins.is_empty() {
                println!("   (нет администраторов)");
            } else {
                for admin in admins {
                    println!(
                        "   - {} {} (ID: {}){}",
                        admin.user.first_name,
                        admin.user.last_name.as_deref().unwrap_or(""),
                        admin.user.user_id,
                        if admin.is_owner { " [владелец]" } else { "" }
                    );
                }
            }
        }
        Err(e) => eprintln!("❌ Не удалось получить обновлённый список: {}", e),
    }

    Ok(())
}