maxbot 0.7.5

Автоматизация работы с чат-ботами на платформе MAX (max.ru)
Documentation
//! Простой эхо-бот с использованием диспетчера.
//!
//! Запуск:
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! cargo run --example echo-bot
//! ```

use maxbot::{
    Attachment, AttachmentData, ContactData, Dispatcher, MaxClient, SendMessageParamsBuilder,
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Инициализируем клиент из переменной окружения MAXBOT_TOKEN
    let bot = MaxClient::from_env().expect("MAXBOT_TOKEN not set");

    // Создаём диспетчер
    let mut dp = Dispatcher::new(bot);

    // Обработчик команды /start
    dp.on_command("/start", |ctx| async move {
        ctx.reply_markdown("Привет! Я эхо-бот.\nОтправь мне любое сообщение, и я отвечу тем же.").await?;
        Ok(())
    });

    // Обработчик любого сообщения (эхо)
    dp.on_message(|ctx| async move {
        let chat_id = ctx.chat_id().unwrap();

        // 1. Текст
        let text = ctx.text().unwrap_or("").to_string();

        // 2. Вложения
        let mut attachments = Vec::new();
        if let Some(msg) = ctx.message() {
            if let Some(body) = &msg.body {
                // Обработка вложений
                for att in &body.attachments {
                    match att {
                        AttachmentData::Image { payload } => {
                            if let Some(token) = &payload.token {
                                attachments.push(Attachment::image_token(token));
                            }
                        }
                        AttachmentData::Video { payload } => {
                            if let Some(token) = &payload.token {
                                attachments.push(Attachment::video_token(token));
                            }
                        }
                        AttachmentData::Audio { payload } => {
                            if let Some(token) = &payload.token {
                                attachments.push(Attachment::audio_token(token));
                            }
                        }
                        AttachmentData::File { payload } => {
                            if let Some(token) = &payload.token {
                                attachments.push(Attachment::file_token(token));
                            }
                        }
                        AttachmentData::Sticker { payload } => {
                            attachments.push(Attachment::sticker(&payload.code));
                        }
                        AttachmentData::InlineKeyboard { .. } => {
                            unimplemented!("Ignore keyboard");
                        }
                        AttachmentData::Location { payload } => {
                            attachments.push(Attachment::location(payload.latitude, payload.longitude));
                        }
                        AttachmentData::Contact { payload } => {
                            let contact_data = ContactData {
                                name: payload.name.clone(),
                                contact_id: payload.contact_id,
                                vcf_info: payload.vcf_info.clone(),
                                vcf_phone: payload.vcf_phone.clone(),
                            };
                            attachments.push(Attachment::contact(contact_data));
                        }
                        _ => {}
                    }
                }
            }
        }

        let params = SendMessageParamsBuilder::new()
            .text(&text)
            .chat_id(chat_id)
            .attachments(attachments)
            .build();
        ctx.bot().send_message(params).await?;
        Ok(())
    });

    println!("Бот запущен. Нажмите Ctrl+C для остановки.");
    dp.start_polling().await;

    Ok(())
}