1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! Webhook-бот на Actix-web.
//!
//! Отвечает pong на любое текстовое сообщение.
//!
//! # Запуск
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! cargo run --example webhook-bot --features webhook
//! ```
//!
//! После запуска необходимо зарегистрировать webhook в MAX (однократно):
//! ```rust,no_run
//! # use maxbot::MaxClient;
//! # async fn reg() {
//! let client = MaxClient::from_env().unwrap();
//! client.create_subscription("https://your-domain.com/webhook", vec![], Some("my_secret_123")).await.unwrap();
//! # }
//! ```
//!
//! MAX будет присылать обновления на `POST /webhook`.
//! Убедитесь, что ваш сервер доступен по HTTPS (порт 443), например, через nginx.
use maxbot::{Dispatcher, MaxClient};
use maxbot::webhook::WebhookServer;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let bot = MaxClient::from_env().expect("MAXBOT_TOKEN not set");
let mut dp = Dispatcher::new(bot);
// Обработчик всех текстовых сообщений
dp.on_message(|ctx| async move {
if let Some(text) = ctx.text() {
if text.trim().eq_ignore_ascii_case("ping") {
ctx.reply_text("pong").await?;
} else {
ctx.reply_text(&format!("echo: {}", text)).await?;
}
}
Ok(())
});
// Стартовый обработчик (выполнится один раз)
dp.on_start(|_ctx| async move {
println!("Webhook bot started");
Ok(())
});
// Запускаем actix-web сервер
WebhookServer::new(dp)
.secret("my_secret_123") // должен совпадать с тем, что передан в create_subscription
.path("/webhook")
.serve("0.0.0.0:8443") // порт 8443 за прокси, который реализует HTTPS
.await
}