use maxbot::{Dispatcher, MaxClient};
use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::Mutex;
type ChatStore = Arc<Mutex<HashSet<i64>>>;
#[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);
let store: ChatStore = Arc::new(Mutex::new(HashSet::new()));
let store_clone = store.clone();
dp.on_bot_added(move |ctx| {
let store = store_clone.clone();
async move {
if let Some(chat_id) = ctx.chat_id() {
let mut guard = store.lock().await;
if guard.insert(chat_id) {
println!("✅ Бот добавлен в новый чат: {}", chat_id);
let _ = ctx.reply_text(&format!(
"Привет! Я бот. Мой ID в этом чате: `{}`",
chat_id
)).await;
}
}
Ok(())
}
});
let store_clone = store.clone();
dp.on_bot_started(move |ctx| {
let store = store_clone.clone();
async move {
if let Some(chat_id) = ctx.chat_id() {
let mut guard = store.lock().await;
if guard.insert(chat_id) {
println!("✅ Бот запущен в чате: {}", chat_id);
}
let _ = ctx.reply_text(&format!(
"Ваш chat_id: `{}`\nИспользуйте /list для просмотра всех сохранённых чатов.",
chat_id
)).await;
}
Ok(())
}
});
let store_clone = store.clone();
dp.on_bot_removed(move |ctx| {
let store = store_clone.clone();
async move {
if let Some(chat_id) = ctx.chat_id() {
let mut guard = store.lock().await;
if guard.remove(&chat_id) {
println!("❌ Бот удалён из чата: {}", chat_id);
}
}
Ok(())
}
});
let store_clone = store.clone();
dp.on_command("/list", move |ctx| {
let store = store_clone.clone();
async move {
let guard = store.lock().await;
if guard.is_empty() {
ctx.reply_text("Нет сохранённых чатов. Добавьте бота в группу или напишите /start в личку.")
.await?;
} else {
let mut response = String::from("Сохранённые chat_id:\n");
for id in guard.iter() {
response.push_str(&format!("- {}\n", id));
}
ctx.reply_text(&response).await?;
}
Ok(())
}
});
let store_clone = store.clone();
dp.on_command("/clear", move |ctx| {
let store = store_clone.clone();
async move {
let mut guard = store.lock().await;
guard.clear();
ctx.reply_text("Хранилище очищено.").await?;
Ok(())
}
});
println!("🔄 Бот запущен. Собираю chat_id из событий.");
println!("📋 Используйте команду /list для просмотра всех сохранённых чатов.");
println!(" /clear для очистки списка.");
dp.start_polling().await;
Ok(())
}