use maxbot::{
Attachment, AttachmentData, ContactData, Dispatcher, MaxClient, SendMessageParamsBuilder,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let bot = MaxClient::from_env().expect("MAXBOT_TOKEN not set");
let mut dp = Dispatcher::new(bot);
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();
let text = ctx.text().unwrap_or("").to_string();
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(())
}