Доступ к управлению линиями, сессиями и каналами, а также получение переписки и данных метрик линий осуществляется с помощью свойств типа 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();

Type aliases

LineSessionPriorityEnumBase

LineSessionPriorityEnumBase: Low | Medium | High
  • Low — низкий;

  • Medium — средний;

  • High — высокий;

LineSessionStateEnumBase

LineSessionStateEnumBase: Waiting | AssignedToBot | AssignedToOperator | Closed | MarkedAsSpam
  • Waiting — находится в очереди;

  • AssignedToBot — назначена на бота;

  • AssignedToOperator — назначена на оператора;

  • MarkedAsSpam — помечена как спам;

  • Closed — закрыта.