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
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为最高(即第一个要执行的处理程序)restrict
(UpdateType
列表):默认为全部。可能传递给处理器的更新
#[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