Type aliases
LineSessionPriorityEnumBase
Low
— низкий;Medium
— средний;High
— высокий;
LineSessionStateEnumBase
Waiting
— находится в очереди;AssignedToBot
— назначена на бота;AssignedToOperator
— назначена на оператора;MarkedAsSpam
— помечена как спам;Closed
— закрыта.
Линии
Доступ к управлению линиями, сессиями и каналами, а также получение переписки и данных метрик линий осуществляется с помощью свойств типа LinesCollections.
Работа с линиями
Получить линии и их параметры можно с помощью метода Lines.search.
Получить линию с названием some line можно следующим образом:
const line = await System.lines.lines.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f.__name.eq("some line"), )) .first();
Работа с каналами (мессенджерами)
Получить конкретные каналы можно с помощью метода LineChannels.search.
Канал может находиться в одном из трёх статусов: Активен, Разорван, Ошибка (см. LineChannelState).
Пример получения всех неактивных каналов:
const inactiveChannels = await System.lines.channels.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._state.neq(LineChannelState.active), )) .all();
В дальнейшем можно изменять статус активности канала с помощью методов типа LineChannelItemRef.
Отключить канал можно следующим образом:
const channel = await System.lines.channels.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._state.eq(LineChannelState.active), )) .first(); await channel.disconnect();
Отключённые каналы можно переподключить, однако это возможно только для каналов определённых типов:
telegramBot
,inbox
,viberbot
,livechat
,instagram
(см. LineChannelType).Пример переподключения каналов:
// Ищем неактивные каналы разрешённых типов const channels = await System.lines.channels.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._state.neq(LineChannelState.active), f._type.in([ LineChannelType.inbox, LineChannelType.telegramBot, LineChannelType.viberbot, LineChannelType.livechat, LineChannelType.instagram, ]), )) .size(100) .all(); for (const channel of channels) { await channel.reconnect(); }
Работа с клиентами
Клиенты — пользователи каналов (мессенджеров), которые пишут в линию. Для поиска клиента можно воспользоваться методом LineClients.search.
Например, можно найти пользователя Telegram по его учётной записи:
// Ищем канал типа telegram const channel = await System.lines.channels.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._type.eq(LineChannelType.telegram), )) .first(); // Ищем привязанного к найденному каналу клиента const client = await System.lines.clients.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._channel.eq(channel), f._username.eq("telegram_username"), )) .first();
Для привязки элемента приложения к клиенту можно использовать метод LineClientItem.save. Для этого в поле клиента LineClientData._applicationItem нужно сохранить ссылку на элемент приложения. Следует обратить внимание, что упомянутое приложение должно быть выбрано для связи с учётной записью в настройках линии, к которой привязан клиент.
Пример такой привязки:
const contact = Context.data.contact!; const client = await System.lines.clients.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._username.eq("telegram_username"), )) .first(); client.data._applicationItem = contact; await client.save();
Работа с сессиями
Сессия — это основной объект, содержащий переписку клиентов и операторов линий.
Сессия может находиться в одном из четырёх статусов (см. LineSessionState):
В очереди — сессия ожидает назначения оператора, никто не может ответить на сообщения клиента;
Назначена на бота — клиент ведёт переписку с ELMA Bot;
Назначена на оператора — клиент ведёт переписку с конкретным оператором;
Закрыта — переписка в рамках этой сессии завершена. Если клиент напишет снова, будет создана новая сессия.
Поиск и создание сессий осуществляется с помощью методов типа LineSessions.
Пример поиска открытой сессии с конкретным клиентом:
const client = await System.lines.clients.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f._username.eq("telegram_username"), )) .first(); const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f._clients.all([client]), f._state.neq(LineSessionState.Closed), )) .first();
Для создания новой сессии от имени оператора можно использовать метод LineSessions.create. Метод принимает канал, в рамках которого необходимо создать сессию, и учётную запись (аккаунт) клиента, с которым необходимо начать переписку. В зависимости от типа канала это может быть учётная запись (или псевдоним), номер телефона, электронная почта и т. д.
const contact = await Context.data.contact.fetch(); const account = contact.data._account[0].login; const newSession = await System.lines.sessions.create(Context.data.channel, account);
В дальнейшем можно управлять сессией (назначать на оператора, бота или группу операторов, закрывать, получать переписку) с помощью методов типа LineSessionItemRef.
Например, назначить сессию на конкретного оператора можно так:
const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f.__id.eq(Context.data.sessionId!), )) .first(); await session.assignToOperator(Context.data.user);
Пример получения последнего сообщения в сессии:
const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f.__id.eq(Context.data.sessionId!), )) .first(); const lastMessage = await session.getLastMessage();
Пример отправки системного сообщения в сессию:
const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f.__id.eq(Context.data.sessionId!), )) .first(); const message = session.sendSystemMessage('Приоритет изменён на "Высокий"');
Также сессию можно пометить как спам. Использование этого метода аналогично закрытию сессии, однако метрики такой сессии не будут учитываться в статистике. Пометить сессию как спам невозможно для каналов следующих типов:
internal
,support
(см. LineChannelType).const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f.__id.eq(Context.data.sessionId!), )) .first(); await session.markAsSpam();
Последнюю сессию в цепочке диалогов с клиентом или любую сессию канала типа
inbox
(см. LineChannelType) можно вернуть из спама в работу. Метрики такой сессии будут вновь учитываться в статистике.const session = await System.lines.sessions.search() .where((f,c) => c.and( f.__deletedAt.eq(null), f.__id.eq(Context.data.sessionId!), )) .first(); await session.unmarkAsSpam();