9 个版本
0.1.8 | 2023年7月20日 |
---|---|
0.1.7 | 2023年7月5日 |
0.1.6 | 2023年6月3日 |
0.1.3 | 2023年5月9日 |
#1510 in 网页编程
180KB
3.5K SLoC
Botx-api-framework
描述
用于 eXpress 的机器人开发框架
使用
将以下内容添加到 Cargo.toml
botx-api-framework = { version = "*", features = ["anthill-di"] }
以下 features 可用:actix-web
- 启用与 actix-web 的集成(默认)
框架不依赖于特定的 web 框架,但已提供与 actix-web 的集成
要使用框架,需要创建对象 BotXApiFrameworkContext。有几种方法
- 通过构造函数 new - 将自动创建依赖项上下文并获取默认设置
- 通过构造函数 from_di_container - 依赖项上下文从参数获取,设置从依赖项获取,如果没有则使用默认值
- 通过在 anthill_di 中注册 - 依赖项上下文使用当前上下文,设置从依赖项获取,如果没有则使用默认值
// Пример создания контекста фреймворка из контекста anthill_di
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let ioc_ctx = DependencyContext::new_root();
ioc_ctx.register_botx_api_framework_context().await?;
// Если не использовать метод расширения
// ioc_ctx.register_type::<BotXApiFrameworkContext>(LifeCycle::Transient).await?;
let context = ioc_ctx.resolve::<BotXApiFrameworkContext>().await?;
}
创建框架对象后,可以处理命令方法
process_command
- 处理机器人事件process_notification_result
- 处理异步结果process_status_result
- 处理机器人状态
与 web actix 的集成添加了扩展方法给 actix_web::app::App
add_botx_api_handlers
- 添加 API 处理(/command, /notification/callback, /status)add_smartapp_static_files
- 添加通过 API /smartapp_files/static/{path*} 的静态请求处理
注册的 API 在请求时从依赖项中获取框架上下文并传递控制权
要添加处理程序,需要注册相应的 trait 并在依赖项上下文中注册
为方便注册处理程序,添加了扩展方法
trait 和扩展方法的对应关系
描述 | 处理事件的 trait | 扩展方法 |
---|---|---|
注册正则表达式,以确定消息是否属于命令或简单消息 | - | register_command_detection_regex |
注册处理程序和与消息对应的正则表达式 | ICommandHandler |
register_command_handler |
注册备用命令处理程序 | ICommandHandler |
register_default_command_handler |
注册消息处理程序 | IMessageHandler |
register_message_handler |
注册按钮处理程序 | IButtonHandler |
register_button_handler |
注册备用按钮处理程序 | IButtonHandler<TData =serde_json::Value, TMetaData =serde_json::Value> |
register_default_button_handler |
注册机器人内部通知处理程序 | IInternalBotNotificationHandler |
register_internal_notification_handler |
注册备用内部通知处理程序 | IInternalBotNotificationHandler<TData =serde_json::值,TOptions =serde_json::Value> |
register_default_internal_notification_handler |
注册 smartapp 事件处理程序 | ISmartappEventHandler |
register_smartapp_event_handler |
注册备用 smartapp 事件处理程序 | ISmartappEventHandler<TData =serde_json::值,TOptions =serde_json::Value> |
register_default_smartapp_event_handler |
注册添加到聊天事件处理程序 | IAddedToChatHandler |
register_add_to_chat_handler |
注册退出聊天事件处理程序 | ILeftFromChatHandler |
register_left_from_chat_handler |
注册编辑消息事件处理程序 | IEventEditHandler |
register_event_edit_handler |
注册从聊天中删除事件处理程序 | IDeletedFromChatHandler |
register_delete_from_chat_handler |
注册创建聊天事件处理程序 | IChatCreatedHandler |
register_chat_created_handler |
注册用户删除聊天事件处理程序 | IChatDeletedByUserHandler |
register_chat_deleted_by_user_handler |
注册 cts 登录事件处理程序 | ICtsLoginHandler |
register_cts_login_handler |
注册 cts 登出事件处理程序 | ICtsLogoutHandler |
register_cts_logout_handler |
注册异步事件结果处理程序 | INotificationResultHandler |
register_notification_callback_handler |
注册查询机器人状态处理程序 | IStatusHandler |
register_status_handler |
为了处理处理器的 TData 和 TMetadata 按钮,处理器需要实例化宏 button_data
#[button_data]
pub struct ButtonData {
pub message: String,
}
宏 button_data 将在 Data 和 MetaData 字段中添加 type_id 字段,其中应存储对象的类型。通过 type_id 进行按钮和处理器的匹配。type_id 字段具有默认实现,因此创建 data 和 metadata 对象的方式如下
let data = ButtonData { type_id: Default::default(), message: "test message".to_string() }
命令匹配按照指定的正则表达式进行
通过反序列化进行 smartapp 事件和内部机器人通知的匹配 - 如果消息可以解析为处理程序中指定的对象,则将该事件传递给处理程序
为了使用 eXpress API,此 crate 重新导出 crate botx-api。使用扩展方法在依赖项上下文中注册 API 上下文,之后可以在每个处理程序中获取它并执行 eXpress 查询
应用程序的基本设置可能如下所示
use actix_web::{
middleware::Logger,
web::{self, Data},
App, HttpServer,
};
use anthill_di::DependencyContext;
use botx_api::extensions::botx_api_context::IBotXApiContextExt;
use botx_api_framework::extensions::{anthill_di::IAnthillDiExt, actix::IActixHandlersExt};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let ioc_ctx = DependencyContext::new_root();
ioc_ctx.register_botx_api_context().await?;
ioc_ctx.register_botx_api_framework_context().await?;
HttpServer::new(move || {
App::new()
.wrap(Logger::default())
.app_data(Data::new(ioc_ctx.clone()))
.add_botx_api_handlers()
})
.bind(("127.0.0.1", "7856"))?
.run()
.await?;
Ok(())
}
选项卡
打开 issue 提出问题或建议
许可证
MIT,可用于任何目的
项目状态
状态 | 功能 | 附加说明 |
---|---|---|
✅ | 与 actix-web 的集成 | 基于 actix-web 的 Web 服务器 |
✅ | 消息处理程序 | 注册自己的消息处理程序 |
✅ | 定义自己的命令检测器 | 可以设置自己的正则表达式来定义消息是否属于命令 |
✅ | 命令处理程序 | 可以创建命令处理程序并为其指定匹配的正则表达式 |
✅ | 未处理命令处理程序 | 可以创建用于未找到处理程序的命令的处理程序 |
✅ | 按钮处理程序 | 可以创建按钮处理程序并将消息中的按钮与处理程序通过 data 和 metadata 匹配 |
✅ | 未处理按钮处理程序 | 可以创建用于未找到处理程序的按钮的处理程序 |
✅ | 添加到聊天事件处理程序 | 可以创建添加到聊天事件的处理程序 |
✅ | 退出聊天事件处理程序 | 可以创建退出聊天事件的处理程序 |
✅ | 编辑消息事件处理程序 | 可以创建编辑消息事件的处理程序 |
✅ | 从聊天中删除事件处理程序 | 可以创建从聊天中删除事件的处理程序 |
✅ | 用户删除聊天事件处理程序 | 可以创建用户删除聊天事件的处理程序 |
✅ | 创建聊天事件处理程序 | 可以创建创建聊天事件的处理程序 |
✅ | 从 cts 退出事件处理程序 | 可以创建从 cts 退出事件的处理程序 |
✅ | 进入 cts 事件处理程序 | 可以创建进入 cts 事件的处理程序 |
✅ | 机器人通知事件处理程序 | 可以创建来自其他机器人的事件的处理程序 |
✅ | 未处理机器人通知事件处理程序 | 可以创建其他机器人事件的处理程序,这些事件尚未找到处理程序 |
✅ | smartapp 事件处理程序 | 可以创建来自 smartapp 的事件处理程序,并通过数据(data)和元数据(metadata)将它们与处理程序关联 |
✅ | smartapp 未处理事件处理程序 | 可以创建来自 smartapp 的事件处理程序,这些事件尚未找到处理程序 |
✅ | 异步结果事件处理程序 | 可以创建通用异步结果事件处理程序 |
✅ | status 事件处理程序 | 可以创建机器人状态查询请求的处理程序 |
✅ | 为所有处理程序编写测试 |
依赖项
~22–37MB
~643K SLoC