mod common;
use botrs::{C2CMessage, Client, Context, EventHandler, Intents, Ready, Token};
use common::{Config, init_logging};
use std::env;
use tracing::{info, warn};
struct C2CReplyHandler;
#[async_trait::async_trait]
impl EventHandler for C2CReplyHandler {
async fn ready(&self, _ctx: Context, ready: Ready) {
info!("robot 「{}」 on_ready!", ready.user.username);
}
async fn c2c_message_create(&self, ctx: Context, message: C2CMessage) {
let content = match &message.content {
Some(content) => content,
None => return,
};
info!("Received C2C message: {}", content);
let user_openid = match &message.author {
Some(author) => match &author.user_openid {
Some(openid) => openid,
None => {
warn!("C2C message author has no user_openid");
return;
}
},
None => {
warn!("C2C message has no author");
return;
}
};
let msg_id = message.id.as_deref();
let reply_content = format!("我收到了你的消息:{content}");
let params = botrs::models::message::C2CMessageParams {
msg_type: 0,
content: Some(reply_content),
msg_id: msg_id.map(|s| s.to_string()),
..Default::default()
};
match ctx
.api
.post_c2c_message_with_params(&ctx.token, user_openid, params)
.await
{
Ok(response) => {
info!("Successfully sent C2C message reply");
info!("Response: {:?}", response);
}
Err(e) => warn!("Failed to send C2C message reply: {}", e),
}
}
async fn error(&self, error: botrs::BotError) {
warn!("Event handler error: {}", error);
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
init_logging();
info!("Starting C2C reply text demo...");
let config = Config::load_with_fallback(
Some("examples/config.toml"),
env::args().nth(1), env::args().nth(2), )?;
info!("Configuration loaded successfully");
let token = Token::new(config.bot.app_id, config.bot.secret);
if let Err(e) = token.validate() {
panic!("Invalid token: {e}");
}
info!("Token validated successfully");
let intents = Intents::default().with_public_messages();
info!("Configured intents: {}", intents);
let handler = C2CReplyHandler;
let mut client = Client::new(token, intents, handler, true)?;
info!("Client created, starting bot...");
client.start().await?;
info!("Bot stopped");
Ok(())
}