maxbot 0.1.0

Автоматизация работы с чат-ботами MAX
Documentation
// examples/callback_demo.rs

use maxbot_rs::{
    MaxClient, SendMessageParamsBuilder, Attachment,
    InlineKeyboardBuilder, InlineKeyboardButton, GetUpdatesParams,
};
use serde_json::json;

#[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>()?;

    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 = json!({
                                "text": "Выбор сделан!",
                                "attachments": [
                                    {
                                        "type": "inline_keyboard",
                                        "payload": {
                                            "buttons": [
                                                [
                                                    {
                                                        "type": "link",
                                                        "text": "е1.ru",
                                                        "url": "https://www.e1.ru"
                                                    }
                                                ]
                                            ]
                                        }
                                    }
                                ]
                            });

                            // Отвечаем на 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;
            }
        }
    }
}