maxbot 0.7.6

Автоматизация работы с чат-ботами на платформе MAX (max.ru)
Documentation
//! Демонстрация отправки inline-клавиатуры и обработки callback.
//!
//! # Запуск
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! export CHAT_ID=-1234567890
//! cargo run --example send-inline-keyboard-demo
//! ```

use maxbot::{
    MaxClient, SendMessageParamsBuilder, Attachment,
    InlineKeyboardBuilder, InlineKeyboardButton, GetUpdatesParams,
};

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

    let client = MaxClient::new(token);

    // 1. Отправляем сообщение с клавиатурой
    let keyboard = InlineKeyboardBuilder::new()
        .button(InlineKeyboardButton::link("е1.ru", "https://www.e1.ru"))
        .button(InlineKeyboardButton::callback("Щёлк!", "callback_data"))
        .build()?;

    let builder = SendMessageParamsBuilder::new()
        .text("Выбери действие:")
        .chat_id(chat_id)
        .attachment(Attachment::inline_keyboard(keyboard));

    let mids = client.send_message_builder(builder).await?;
    let msg_mid = mids.first().unwrap();
    println!("📤 Сообщение с клавиатурой отправлено, mid = {}", msg_mid);

    // 2. Ожидаем callback
    println!("🔄 Ожидание нажатия кнопки (Ctrl+C для выхода)...");
    let mut marker = None;
    let limit = 10;
    let timeout = 30;
    let types = vec!["message_callback".to_string()];

    loop {
        let params = GetUpdatesParams {
            marker,
            limit: Some(limit),
            timeout: Some(timeout),
            types: types.clone(),
        };
        match client.get_updates(params).await {
            Ok((updates, new_marker)) => {
                marker = new_marker;
                for update in updates {
                    if let Some(callback) = update.callback {
                        if callback.payload == "callback_data" {
                            println!("✅ Получен callback от пользователя {} (payload: {})",
                                callback.user.user_id, callback.payload);

                            // Формируем новую клавиатуру (только ссылка)
                            let new_keyboard = InlineKeyboardBuilder::new()
                                .button(InlineKeyboardButton::link("е1.ru", "https://www.e1.ru"))
                                .build()?;

                            // Создаём новое сообщение, используя структуры и сериализацию
                            let new_message_body = serde_json::json!({
                                "text": "Выбор сделан!",
                                "attachments": [
                                    Attachment::InlineKeyboard(new_keyboard)
                                ]
                            });

                            // Отвечаем на callback: обновляем сообщение и показываем уведомление
                            let success = client.answer_callback_query(
                                &callback.callback_id,
                                Some(new_message_body),
                                Some("Кнопка была нажата!"),
                            ).await?;

                            if success {
                                println!("✅ Callback обработан, сообщение обновлено.");
                            } else {
                                eprintln!("❌ Ошибка при обработке callback");
                            }
                            return Ok(());
                        }
                    }
                }
            }
            Err(e) => {
                eprintln!("Ошибка получения обновлений: {}", e);
                tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
            }
        }
    }
}