import { ServiceClassInternal } from '@rocket.chat/core-services'; import type { IOmnichannelService } from '@rocket.chat/core-services'; import type { AtLeast, IOmnichannelQueue, IOmnichannelRoom } from '@rocket.chat/core-typings'; import { License } from '@rocket.chat/license'; import moment from 'moment'; import { OmnichannelQueue } from './queue'; import { RoutingManager } from '../../lib/omnichannel/RoutingManager'; import { notifyAgentStatusChanged } from '../../lib/omnichannel/omni-users'; import { settings } from '../../settings'; export class OmnichannelService extends ServiceClassInternal implements IOmnichannelService { protected name = 'omnichannel'; private queueWorker: IOmnichannelQueue; constructor() { super(); this.queueWorker = new OmnichannelQueue(); } override async created() { this.onEvent('presence.status', async ({ user }): Promise => { if (!user?._id) { return; } const hasRole = user.roles.some((role) => ['livechat-manager', 'livechat-monitor', 'livechat-agent'].includes(role)); if (hasRole) { // TODO change `Livechat.notifyAgentStatusChanged` to a service call await notifyAgentStatusChanged(user._id, user.status); } }); } override async started() { settings.watchMultiple(['Livechat_enabled', 'Livechat_Routing_Method'], () => { this.queueWorker.shouldStart(); }); License.onLimitReached('monthlyActiveContacts', async (): Promise => { this.queueWorker.isRunning() && (await this.queueWorker.stop()); }); License.onValidateLicense(async (): Promise => { RoutingManager.isMethodSet() && (await this.queueWorker.shouldStart()); }); // NOTE: When there's no license or license is invalid, we fallback to CE behavior // CE behavior means there's no MAC limit, so we start the queue License.onInvalidateLicense(async (): Promise => { this.queueWorker.isRunning() && (await this.queueWorker.shouldStart()); }); } async isWithinMACLimit(room: AtLeast): Promise { const currentMonth = moment.utc().format('YYYY-MM'); return room.v?.activity?.includes(currentMonth) || !(await License.shouldPreventAction('monthlyActiveContacts')); } }