activity-service

ActivityService

src/main/operator/interval-services/activity.service.ts

Відстежує активність оператора. Вмикає Sleep Mode якщо оператор нічого не робить протягом 10 хвилин.


Інтервал

60 секунд — кожну хвилину перевіряє скільки часу пройшло з lastActivityTime.


Сесія активності

Сесія — це просто час останньої дії (lastActivityTime = Date.now()). Продовжується при кожному виклику updateActivity(action):

  • Оператор відправив повідомлення в чатupdateActivity('...')
  • Оператор відправив листаupdateActivity('...')

Кожна дія також пишеться в таблицю operator_actions (operatorActionsRepository.create(action)) і синкається на сервер — саме з цих дій сервер будує онлайн-сесії оператора (вікна активності), не лише історію. Шле їх data-sync-service.


Sleep Mode

Умова активації: 10 хвилин (INACTIVITY_TIMEOUT) без updateActivity()SLEEP_MODE = true

При активації:

  1. Логує на сервер: saveLog({ title: 'Operator no longer active!', isError: true })
  2. Логує локально: No user activity for 1 minutes, SLEEP MODE ACTIVATED!
  3. Викликає setSleepMode({ sleepMode: true })

Що блокує Sleep Mode:

  • TaskChatService — не генерує NeedToWriteMessage (зелені таски)
  • TaskMailService — не генерує NeedToWriteMail (зелені таски); жовті (UnansweredMail) генеруються завжди

ChatSender Sleep Mode не перевіряє — продовжує працювати.

Вихід зі Sleep ModesetSleepMode({ sleepMode: false }):

  • Оновлює lastActivityTime = Date.now()
  • Запускає findChatTasks() + findNeedToWriteMailTasks() для всіх TU паралельно (Promise.all)
  • Надсилає подію в renderer: reactService.sleepMode({ sleepMode: false })

Sleep-маркери в потоці дій

Окрім дій активності (chat/mail), у operator_actions пишуться маркери стану sleep — щоб сервер міг розділити онлайн-час оператора на «в sleep» і «поза sleep», не змінюючи сам онлайн.

  • На кожну реальну зміну sleep (setSleepMode, вже після гардів) → маркер sleep:on / sleep:off. Це не активність: lastActivityTime не чіпається, онлайн-вікно не подовжується.
  • На старті (start(), одноразово) → якір із поточним станом sleep. Щоб оператор, який ніколи не перемикає sleep, теж був вимірюваний; ре-анкорить після кожного перезапуску.

Значення sleep:on / sleep:off визначені в SleepMarker (src/shared/interfaces/operator-action.interface.ts) і продубльовані на сервері — змінювати синхронно.

Навіщо: оператори перестали вимикати sleep і працюють у ньому. Сервер ріже онлайн-сесії в точках цих маркерів, тож «sleep + поза-sleep» сходиться 1-в-1 із загальним онлайном. Сама логіка поділу — на боці golden.


Захисти в setSleepMode

УмоваПоведінка
!isSuccessInitializedКидає помилку, показує error в UI
SLEEP_MODE === sleepModeІгнорує (не змінює те ж саме)
Менш ніж 10 сек від останньої зміниКидає помилку (rate-limit кнопки)

Оновлення в опівночі

При старті одразу планується таймер на 00:01 наступного дняrefreshSenders():

  • Перебирає всі ladyRunners і викликає lady.chatSender.refreshSenders()
  • Скидає стан ChatSender (новий день — нові ліміти відправки)