Skip to main content

combined_attachments_demo/
combined-attachments-demo.rs

1//! Демонстрация отправки сообщений с различными типами вложений:
2//! стикер, контакт, геолокация, share (ссылка), inline-клавиатура.
3//!
4//! # Запуск
5//! ```bash
6//! export MAXBOT_TOKEN="ваш_токен"
7//! export CHAT_ID=-1234567890
8//! cargo run --example combined-attachments-demo
9//! ```
10
11use maxbot::{
12    Attachment, ContactData, InlineKeyboardBuilder, InlineKeyboardButton, MaxClient,
13    SendMessageParamsBuilder, ShareData,
14};
15
16#[tokio::main]
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18    let token = std::env::var("MAXBOT_TOKEN").expect("Missing MAXBOT_TOKEN");
19    let chat_id = std::env::var("CHAT_ID")
20        .expect("Missing CHAT_ID")
21        .parse::<i64>()?;
22    if let Ok(proxy_url) = std::env::var("MAXBOT_PROXY") {
23        maxbot::set_global_base_url(proxy_url);
24    }
25
26    let client = MaxClient::new(token);
27
28    // 1. Стикер (отдельное сообщение без текста)
29    println!("Отправляем стикер...");
30    let builder = SendMessageParamsBuilder::new()
31        .chat_id(chat_id)
32        .attachment(Attachment::sticker("154ed15bb")); // реальный код стикера
33    match client.send_message_builder(builder).await {
34        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
35        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
36    }
37
38    // 2. Контакт (требуется contact_id)
39    println!("Отправляем контакт...");
40    // Здесь нужно указать реальный user_id пользователя MAX
41    // Можно взять из участников чата или использовать свой собственный ID бота
42    let me = client.get_me().await?;
43    let contact = ContactData {
44        name: Some("Мой бот".to_string()),
45        contact_id: Some(me.user.user_id),
46        vcf_info: None,
47        vcf_phone: None,
48    };
49    let builder = SendMessageParamsBuilder::new()
50        .text("Контакт:")
51        .chat_id(chat_id)
52        .attachment(Attachment::contact(contact));
53    match client.send_message_builder(builder).await {
54        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
55        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
56    }
57
58    // 3. Геолокация
59    println!("Отправляем геолокацию...");
60    let builder = SendMessageParamsBuilder::new()
61        .text("Геолокация:")
62        .chat_id(chat_id)
63        .attachment(Attachment::location(55.7558, 37.6176)); // Москва
64    match client.send_message_builder(builder).await {
65        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
66        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
67    }
68
69    // 4. Share (ссылка)
70    println!("Отправляем share (ссылку)...");
71    let share = ShareData {
72        url: Some("https://dev.max.ru".to_string()),
73        token: None,
74    };
75    let builder = SendMessageParamsBuilder::new()
76        .text("Полезная ссылка:")
77        .chat_id(chat_id)
78        .attachment(Attachment::share(share));
79    match client.send_message_builder(builder).await {
80        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
81        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
82    }
83
84    // 5. Inline-клавиатура
85    println!("Отправляем inline-клавиатуру...");
86    let keyboard = InlineKeyboardBuilder::new()
87        // Первая строка с кнопками
88        .button(InlineKeyboardButton::link("Последние новости…", "https://www.e1.ru"))
89        // Новая строка с кнопками
90        .row(vec![InlineKeyboardButton::clipboard("Скопировать код", "SECRET_2026")])
91        .button(InlineKeyboardButton::callback("Кнопка", "demo_payload"))
92        // Результат
93        .build()?;
94    let builder = SendMessageParamsBuilder::new()
95        .text("Клавиатура:")
96        .chat_id(chat_id)
97        .attachment(Attachment::inline_keyboard(keyboard));
98    match client.send_message_builder(builder).await {
99        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
100        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
101    }
102
103    // 6. Inline-клавиатура с автоматическим заполнением кнопок по строкам
104    println!("Отправляем inline-клавиатуру в 3 строки…");
105    let keyboard = InlineKeyboardBuilder::new()
106        .push_button(InlineKeyboardButton::callback("1", "1"))
107        .push_button(InlineKeyboardButton::callback("2", "2"))
108        .push_button(InlineKeyboardButton::callback("3", "3"))
109        .push_button(InlineKeyboardButton::callback("4", "4"))
110        .push_button(InlineKeyboardButton::callback("5", "5"))
111        .push_button(InlineKeyboardButton::callback("6", "6"))
112        .push_button(InlineKeyboardButton::callback("7", "7"))
113        .push_button(InlineKeyboardButton::callback("8", "8"))
114        .push_button(InlineKeyboardButton::callback("9", "9"))
115        .push_button(InlineKeyboardButton::callback("10", "10"))
116        .push_button(InlineKeyboardButton::callback("11", "11"))
117        .push_button(InlineKeyboardButton::callback("12", "12"))
118        .push_button(InlineKeyboardButton::callback("13", "13"))
119        .push_button(InlineKeyboardButton::callback("14", "14"))
120        .push_button(InlineKeyboardButton::callback("15", "15"))
121        .build()?;
122    let builder = SendMessageParamsBuilder::new()
123        .text("Автозаполняемая клавиатура 1:")
124        .chat_id(chat_id)
125        .attachment(Attachment::inline_keyboard(keyboard));
126    match client.send_message_builder(builder).await {
127        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
128        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
129    }
130
131    // 7. Inline-клавиатура с автоматическим заполнением кнопок по строкам
132    println!("Отправляем inline-клавиатуру в 2 строки…");
133    let keyboard = InlineKeyboardBuilder::new()
134        .push_button(InlineKeyboardButton::callback("A", "a"))
135        .push_button(InlineKeyboardButton::callback("B", "b"))
136        .push_button(InlineKeyboardButton::callback("C", "c"))
137        .push_button(InlineKeyboardButton::callback("D", "d"))         // Уже 4 кнопки, строка заполнена (макс 7)
138        .push_button(InlineKeyboardButton::link("Я", "https://ya.ru")) // Новая строка (спец-кнопка)
139        .push_button(InlineKeyboardButton::callback("E", "e"))         // Идёт в строку со спец-кнопкой
140        .build()?;
141    let builder = SendMessageParamsBuilder::new()
142        .text("Автозаполняемая клавиатура 2:")
143        .chat_id(chat_id)
144        .attachment(Attachment::inline_keyboard(keyboard));
145    match client.send_message_builder(builder).await {
146        Ok(ids) => println!("  ✅ mid = {:?}", ids.first().unwrap()),
147        Err(e) => eprintln!("  ❌ Ошибка: {}", e),
148    }
149
150    Ok(())
151}