Фреймворк Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ ботов под 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|ВозможноÑÑ‚ÑŒ Ñоздавать обработчик запроÑа ÑоÑтоÑÐ½Ð¸Ñ Ð±Ð¾Ñ‚Ð°| |✅|ÐапиÑать теÑÑ‚Ñ‹ Ð´Ð»Ñ Ð²Ñех обработчиков||