diff --git a/app/livechat/server/config.js b/app/livechat/server/config.js index 5cb1a2a75fa..6de0719a1aa 100644 --- a/app/livechat/server/config.js +++ b/app/livechat/server/config.js @@ -166,6 +166,12 @@ Meteor.startup(function() { i18nLabel: 'Comment_to_leave_on_closing_session', }); + settings.add('Livechat_enabled_when_agent_idle', true, { + type: 'boolean', + group: 'Livechat', + i18nLabel: 'Accept_new_livechats_when_agent_is_idle', + }); + settings.add('Livechat_webhookUrl', false, { type: 'string', group: 'Livechat', diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js index cc710a124a1..5c818d46864 100644 --- a/app/models/server/models/Users.js +++ b/app/models/server/models/Users.js @@ -7,6 +7,23 @@ import { Base } from './_Base'; import Subscriptions from './Subscriptions'; import { settings } from '../../../settings/server/functions/settings'; +const queryStatusAgentOnline = (extraFilters = {}) => { + if (settings.get('Livechat_enabled_when_agent_idle') === false) { + extraFilters = Object.assign(extraFilters, { statusConnection: { $ne: 'away' } }); + } + + const query = { + status: { + $exists: true, + $ne: 'offline', + }, + statusLivechat: 'available', + roles: 'livechat-agent', + ...extraFilters, + }; + + return query; +}; export class Users extends Base { constructor(...args) { super(...args); @@ -74,14 +91,7 @@ export class Users extends Base { } findOnlineAgents() { - const query = { - status: { - $exists: true, - $ne: 'offline', - }, - statusLivechat: 'available', - roles: 'livechat-agent', - }; + const query = queryStatusAgentOnline(); return this.find(query); } @@ -112,29 +122,13 @@ export class Users extends Base { } findOneOnlineAgentByUsername(username) { - const query = { - username, - status: { - $exists: true, - $ne: 'offline', - }, - statusLivechat: 'available', - roles: 'livechat-agent', - }; + const query = queryStatusAgentOnline({ username }); return this.findOne(query); } findOneOnlineAgentById(_id) { - const query = { - _id, - status: { - $exists: true, - $ne: 'offline', - }, - statusLivechat: 'available', - roles: 'livechat-agent', - }; + const query = queryStatusAgentOnline({ _id }); return this.findOne(query); } @@ -148,30 +142,17 @@ export class Users extends Base { } findOnlineUserFromList(userList) { - const query = { - status: { - $exists: true, - $ne: 'offline', - }, - statusLivechat: 'available', - roles: 'livechat-agent', - username: { - $in: [].concat(userList), - }, + const username = { + $in: [].concat(userList), }; + const query = queryStatusAgentOnline({ username }); + return this.find(query); } getNextAgent() { - const query = { - status: { - $exists: true, - $ne: 'offline', - }, - statusLivechat: 'available', - roles: 'livechat-agent', - }; + const query = queryStatusAgentOnline(); const collectionObj = this.model.rawCollection(); const findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index b6e10cb44b5..9dff79f6768 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -14,6 +14,7 @@ "%_of_conversations": "% of Conversations", "Accept": "Accept", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accept incoming livechat requests even if there are no online agents", + "Accept_new_livechats_when_agent_is_idle": "Accept new livechat requests when the agent is idle", "Accept_with_no_online_agents": "Accept with No Online Agents", "access-mailer": "Access Mailer Screen", "access-mailer_description": "Permission to send mass email to all users.", diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index ed97b3471a3..36d2dff5ce7 100644 --- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -14,6 +14,7 @@ "%_of_conversations": "% de conversas", "Accept": "Aceitar", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Aceitar requisições de livechat mesmo que não tenham agentes online", + "Accept_new_livechats_when_agent_is_idle": "Aceitar novas requisições de livechat quando o agente estiver inativo", "Accept_with_no_online_agents": "Aceitar Sem Agentes Online", "access-mailer": "Acessar Tela do Mailer", "access-mailer_description": "Permissão para enviar e-mails em massa para todos os usuários.",