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

telegram-bot2

telegram-bot2 是用于编写 Telegram 机器人的框架

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 是最高的(即第一个要执行的处理器)
  • 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 解析。

该宏接受以下参数

  • (字符串):必需。命令的语法如下:"/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