﻿# Обработка событий при новом сообщении в сессии

> [HTML Version](new-message-events-processing.html)

Обработчик в модуле может фиксировать:

- отправку исходящего или поступление входящего сообщения в сессии;

- системные сообщения о смене состояния сессии — назначена на бота или оператора, находится в очереди, в спаме или закрыта.

После наступления одного из этих событий запускается скрипт или бизнес‑процесс.

````
Начало внимание

````
Настраивать обработчик может администратор системы при создании [пользовательского модуля](extentions.md).

````
Конец внимание

## ````
Настроить обработчик отправки сообщения в сессии

Рассмотрим пример обработчика, который фиксирует ответ оператора в сессии.

Например, пользователь внешнего портала в карточке заявки обращается в линию с запросом. Для этого используется виджет [Чат с операторами линий](chat-with-operators.md). В ELMA365 автоматически создаётся сессия. Когда оператор в ней отвечает, это фиксируется обработчиком и запускается бизнес‑процесс. В ходе процесса клиент получит на электронную почту уведомление о новом сообщении в сессии.

### Шаг 1. Настройка бизнес‑процесса в модуле

1. Перейдите в раздел **Администрирование > Модули** и [создайте пользовательский модуль](create-extention.md).

2. В настройках модуля перейдите на вкладку **Процессы** и [добавьте бизнес‑процесс](extention-processes.md), который будет выполняться каждый раз, когда оператор отправит сообщение в чате с клиентом.

Для нашего примера добавим процесс **Оповещение о новом сообщении**. В ходе его выполнения определится электронная почта клиента, на которую отправится ответ оператора. Настроим схему процесса следующим образом:

**(new-message-events-processing-1.png)**

3. В контексте бизнес-процесса добавьте переменные, в которые обработчик после ответа оператора передаст данные, необходимые для отправки уведомления на электронную почту клиента:

- **Сессия **(`session`) — с типом **Произвольное приложение (один)**, хранит сессию, в которой ведётся диалог; 

- **Тип сообщения **(`kind`) — с типом **Строка (строка)**, определяет сообщение, исходящее от оператора;

- **Сообщение **(`message`) — с типом **Строка (строка)**, передаёт сообщение, отправленное оператором;

- **Email **(`email`) — с типом **Строка (строка)**, хранит адрес электронной почты, на который будет отправлено уведомление;

- **Заявка **(`application`) — с типом **Приложение (один)**, хранит ссылку на заявку, в которой ведётся переписка с оператором.

4. На схему процесса добавьте блок **Скрипт** с названием **Определить email получателя оповещения**. В его настройках создайте функцию `getEmailRecipient`, с помощью которой определится электронная почта клиента, на которую отправится уведомление.

Пример скрипта для определения электронной почты клиента

````
async function getEmailRecipient(): Promise<void> \{  
````
// Сценарий выполняется только для сообщений, исходящих от оператора  
    ````
if (Context.data.kind \!= 'Out' || \!Context.data.session) return  
    const session = await Imports?.lines?.app.\_sessions.search().where(f =>  
    f.\_\_id.eq(Context.data.session\!.id)).first();  
   if (\!session) return  
````
// Проверяем, что сессия создана с карточки заявки на внешнем портале  
и назначена на оператора или бота  
````
   if (session.data.\_externalChatId?.includes('service\_desk:applications') \&\& (  
        session.data.\_state?.code == LineSessionState.AssignedToOperator ||  
        session.data.\_state?.code == LineSessionState.AssignedToBot  
    )) \{  
````
// Получем электронную почту клиента для отправки уведомления  
````
   if (session.data.\_clients) \{  
        const client = await session.data.\_clients\[0\].fetch();  
        const user = await client.data.\_user?.fetch();  
        if (user) \{  
           Context.data.email = user.data.email;  
            \}  
        \}  
````
// Определяем заявку, в которой ведётся диалог  
````
      const id\_application =  
   session.data.\_externalChatId.split(\`service\_desk:applications:\`)\[1\];  
      if (id\_application) \{  
         Context.data.application = await Context.fields.application.app.search().where(f =>  
   f.\_\_id.eq(id\_application)).first();  
        \}  
    \}  
\}
````

5. ````
Предусмотрим, чтобы ход процесса двигался по разным веткам в зависимости от того, получен адрес клиента или нет. Для этого добавьте на схему [исключающий шлюз](360012495911.md#exclusive-gateway) с названием **Email получен?** и двумя переходами — **Да** и **Нет**. Если почта определена, то клиенту отправится уведомление, если нет — процесс завершится. В качестве перехода по умолчанию выберите **Нет**.

6.  Для перехода **Да** добавьте блок [Оповещение на email](360011443400.md). В его настройках заполните обязательные поля, используя переменные, созданные на шаге 3.

**(new-message-events-processing-2.png)**

- **Получатель\*** — добавьте переменную `\{\$email\}`, содержащую электронную почту клиента;

- **Тема письма\*** — напишите короткую тему и добавьте к ней переменную `\{\$application\}`, чтобы клиент видел, по какой заявке пришёл ответ;

- **Текст письма\*** — вставьте переменную `\{\$message\}` с ответом оператора.

7. Сохраните и опубликуйте процесс.

### Шаг 2. Настройка обработчика событий

После создания бизнес-процесса в модуле выполните следующие действия:

1. В настройках модуля на вкладке **Обработка событий** нажмите **+** **Обработчик**. В открывшемся окне заполните и сохраните данные:

- название обработчика, например, **Новое сообщение**;

- тип обработчика — **Запуск процесса**;

- домен события — **Линии**;

- событие — **Новое сообщение**.

2. В открывшемся окне на вкладке **Настройки** выберите созданный ранее процесс **Оповещение о новом сообщении**.

3. Перейдите на вкладку **Входные переменные** и сопоставьте переменные из контекста процесса с аналогичными свойствами события.

4. На верхней панели страницы нажмите **Сохранить**, а затем **Опубликовать**, чтобы активировать обработчик событий.

5. Перейдите на страницу управления модулем и включите его.

Теперь, когда оператор отправит ответ в сессию, клиент своевременно получит уведомление об этом на свою электронную почту.