Type aliases
LineSessionPriorityEnumBase
Low
Medium
High
LineSessionStateEnumBase
Waiting
. The session is in the queue.AssignedToBot
. The session is assigned to a bot.AssignedToOperator
. The session is assigned to an operator.MarkedAsSpam
. The session is marked as spam.Closed
. The session is closed.
Live Chats
To manage Live Chats, sessions, and channels or get Live Chat messages and metrics, use the properties of the LinesCollections type.
Working with Live Chats
You can get Live Chats and their parameters using the Lines.search method. For example, here is how you can get a Live chat named Some live chat:
const line = await System.lines. lines.search() .where((f, g) => g.and( f.__deletedAt.eq(null), f.__name.eq('Some live chat'), )) .first();
Working with channels (messengers)
You can get a specific channel using the LineChannels.search method. A channel can be assigned one of the following statuses: Active, Disconnected, or Error (see LineChannelState). For example, you can get all inactive channels in the following way:
const inactiveChannels = await System.lines. channels.search() .where((f, g) => g.and( f.__deletedAt. eq(null), f._state.neq(LineChannelState.active), )) . all();
You can change a channel’s status using LineChannelItemRef type methods. Here is how you can disconnect a channel:
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();
You can make a disconnected channel active again. However, this is only available for certain types of channels:
telegramBot
,inbox
,viberbot
,livechat
, andinstagram
(see LineChannelType). Here is an example of activating a disconnected channel:// Search for disconnected channels of the types that can be activated 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(); }
Working with clients
Clients are users who write to Live Chats using channels (messengers). To search for clients, use the LineClients.search method. For example, you can find a Telegram user by account:
// Search for a `telegram` type channel const channel = await System.lines.channels.search() .where((f, g) => g.and( f. __deletedAt.eq(null), f._type.eq(LineChannelType.telegram), )) .first(); // Search for a client linked with the channel 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();
To link an app item with a client, use the LineClientItem.save method. You need to save a link to the app item in the LineClientData._applicationItem property of the client. Note that the app has to be available for linking with an account in the settings of the client’s Live Chat. Here is an example of linking an account with an app item:
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();
Working with sessions
A session is the main object containing a conversation between a Live Chat’s client and its operator. A session can be assigned one of the following statuses (see LineSessionState):
To create a new session on behalf of the operator, use the LineSessions.create method. This method accepts the channel that the session needs to be created in and the account of the client. Depending on the channel type, this can be an account (or nickname), a phone number, an email, etc.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();
To manage a session you created (assign it to an operator, a bot, or an operator group, close it, or get messages from it), use methods of the LineSessionItemRef type. For example, you can assign a session to a specific operator in the following way: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);
Here is how you can get the last message in a session: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);
Example of sending a system message to a session: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();
You can also mark a session as spam. This is the same as closing a session, except that the metrics of such a session will not be taken into account in reports. It is impossible to mark a session as spam for theconst 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('Priority changed to High');
internal
andsupport
channel types (see LineChannelType).
If a session is the last in a chain of conversations with a customer or if its type isconst 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
, you can also remove it from spam and resume working on it. The metrics of such a session will be included in the statistics again.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();