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);
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);
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)
]
});
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;
}
}
}
}