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
При активації:
- Логує на сервер:
saveLog({ title: 'Operator no longer active!', isError: true }) - Логує локально:
No user activity for 1 minutes, SLEEP MODE ACTIVATED! - Викликає
setSleepMode({ sleepMode: true })
Що блокує Sleep Mode:
TaskChatService— не генеруєNeedToWriteMessage(зелені таски)TaskMailService— не генеруєNeedToWriteMail(зелені таски); жовті (UnansweredMail) генеруються завжди
ChatSender Sleep Mode не перевіряє — продовжує працювати.
Вихід зі Sleep Mode — setSleepMode({ 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 (новий день — нові ліміти відправки)