Фреймворк для разработки ботов под eXpress
Добавьте в Cargo.toml
toml
botx-api-framework = { version = "*", features = ["anthill-di"] }
Доступны следующие features:
actix-web
- включение интеграции с actix-web (default)
Фреймворк не привязан к конкретному web фреймворку, но имеет готовую интеграцию с actix-web
Минимально для работы фреймворка нужно создать объект BotXApiFrameworkContext. Есть несколько способов: * Через конструктор new - автоматически создастся контекст зависимостей и возьмутся настройки по умолчанию * Через конструктор fromdicontainer - контекст зависимостей берется из аргументов, настройки берутся из зависимостей а при отсутствии берутся дефолтные * Через регистрацию в anthill_di - контекстом зависимостей берется текущий контекст, настройки берутся из зависимостей а при отсутствии берутся дефолтные
```rs // Пример создания контекста фреймворка из контекста anthill_di
async fn main() -> anyhow::Result<()> { let iocctx = DependencyContext::newroot();
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 добавляет методы расширения для actixweb::app::App:
* add_botx_api_handlers
- добавляет обработку api (/command, /notification/callback, /status)
* add_smartapp_static_files
- добавляет обработку запроса статики по api /smartappfiles/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::Value, TOptions = serde_json::Value>
|register_default_internal_notification_handler
|
|регистрирует обработчик событий smartapp|ISmartappEventHandler
|register_smartapp_event_handler
|
|регистрирует запасной обработчик событий smartapp|ISmartappEventHandler<TData = serde_json::Value, TOptions = serde_json::Value>
|register_default_smartapp_event_handler
|
|регистрирует обработчик событий добавления в чат|IAddedToChatHandler
|register_add_to_chat_handler
|
|регистрирует обработчик событий выхода из чата|ILeftFromChatHandler
|register_left_from_chat_handler
|
|регистрирует обработчик событий удаления из чата|IDeletedFromChatHandler
|register_delete_from_chat_handler
|
|регистрирует обработчик событий создания чата|IChatCreatedHandler
|register_chat_created_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
:
```rs
pub struct ButtonData { pub message: String, } ```
Макрос buttondata добавляет в Data и MetaData поле typeid в котором должен храниться тип объекта. По typeid происходит сопоставление кнопок и обработчиков. Объект в поле typeid имеет реализацию Default, по этому создание объектов data и metadata выполняется способом ниже:
rs
let data = ButtonData { type_id: Default::default(), message: "test message".to_string() }
Сопоставление команд идет по указанному регулярному выражению
Сопоставление событий smartapp и внутренней бот нотификации происходит при помощи десериализации - если сообщение можно разобрать в объекты указанные в обработчике, значит этому обработчику будет передано событие
Для работы с api eXpress этот crate реэкспортирует crate botx-api. Используйте метод расширение для регистрации контекста api в контексте зависимостей, после чего его можно будет получить в каждом обработчике и выполнять запросы в eXpress
Базовая настройка приложения может выглядеть следующим образом ```rs use actix_web::{ middleware::Logger, web::{self, Data}, App, HttpServer, };
use anthilldi::DependencyContext; use botxapi::extensions::botxapicontext::IBotXApiContextExt; use botxapiframework::extensions::{anthill_di::IAnthillDiExt, actix::IActixHandlersExt};
async fn main() -> anyhow::Result<()> { let iocctx = DependencyContext::newroot();
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| |✅|Обработчик сообщения|Регистрация своего обработчика сообщений пользователей| |✅|Определение своего детектора команд|Возможность задать свое регулярное выражения определения относится ли сообщение к командам| |✅|Обработчик команды|Возможность создавать обработчики команд и назначать им регулярные выражения для сопоставления| |✅|Обработчик не обработанных команды|Возможность создавать обработчик для команд для которых не найден обработчик| |✅|Обработчик кнопок|Возможность создавать обработчики кнопок и сопоставлять кнопки сообщений с обработчиками через data и metadata которые может обработать обработчик| |✅|Обработчик не обработанных кнопок|Возможность создавать обработчик кнопок для кнопок для которых не найден обработчик| |✅|Обработчик события добавления в чат|Возможность создавать обработчики события добавления в чат| |✅|Обработчик события выхода из чата|Возможность создавать обработчики события выхода из чата| |✅|Обработчик события удаления из чата|Возможность создавать обработчики события удаления из чата| |✅|Обработчик события создания чата|Возможность создавать обработчики события создания чата| |✅|Обработчик события выхода с cts|Возможность создавать обработчики события выхода из cts| |✅|Обработчик события входа в cts|Возможность создавать обработчики события входа в cts| |✅|Обработчик события нотификации бота|Возможность создавать обработчики событий от других ботов| |✅|Обработчик события не обработанных нотификаций бота|Возможность создавать обработчики событий от других ботов для которых не найден обработчик| |✅|Обработчик событий smartapp|Возможность создавать обработчики событий от smartapp и сопоставлять с обработчиками через data и metadata которые может обработать обработчик| |✅|Обработчик не обработанных событий smartapp|Возможность создавать обработчики событий от smartapp для которых не были найдены обработчики| |✅|Обработчик событий асинхронного результатов|Возможность создавать общий обработчик события асинхронного результата| |✅|Обработчик событий status|Возможность создавать обработчик запроса состояния бота| |✅|Написать тесты для всех обработчиков||