12 个版本
0.3.7 | 2023年2月18日 |
---|---|
0.3.6 | 2023年2月17日 |
0.2.0 | 2022年11月8日 |
0.1.2 | 2022年10月30日 |
#4 in #command-handler
每月 29 次下载
365KB
4K SLoC
Telegram 机器人
此包提供了一个易于使用的框架来构建 Telegram 机器人。它仍在开发中,您可以在项目的 仓库 上报告错误或请求功能。
工作流程
该框架的理念与 rocket 服务器类似。有一个主要函数使用 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
特性(已经提供了一组实现)。特定的处理器可以接受额外的参数
泛型处理器
泛型处理器使用 #[handler]
属性进行注解,并且没有特定参数。
函数的参数使用 FromUpdate
特性进行解析。如果任何参数的解析失败,将尝试下一个处理器,直到成功解析为止。
该宏接受以下参数
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
解析。
该宏接受以下参数
- (字符串):必需。命令的语法如下:
"/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
参数,该参数指定两次调用之间的时间(以秒为单位)。
间隔时间是指两次调用之间的时间,它不会从上次调用结束开始。例如,如果间隔设置为 60 秒,而守护进程需要 5 秒来完成,则下一次调用将在第一次调用结束后 55 秒开始。如果守护进程正在运行,则不能启动相同的守护进程(即,一个 5 秒的守护进程,间隔为 1 秒将在结束时立即启动)。计时器的精度达到毫秒级。
每次调用时,函数的参数都由 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);
}
依赖项
~9–22MB
~346K SLoC