1use std::{
2 any::TypeId,
3 sync::Arc
4};
5
6use anthill_di::{
7 *,
8 types::*
9};
10use botx_api::{bot::models::*, api::result::ExpressResult};
11use log::*;
12use regex::Regex;
13
14use crate::{
15 results::*,
16 handlers::{
17 command::*,
18 message::*,
19 button::*,
20 chat_created::*,
21 chat_deleted_by_user::*,
22 added_to_chat::*,
23 deleted_from_chat::*,
24 left_from_chat::*,
25 cts_login::*,
26 cts_logout::*,
27 internal_bot_notification::*,
28 smartapp_event::*,
29 notification_result::*,
30 status::*,
31 edit_event::*
32 },
33};
34
35use super::RequestContext;
36
37pub struct BotXApiFrameworkContextSettings {
38 pub use_default_button_handler_if_format_or_setup_error: bool,
40}
41
42impl Default for BotXApiFrameworkContextSettings {
43 fn default() -> Self {
44 Self {
45 use_default_button_handler_if_format_or_setup_error: false
46 }
47 }
48}
49
50pub struct BotXApiFrameworkContext {
51 di_container: DependencyContext,
52 settings: Arc<BotXApiFrameworkContextSettings>,
53}
54
55#[async_trait_with_sync::async_trait(Sync)]
56impl Constructor for BotXApiFrameworkContext {
57 async fn ctor(ctx: DependencyContext) -> BuildDependencyResult<Self> {
58 Ok( Self::from_di_container(ctx).await )
59 }
60}
61
62impl BotXApiFrameworkContext {
64 pub const BUTTON_HANDLER_NOT_FOUND_RESPONSE: &str = "Кнопка не обработана. Для команды не найден обработчик.";
65 pub const COMMAND_HANDLER_NOT_FOUND_RESPONSE: &str = "Команда не обработана. Нет обработчиков с подходящим регулярным выражением. Для команды не зарегистрирован дефолтный обработчик.";
66 pub const MESSAGE_HANDLER_NOT_FOUND_RESPONSE: &str = "Сообщение не обработано. Для сообщения не найден обработчик.";
67 pub const CHAT_CREATED_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие создания чата не обработано. Для события не найден обработчик.";
68 pub const CHAT_DELETED_BY_USER_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие удаления чата пользователем не обработано. Для события не найден обработчик.";
69 pub const ADDED_TO_CHAT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие добавления участника в чат не обработано. Для события не найден обработчик.";
70 pub const DELETED_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие удаления участника из чата не обработано. Для события не найден обработчик.";
71 pub const LEFT_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие выхода участника из чата не обработано. Для события не найден обработчик.";
72 pub const EVENT_EDIT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие редактирования события пользователем не обработано. Для события не найден обработчик.";
73 pub const INTERNAL_BOT_NOTIFICATION_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие внутренней бот нотификации не обработано. Для события не найден обработчик.";
74 pub const SMARTAPP_EVENT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие смартап не обработано. Для события не найден обработчик.";
75 pub const CTS_LOGIN_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие входа участника в cts не обработано. Для события не найден обработчик.";
76 pub const CTS_LOGOUT_HANDLER_NOT_FOUND_RESPONSE: &str = "Событие выхода участника из cts не обработано. Для события не найден обработчик.";
77 pub const NOTIFICATION_CALLBACK_HANDLER_NOT_FOUND_RESPONSE: &str = "Обратный вызов с результатом нотификации не обработан. Для события не найден обработчик.";
78 pub const STATUS_HANDLER_NOT_FOUND_RESPONSE: &str = "Запрос статуса не обработан. Для события не найден обработчик.";
79
80 pub fn new() -> Self {
82 Self {
83 di_container: DependencyContext::new_root(),
84 settings: Arc::new(BotXApiFrameworkContextSettings::default()),
85 }
86 }
87
88 pub async fn from_di_container(di_container: DependencyContext) -> Self {
90 let settings = di_container.resolve().await.unwrap_or(Arc::new(BotXApiFrameworkContextSettings::default()));
91
92 Self {
93 di_container,
94 settings,
95 }
96 }
97
98 pub fn di_container(&self) -> &DependencyContext {
100 &self.di_container
101 }
102
103 pub async fn process_command(&self, request: CommandRequest<serde_json::Value, serde_json::Value>) -> CommandResult {
105 let request_ctx = RequestContext {
106 sync_id: request.sync_id,
107 source_sync_id: request.source_sync_id,
108 attachments: request.attachments,
109 from: request.from,
110 async_files: request.async_files,
111 bot_id: request.bot_id,
112 proto_version: request.proto_version,
113 entities: request.entities,
114 };
115
116 match request.command {
117 botx_api::bot::models::Command::Message(msg) => {
118 let is_button = request.source_sync_id.is_some();
120
121 if is_button {
122 return self.process_button(msg, request_ctx).await;
123 }
124
125 let is_bot_command = self.di_container.resolve::<CommandDetectionRegex>().await
127 .unwrap_or(Regex::new("^/").unwrap().into())
128 .is_match(&*msg.body);
129
130 if is_bot_command {
131 self.process_bot_command(msg, request_ctx).await
132 } else {
133 self.process_message(msg, request_ctx).await
134 }
135 },
136 botx_api::bot::models::Command::ChatCreated(event)
137 => self.process_chat_created_event(event, request_ctx).await,
138 botx_api::bot::models::Command::ChatDeletedByUser(event)
139 => self.process_chat_deleted_by_user_event(event, request_ctx).await,
140 botx_api::bot::models::Command::AddedToChat(event)
141 => self.process_added_to_chat_event(event, request_ctx).await,
142 botx_api::bot::models::Command::DeletedFromChat(event)
143 => self.process_deleted_from_chat_event(event, request_ctx).await,
144 botx_api::bot::models::Command::LeftFromChat(event)
145 => self.process_left_from_chat_event(event, request_ctx).await,
146 botx_api::bot::models::Command::EventEdit(event)
147 => self.process_event_edit_event(event, request_ctx).await,
148 botx_api::bot::models::Command::SmartappEvent(event)
149 => self.process_smartapp_event(event, request_ctx).await,
150 botx_api::bot::models::Command::InternalBotNotification(event)
151 => self.process_internal_bot_notification_event(event, request_ctx).await,
152 botx_api::bot::models::Command::CtsLogin(event)
153 => self.process_cts_login_event(event, request_ctx).await,
154 botx_api::bot::models::Command::CtsLogout(event)
155 => self.process_cts_logout_event(event, request_ctx).await,
156 }
157
158 }
160
161 async fn process_button(&self, msg: MessageCommand<serde_json::Value, serde_json::Value>, request: RequestContext) -> CommandResult {
163 let data_type_id = msg.data.get("type_id");
164
165 let Some(data_type_id) = data_type_id else {
166 warn!("Не найдено поле type_id в объекте data сообщения. Текст кнопки {}", msg.body);
167 return self.process_default_button(msg, request).await;
169 };
170
171 let Ok(data_type_id) = serde_json::from_value::<String>(data_type_id.clone()) else {
172 error!("Не удается преобразовать поле type_id data в u64. Текст кнопки {}. type_id:[{}]", msg.body, data_type_id);
173
174 return if self.settings.use_default_button_handler_if_format_or_setup_error {
176 self.process_default_button(msg, request).await
177 } else {
178 CommandResult::Ok(CommandOk::new("Неверный формат поля type_id"))
179 };
180 };
181
182 let meta_data_type_id = msg.metadata.get("type_id");
185
186 let Some(meta_data_type_id) = meta_data_type_id else {
187 warn!("Не найдено поле type_id в объекте metadata сообщения. Текст кнопки {}", msg.body);
188
189 return if self.settings.use_default_button_handler_if_format_or_setup_error {
191 self.process_default_button(msg, request).await
192 } else {
193 CommandResult::Ok(CommandOk::new("Не найдено поле type_id в объекте metadata сообщения"))
194 };
195 };
196
197 let Ok(meta_data_type_id) = serde_json::from_value::<String>(meta_data_type_id.clone()) else {
198 error!("Не удается преобразовать поле type_id metadata в u64. Текст кнопки {}. type_id:[{}]", msg.body, meta_data_type_id);
199
200 return if self.settings.use_default_button_handler_if_format_or_setup_error {
201 self.process_default_button(msg, request).await
202 } else {
203 CommandResult::Ok(CommandOk::new("Неверный формат поля type_id"))
204 };
205 };
206
207 let matching_rules = self.di_container.resolve_collection::<Box<dyn IButtonHandlerMatchingRule>>().await;
210
211 let Ok(matching_rules) = matching_rules else {
212 debug!("Не удалось получить список сопоставлений обработчиков кнопок. Текст кнопки {}. Ошибка: {:#?}", msg.body, matching_rules.err().unwrap());
213
214 return if self.settings.use_default_button_handler_if_format_or_setup_error {
215 self.process_default_button(msg, request).await
216 } else {
217 CommandResult::Ok(CommandOk::new("Не удалось получить список сопоставлений обработчиков кнопок"))
218 };
219 };
220
221 for matching_rule in matching_rules.iter() {
222 debug!("Проверка правилу соответствия обработчика кнопки. Претендент data type_id[{:?}] meta data type_id[{:?}]", matching_rule.get_data_type_id(), matching_rule.get_metadata_type_id());
223
224 if *matching_rule.get_data_type_id() == data_type_id && *matching_rule.get_metadata_type_id() == meta_data_type_id {
225 let handler = self.di_container.resolve_by_type_id::<Box<dyn IButtonHandlerCallProducer>>(*matching_rule.get_handler_type_id()).await;
226
227 let Ok(mut handler) = handler else {
228 error!("Кнопка не обработана. Было найдено сопоставление для обработчика кнопки, но обработчик не зарегистрирован в ioc. Текст кнопки {}. Ошибка: {:#?}", msg.body, handler.err().unwrap());
229
230 return if self.settings.use_default_button_handler_if_format_or_setup_error {
231 self.process_default_button(msg, request).await
232 } else {
233 CommandResult::Ok(CommandOk::new("Кнопка не обработана. Было найдено сопоставление для обработчика кнопки, но обработчик не зарегистрирован в ioc"))
234 };
235 };
236
237 return handler.handle(msg.body, msg.data, msg.metadata, request).await;
238 }
239 }
240
241 self.process_default_button(msg, request).await
243 }
244
245 async fn process_default_button(&self, msg: MessageCommand<serde_json::Value, serde_json::Value>, request: RequestContext) -> CommandResult {
247 let default_handler = self.di_container.resolve::<Box<dyn IButtonHandler<TData = serde_json::Value, TMetaData = serde_json::Value>>>().await;
248
249 let Ok(mut default_handler) = default_handler else {
250 debug!("{} Сообщение: {:#?}. Ошибка: {:#?}", Self::BUTTON_HANDLER_NOT_FOUND_RESPONSE, msg, default_handler.err().unwrap());
251 return CommandResult::Ok(CommandOk::new(Self::BUTTON_HANDLER_NOT_FOUND_RESPONSE));
252 };
253
254 default_handler.handle(msg.body, msg.data, msg.metadata, request).await
255 }
256
257 async fn process_bot_command(&self, msg: MessageCommand<serde_json::Value, serde_json::Value>, request: RequestContext) -> CommandResult {
259 let matching_rules = self.di_container.resolve_collection::<Box<dyn ICommandHandlerMatchingRule>>().await;
260
261 let Ok(matching_rules) = matching_rules else {
262 debug!("Не удалось получить список сопоставлений обработчиков команд. Текст команды {}. Ошибка: {:#?}", msg.body, matching_rules.err().unwrap());
263 return CommandResult::Ok(CommandOk::new("Не удалось получить список сопоставлений обработчиков команд"));
264 };
265
266 for command_match_rule in matching_rules.iter() {
268 if command_match_rule.get_command_regex().is_match(&*msg.body) {
269 let handler = self.di_container.resolve_by_type_id::<Box<dyn ICommandHandler>>(*command_match_rule.get_command_handler_id()).await;
270
271 let Ok(mut handler) = handler else {
272 error!("Команда не обработана. Было найдено сопоставление для обработчика команды, но обработчик не зарегистрирован в ioc. Текст команды {}. Ошибка: {:#?}", msg.body, handler.err().unwrap());
273 return CommandResult::Ok(CommandOk::new("Команда не обработана. Было найдено сопоставление для обработчика команды, но обработчик не зарегистрирован в ioc"));
274 };
275
276 return handler.handle(msg.body, request).await;
277 }
278 }
279
280 let default_command_handler_id = self.di_container.resolve::<DefaultCommandHandlerId>().await;
281
282 let Ok(default_command_handler_id) = default_command_handler_id else {
283 debug!("{} Текст команды {}. Ошибка: {:#?}", Self::COMMAND_HANDLER_NOT_FOUND_RESPONSE, msg.body, default_command_handler_id.err().unwrap());
284 return CommandResult::Ok(CommandOk::new(Self::COMMAND_HANDLER_NOT_FOUND_RESPONSE));
285 };
286
287 let handler = self.di_container.resolve_by_type_id::<Box<dyn ICommandHandler>>(*default_command_handler_id).await;
288
289 let Ok(mut handler) = handler else {
290 error!("Команда не обработана. Дефолтный обработчик задан, но обработчик не зарегистрирован в ioc. Текст команды {}. Ошибка: {:#?}", msg.body, handler.err().unwrap());
291 return CommandResult::Ok(CommandOk::new("Команда не обработана. Дефолтный обработчик задан, но обработчик не зарегистрирован в ioc"));
292 };
293
294 handler.handle(msg.body, request).await
296 }
297
298 async fn process_message(&self, msg: MessageCommand<serde_json::Value, serde_json::Value>, request: RequestContext) -> CommandResult {
300 let handler = self.di_container.resolve::<Box<dyn IMessageHandler>>().await;
301
302 let Ok(mut handler) = handler else {
303 debug!("{} Текст сообщения {}. Ошибка: {:#?}", Self::MESSAGE_HANDLER_NOT_FOUND_RESPONSE, msg.body, handler.err().unwrap());
304 return CommandResult::Ok(CommandOk::new(Self::MESSAGE_HANDLER_NOT_FOUND_RESPONSE));
305 };
306
307 handler.handle(msg.body, request).await
308 }
309
310 async fn process_chat_created_event(&self, event: ChatCreatedCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
312 let handler = self.di_container.resolve::<Box<dyn IChatCreatedHandler>>().await;
313
314 let Ok(mut handler) = handler else {
315 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::CHAT_CREATED_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
316 return CommandResult::Ok(CommandOk::new(Self::CHAT_CREATED_HANDLER_NOT_FOUND_RESPONSE));
317 };
318
319 handler.handle(event, request).await
320 }
321
322 async fn process_chat_deleted_by_user_event(&self, event: ChatDeletedByUserCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
324 let handler = self.di_container.resolve::<Box<dyn IChatDeletedByUserHandler>>().await;
325
326 let Ok(mut handler) = handler else {
327 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::CHAT_DELETED_BY_USER_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
328 return CommandResult::Ok(CommandOk::new(Self::CHAT_DELETED_BY_USER_HANDLER_NOT_FOUND_RESPONSE));
329 };
330
331 handler.handle(event, request).await
332 }
333
334 async fn process_added_to_chat_event(&self, event: AddedToChatCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
336 let handler = self.di_container.resolve::<Box<dyn IAddedToChatHandler>>().await;
337
338 let Ok(mut handler) = handler else {
339 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::ADDED_TO_CHAT_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
340 return CommandResult::Ok(CommandOk::new(Self::ADDED_TO_CHAT_HANDLER_NOT_FOUND_RESPONSE));
341 };
342
343 handler.handle(event, request).await
344 }
345
346 async fn process_deleted_from_chat_event(&self, event: DeletedFromChatCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
348 let handler = self.di_container.resolve::<Box<dyn IDeletedFromChatHandler>>().await;
349
350 let Ok(mut handler) = handler else {
351 debug!("{}. Информация о событии {:#?}. Ошибка: {:#?}", Self::DELETED_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
352 return CommandResult::Ok(CommandOk::new(Self::DELETED_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE));
353 };
354
355 handler.handle(event, request).await
356 }
357
358 async fn process_left_from_chat_event(&self, event: LeftFromChatCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
360 let handler = self.di_container.resolve::<Box<dyn ILeftFromChatHandler>>().await;
361
362 let Ok(mut handler) = handler else {
363 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::LEFT_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
364 return CommandResult::Ok(CommandOk::new(Self::LEFT_FROM_CHAT_HANDLER_NOT_FOUND_RESPONSE));
365 };
366
367 handler.handle(event, request).await
368 }
369
370 async fn process_event_edit_event(&self, event: EventEditCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
372 let handler = self.di_container.resolve::<Box<dyn IEventEditHandler>>().await;
373
374 let Ok(mut handler) = handler else {
375 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::EVENT_EDIT_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
376 return CommandResult::Ok(CommandOk::new(Self::EVENT_EDIT_HANDLER_NOT_FOUND_RESPONSE));
377 };
378
379 handler.handle(event, request).await
380 }
381
382 async fn process_smartapp_event(&self, event: SmartappEventCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
384 let data_processors = self.di_container.resolve_collection::<Box<dyn ISmartappEventDataProcessor>>().await;
385
386 let Ok(data_processors) = data_processors else {
387 debug!("Не удалось получить список обработчиков данных для обработчиков смартап событий. Пытаемся обработать дефолтным обработчиком. Событие: {:#?}. Ошибка: {:#?}", event, data_processors.err().unwrap());
388 return self.process_smartapp_event_default_handler(event, request).await;
389 };
390
391 for data_processor in data_processors {
392 let Some(data) = data_processor.get_data(&event.data.data) else {
393 continue;
394 };
395
396 let Some(options) = data_processor.get_options(&event.data.opts) else {
397 continue;
398 };
399
400 let handler_call_producer = self.di_container.resolve_by_type_id::<Box<dyn ISmartappEventCallProducer>>(*data_processor.get_handler_type_id()).await;
401
402 let Ok(mut handler_call_producer) = handler_call_producer else {
403 error!("Для обработчика зарегистрирован обработчик данных внутренних смартап события, но не удалось получить не типизированный обработчик. Пробуем найти другой обработчик.");
404 continue;
405 };
406
407 return handler_call_producer.handle(event.data.request_ref, event.data.smartapp_id, event.data.smartapp_api_version, data, options, request).await;
408 }
409
410 self.process_smartapp_event_default_handler(event, request).await
411 }
412
413 async fn process_smartapp_event_default_handler(&self, event: SmartappEventCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
415 let default_handler = self.di_container.resolve::<Box<dyn ISmartappEventHandler<TData = serde_json::Value, TOptions = serde_json::Value>>>().await;
416
417 let Ok(mut default_handler) = default_handler else {
418 debug!("{} Событие: {:#?}. Ошибка: {:#?}", Self::SMARTAPP_EVENT_HANDLER_NOT_FOUND_RESPONSE, event, default_handler.err().unwrap());
419 return CommandResult::Ok(CommandOk::new(Self::SMARTAPP_EVENT_HANDLER_NOT_FOUND_RESPONSE));
420 };
421
422 return default_handler.handle(event.data.request_ref, event.data.smartapp_id, event.data.smartapp_api_version, event.data.data, event.data.opts, request).await
423 }
424
425 async fn process_internal_bot_notification_event(&self, event: InternalBotNotificationCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
427 let data_processors = self.di_container.resolve_collection::<Box<dyn IInternalBotNotificationDataProcessor>>().await;
428
429 let Ok(data_processors) = data_processors else {
430 debug!("Не удалось получить список обработчиков данных для обработчиков событий внутренней бот нотификации. Пытаемся обработать дефолтным обработчиком. Событие: {:#?}. Ошибка: {:#?}", event, data_processors.err().unwrap());
431 return self.process_internal_bot_notification_event_default_handler(event, request).await;
432 };
433
434 for data_processor in data_processors {
435 let Some(data) = data_processor.get_data(&event.data.data) else {
436 continue;
437 };
438
439 let Some(options) = data_processor.get_options(&event.data.opts) else {
440 continue;
441 };
442
443 let handler_call_producer = self.di_container.resolve_by_type_id::<Box<dyn IInternalBotNotificationCallProducer>>(*data_processor.get_handler_type_id()).await;
444
445 let Ok(mut handler_call_producer) = handler_call_producer else {
446 error!("Для обработчика зарегистрирован обработчик данных внутренней бот нотификации, но не удалось получить не типизированный обработчик. Пробуем найти другой обработчик.");
447 continue;
448 };
449
450 return handler_call_producer.handle(data, options, request).await;
451 }
452
453 self.process_internal_bot_notification_event_default_handler(event, request).await
454 }
455
456 async fn process_internal_bot_notification_event_default_handler(&self, event: InternalBotNotificationCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
458 let default_handler = self.di_container.resolve::<Box<dyn IInternalBotNotificationHandler<TData = serde_json::Value, TOptions = serde_json::Value>>>().await;
459
460 let Ok(mut default_handler) = default_handler else {
461 debug!("{} Событие: {:#?}. Ошибка: {:#?}", Self::INTERNAL_BOT_NOTIFICATION_HANDLER_NOT_FOUND_RESPONSE, event, default_handler.err().unwrap());
462 return CommandResult::Ok(CommandOk::new(Self::INTERNAL_BOT_NOTIFICATION_HANDLER_NOT_FOUND_RESPONSE));
463 };
464
465 return default_handler.handle(event.data.data, event.data.opts, request).await
466 }
467
468 async fn process_cts_login_event(&self, event: CtsLoginCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
470 let handler = self.di_container.resolve::<Box<dyn ICtsLoginHandler>>().await;
471
472 let Ok(mut handler) = handler else {
473 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::CTS_LOGIN_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
474 return CommandResult::Ok(CommandOk::new(Self::CTS_LOGIN_HANDLER_NOT_FOUND_RESPONSE));
475 };
476
477 handler.handle(event, request).await
478 }
479
480 async fn process_cts_logout_event(&self, event: CtsLogoutCommand<serde_json::Value>, request: RequestContext) -> CommandResult {
482 let handler = self.di_container.resolve::<Box<dyn ICtsLogoutHandler>>().await;
483
484 let Ok(mut handler) = handler else {
485 debug!("{} Информация о событии {:#?}. Ошибка: {:#?}", Self::CTS_LOGOUT_HANDLER_NOT_FOUND_RESPONSE, event.data, handler.err().unwrap());
486 return CommandResult::Ok(CommandOk::new(Self::CTS_LOGOUT_HANDLER_NOT_FOUND_RESPONSE));
487 };
488
489 handler.handle(event, request).await
490 }
491
492 pub async fn process_notification_result(&self, request: ExpressResult<NotificationCallbackRequestOk, NotificationCallbackRequestError>) {
493 let handler = self.di_container.resolve::<Box<dyn INotificationResultHandler>>().await;
494
495 let Ok(mut handler) = handler else {
496 debug!("{} Информация об обратном вызове {:#?}. Ошибка: {:#?}", Self::NOTIFICATION_CALLBACK_HANDLER_NOT_FOUND_RESPONSE, request, handler.err().unwrap());
497 return;
498 };
499
500 handler.handle(request).await
501 }
502
503 pub async fn process_status_result(&self, request: StatusRequest) -> Option<StatusResponse> {
504 let handler = self.di_container.resolve::<Box<dyn IStatusHandler>>().await;
505
506 let Ok(mut handler) = handler else {
507 debug!("{} Информация об событии запроса состояния {:#?}. Ошибка: {:#?}", Self::STATUS_HANDLER_NOT_FOUND_RESPONSE, request, handler.err().unwrap());
508 return None;
509 };
510
511 Some(handler.handle(request).await)
512 }
513}