#telegram-bot #bot #telegram #command-handler #api-bindings

telegram-bot2-macros

telegram-bot2-macros 包含了 telegram-bot2 crate 所使用的所有宏

4 个版本

0.1.3 2023年2月17日
0.1.2 2023年2月17日
0.1.1 2023年2月3日
0.1.0 2022年10月29日

#13#command-handler


用于 telegram-bot2

自定义许可

42KB
787

Telegram机器人

此crate提供了一种易于使用的框架来构建Telegram机器人。它仍在开发中,您可以在项目的repo上报告错误或请求功能。

工作流程

这个框架背后的想法类似于rocket web服务器。有一个主函数使用BotBuilder构建机器人。通过长轮询获取更新,然后传递给处理程序。

构建机器人

构建机器人的推荐方法是创建一个带有#[bot]注解的函数,返回一个BotBuilder
有关更多信息,请参阅BotBuilder#[bot]

#[bot]
async fn bot() -> _ {
    BotBuilder::new()
        .interval(Duration::from_secs(0))
        .timeout(5)
        .handlers(handlers![handler])
        .commands(commands![soup])
}

注意:函数不需要显式的返回类型,因为它由#[bot]宏处理

处理程序

处理程序是异步函数,返回一个Result<(), E> where E: Debug(返回一个Err将导致程序终止)。它们可以接受所需的所有参数,但它们都必须实现FromUpdate trait(已提供大量实现)。特定的处理程序可能需要额外的参数

通用处理程序

通用处理程序带有#[handler]属性,没有特定参数。

函数的参数使用FromUpdate trait进行解析。如果任何参数的解析失败,将尝试下一个处理程序,直到成功解析。

该宏接受以下参数

  • rank(usize): 默认值为0。该处理器的优先级,0为最高(即第一个要执行的处理程序)
  • restrictUpdateType列表):默认为全部。可能传递给处理器的更新
#[handler(rank = 1)]
async fn handler(message: &Message, bot: &Bot) -> Result<(), ()> {
    bot.send_message(SendMessageBuilder::new(ChatId::from(message.chat.id), message.text.clone().unwrap()).build()).await.unwrap();
    Ok(())
}

命令处理器

命令处理器使用#[command]宏进行注释。它接受命令的动态参数(见语法),以及实现FromUpdate的任何类型

函数的参数要么从调用中提取(根据语法),要么用FromUpdate进行解析

该宏接受以下参数

  • (String):必需。命令的语法如下:"/command_name [static|<dynamic>]*"。静态参数是常量,而动态参数从命令中解析出来,并通过FromStr传递给处理器
#[command("/soup get <id>")]
async fn soup(bot: &Bot, chat: ChatId, id: i64) -> Result<(), ()> {
    bot.send_message(SendMessageBuilder::new(chat, format!("Soup {} requested", id)).build()).await.unwrap();
    Ok(())
}

在这个例子中,id参数从消息中解析出来,必须是一个i64。一个有效的调用是"/soup get 10",而"/soup get hi"则无法成功解析

守护进程

您可以设置守护进程,这些守护进程在后台定期调用并可以访问BotState。守护进程函数使用#[daemon]进行注释,并需要一个interval参数,该参数指定两次调用之间的时间(以秒为单位)。

间隔时间是指调用之间的时间,它不会在最后一次调用结束后开始。例如,如果间隔设置为60s,而守护进程需要5s来完成,则下一次调用将在第一次结束后55s开始。如果守护进程正在运行,则无法启动相同的守护进程(即间隔为1s的5s守护进程将在结束立即启动)。计时器以毫秒级精确。

函数的参数在每次调用时由FromDaemon特性行解析

该宏接受以下参数

  • interval(usize):必需。两次调用之间的时间(以秒为单位)
#[daemon(interval = 5)]
async fn hello(state: &BotState<Mutex<usize>>) {
    let mut lock = state.lock().unwrap();
    *lock += 1;
    println!("Increasing counter to {}", lock);
}

依赖项

~3.5–4.5MB
~89K SLoC