import type { ILivechatAgent, ILivechatDepartment, SelectedAgent } from '@rocket.chat/core-typings'; import { Users, LivechatDepartmentAgents, LivechatDepartment } from '@rocket.chat/models'; import type { FindCursor } from 'mongodb'; import { checkOnlineForDepartment, getOnlineForDepartment } from './departmentsLib'; import { livechatLogger } from './logger'; import { settings } from '../../settings'; export async function getOnlineAgents(department?: string, agent?: SelectedAgent | null): Promise | undefined> { if (agent?.agentId) { return Users.findOnlineAgents( agent.agentId, settings.get('Livechat_enabled_when_agent_idle'), settings.get('Livechat_accept_chats_with_no_agents'), ); } if (department) { return getOnlineForDepartment(department); } return Users.findOnlineAgents( undefined, settings.get('Livechat_enabled_when_agent_idle'), settings.get('Livechat_accept_chats_with_no_agents'), ); } export async function online(department?: string, skipNoAgentSetting = false, skipFallbackCheck = false): Promise { livechatLogger.debug({ msg: 'Checking online agents', department }); if (!skipNoAgentSetting && settings.get('Livechat_accept_chats_with_no_agents')) { livechatLogger.debug('Can accept without online agents: true'); return true; } if (settings.get('Livechat_assign_new_conversation_to_bot')) { livechatLogger.debug({ msg: 'Fetching online bot agents for department', department }); // get & count where doing the same, but get was getting data, while count was only counting. We only need the count here const botAgents = await countBotAgents(department); if (botAgents) { livechatLogger.debug({ msg: 'Found online bot agents', botAgents }); if (botAgents > 0) { return true; } } } const agentsOnline = await checkOnlineAgents(department, undefined, skipFallbackCheck); livechatLogger.debug({ msg: 'Online agents status', department, agentsOnline }); return agentsOnline; } export async function checkOnlineAgents(department?: string, agent?: { agentId: string }, skipFallbackCheck = false): Promise { if (agent?.agentId) { return Users.checkOnlineAgents( agent.agentId, settings.get('Livechat_enabled_when_agent_idle'), settings.get('Livechat_accept_chats_with_no_agents'), ); } if (department) { const onlineForDep = await checkOnlineForDepartment(department); if (onlineForDep || skipFallbackCheck) { return !!onlineForDep; } const dep = await LivechatDepartment.findOneById>(department, { projection: { fallbackForwardDepartment: 1 }, }); if (!dep?.fallbackForwardDepartment) { return !!onlineForDep; } return checkOnlineAgents(dep?.fallbackForwardDepartment); } return Users.checkOnlineAgents( undefined, settings.get('Livechat_enabled_when_agent_idle'), settings.get('Livechat_accept_chats_with_no_agents'), ); } async function countBotAgents(department?: string) { if (department) { return LivechatDepartmentAgents.countBotsForDepartment(department); } return Users.countBotAgents(); }