botx_api_framework/contexts/
framework.rs

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    /// Стоит ли передавать обработку в дефолтный обработчик если произошли ошибки при получении type_id из data и metadata
39    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
62/// Контекст фреймворка. Обрабатывает приходящие команды сконфигурированным набором обработчиков
63impl 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    /// Строит новый контекст фреймворка
81    pub fn new() -> Self {
82        Self {
83            di_container: DependencyContext::new_root(),
84            settings: Arc::new(BotXApiFrameworkContextSettings::default()),
85        }
86    }
87
88    /// Строит новый контекст фреймворка из переданного ioc контекста
89    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    /// Di котекст который используется фреймворком для поиска зависимостей
99    pub fn di_container(&self) -> &DependencyContext {
100        &self.di_container
101    }
102
103    /// Обработка события отправленных боту
104    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                // Если есть id сообщения-источника, значит это кнопка, иначе это обычное сообщение или команда
119                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                // Если соответствует регулярному выражению команды, значит это команда, иначе это обычное сообщение 
126                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        //CommandResult::Ok(CommandOk::new("Обработчики команды не найдены, команда пропущена"))
159    }
160
161    /// Обработка кнопок нажатых пользователем
162    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            // Поле не найдено, передаем в дефолтный обработчик
168            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            // Поле найдено, но формат не верный, фактическая ошибка. Если настроено, передаем в дефолтный обработчик
175            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 data_type_id: TypeId = unsafe { std::mem::transmute(data_type_id) };
183
184        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            // Т.к. ранее мы точно нашли поле с id типа data, значит отсутствие id типа metadata ошибка 
190            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 meta_data_type_id: TypeId = unsafe { std::mem::transmute(meta_data_type_id) };
208        
209        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        // Если ранее не нашли обработчик, пытаемся обработать дефолтным
242        self.process_default_button(msg, request).await
243    }
244
245    /// Обработка кнопок нажатых пользователем дефолтным обработчиком
246    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    /// Обработка команд пользователя к боту
258    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        // Ищем обработчик по регулярному выражению, который может обработать команду 
267        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        // Если ранее не завершили выполнение, значит не нашли подходящий обработчик
295        handler.handle(msg.body, request).await
296    }
297
298    /// Обработка сообщений пользователя
299    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    /// Обработка события создания чата
311    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    /// Обработка события создания чата
323    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    /// Обработка события добавления участника в чат
335    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    /// Обработка события исключения участника из чата
347    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    /// Обработка события выхода участника из чата
359    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    /// Обработка события выхода участника из чата
371    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    /// Обработка события смартап
383    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    /// Обработка события смартап дефолтным обработчиком
414    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    /// Обработка внутренней нотификации бота
426    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    /// Обработка внутренней нотификации бота дефолтным обработчиком 
457    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    /// Обработка события выхода из cts
469    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    /// Обработка события входа в cts
481    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}