#bot #express #botx #bot-framework #botx-api #web-framework #command-handler

nightly botx-api-framework

用于在 eXpress 平台上实现机器人的框架

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 网页编程


用于 bot-api-example

MIT 许可证

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