Воркспейс — поточний стан по проектах

As-is порівняння реалізацій оператор-ранера по Golden / Chathouse / Prime. Цільова уніфікація — у Unification.

Проекти (колонки):

ПроектСайтДе крутиться ранерКлючові класи
GoldenGoldenbrideклієнт (stack-electron, src/main/operator/)OperatorRunner, LadyRunner, interval-services/*
ChathouseChathouseсервер (stack-chathouse)OperatorRunner, LadyRunner, WorkspaceRunner
PrimeTalkyTimesсервер (stack-prime)PrimeRunner, AsyncPrimeWs, воркери (без per-lady класу)

Як читати

Клас фічі — наскільки вона повинна бути однаковою:

КласЗначення
Спільнемає бути в усіх і працювати однаково — ціль уніфікації
Вимушено різнепотрібне всюди, але реалізація лише специфічна (сендер, фаворити)
Унікальнетільки в одному проекті, не портується (вкладка Electron, auth_codes)

Стан по проекту — мітка:

МіткаЗначення
🟢є і відповідає ідеалу
🟡є, але відрізняється (механізм / таймінг)
🔴нема / не відповідає
не застосовно
?не з’ясовано
💬потребує обговорення

1. Логін = запуск воркспейсу

#ФічаКласGoldenChathousePrime
1.1Перевірка версії програмиУнікальне 💬🟢💬💬
1.2Синхронізація локального/серверного часуУнікальне 💬🟢💬💬
1.3Конект сокета (до серверу) → список TUСпільне🟢🟢🟡
1.4Поведінка при дисконектіВимушено різне💬🟢🟢🟢
  • 1.1 — Electron — зрозуміло; на фронті можна перевіряти версію фронта після оновлення - щоб швидше застосувались фікси.
  • 1.2 — Перевірка часу юзера має місце бути всюди.
  • 1.3 — Успішний конект сокету тригерить запуску оператор ранера
  • 1.4 — Golden працює далі (авто-реконект з бекофом). Мережу стежить network-service: пінг Google + сервер кожні 10с; обидва недоступні 60с → app.quit(). Chathouse/Prime: лоадер на фронті 60с → зупинка ранера. Вхід іншого оператора (forceDisconnect) вбиває сесію в усіх трьох (у Golden теж → app.exit).

2. Оператор-ранер (ініціалізація)

Захист і допуск

#ФічаКласGoldenChathousePrime
2.1Захист від паралельного запускуСпільне🟢🟢🟢
2.2Допуск анкети перед логіномСпільне 💬🟡🟢🟡
2.3Перевірка робочих годинСпільне 💬🟢🟢🟢
2.4Стартовий чек-ліст логікСпільне 💬🔴🟢🟢
2.5Ініціалізація сервісів ElectronУнікальне🟢
  • 2.1 — Golden: В електрону ця логіка простіша, бо це один додаток; Chathouse та Prime - складніші перевірки (треба уніфікувати) бо фронт можна оновлювати і тригерити процеси.
  • 2.2 — Суть однакова: перевірити робочі години + перевірити анкети. Реалізація різна. Chathouse: auth_codesceil(N анкет / maxProfilesPerAuthCode) кодів, анкети розкладаються по кодах; поза робочими годинами TU логіниться лише якщо її lastAuthCode серед кодів оператора. Prime: isBlocked/isDeleted/isActive + lastRefCode (поза годинами — лише за збігом refcode).
  • 2.3 — Ця логіка є всюди, але реалізовано по-різному. Golden це перевіряє при конекті/реконекті сокету коли отримує у відповідь список анкет.
  • 2.4 — чек-ліст Favorite/UnFavorite/Icebreaker стрімиться оператору (Chathouse StatusLogicalRunner, Prime statusLogical); у Golden нема. Розглянув би це для покращення.
  • 2.4 — Електрону треба отримати різні дані та ініціалізувати сервіси (їх будуть використовувати сервіси які піднімуться далі)

Сервіси / ранери оператора

#ФічаКласGoldenChathousePrime
2.5Агрегація дій оператора (онлайну)Спільне💬🟢🟡🟡
2.6Логіка оновлення останнього онлайну оператора (редіс)Спільне💬🟡🟡🟡
2.7NeedToWriteMailRunnerСпільне💬🟡🟡🟡
2.8PostChatMailTaskRunnerСпільне💬🔴🟢🔴
2.9Стрім-трекер камер (стрім TU)Унікальне🟢
2.10Data-sync стану на бекУнікальне🟢
2.11Ініціалізація ранерів TU (на рівні оператор ранера) - це відбувається паралельно з логіками оператор ранераУнікальне🟢
  • 2.5 — Всюди є логіка кіку за неактивність, підрахунку онлайну та дій оператора. Реалізовано по-різному й розкидано. Golden: неактивність 10хв → попап → 30с → app.quit(). Chathouse/Prime: 5хв (prod) → дисконект. ⚠️ Golden sleep-mode зараз фактично no-op (sleepModeActive завжди false) — гейти сну в тасках/сендері неактивні (#fix).
  • 2.6 — оновлює в Redis коли оператор був онлайн, умови різні. Ранери: Golden — activity / lady-online; Chathouse — LadiesOnlineSaver (щогодини) + UserOnlineSaverRunner; Prime — LadyOnlineSaver (2хв) + UserOnlineSaverRunner.
  • 2.7 — Чатхаус має кілька окремих логік по створенню NeedToWriteMail тасків
  • 2.8 — PostChatMailTaskRunner ще однин спосіб створення цих тасків, які має тільки чатхаус.
  • 2.9 — Golden фіксує інтервали трансляцій анкети;
  • 2.10 — Electron зберігає резульатати логік та дані на сервер;
  • 2.11 — Electron не має прямого доступу до БД → перед ранерами йде синхронний критичний шлях (раніше пропущений): перекладач (deepL), network-service (пінг 10с), отримання PUBLIC_KEY, man-service (стор профілів RU + збереження нових 300с), agency-service (глобальний набір агенції для NEW-сендера), activity, stream-tracking, data-sync. Далі — ініціалізація даних для ранерів TU (паралельно з логіками оператор-ранера): — Ініт сервісу статистики — Ініт та запуск сервісу фаворитів — Отримання історії тасків — 🟡Запуск Імейл сервісу (це вшито на цьому етапі і унікально поки тільки для голден) — Інтервал оновлення статистики — Запуск інтервалів створення тасків — Запуск інтервалу чат сендера — Ініціалізація сендерів — Старт леді онлайн сервісу - перевіряє онлайн анкет та сокет, реконектить, там логує час в онлайні — Сервіс збереження переглядів профіля.

3. Ранер TU (LadyRunner)

#ФічаКласGoldenChathousePrime
3.1Логін анкетиСпільне🟢🟢🟢
3.2Тримання анкети онлайнСпільне🟡🟡🟡
3.3Фаворит-сервісВимушено різне💬🟡🟡🟡
3.4Сокет до сайту (реалтайм)Спільне🟢🟢🟢
3.5Оновлення чат/фаворит-історіїВимушено різне🟡🟢🟢
3.6Таск-сервісСпільне 💬🟢🟢🟢
3.7Айс воркерВимушено різне🟢🟢
3.8Ініт вайт-листаУнікальне💬🟢
3.9Man-online сервісВимушено різне🟢
  • 3.1 — Логін як би все зрозуміло. Тільки голден має нюанси: створення сторінки, логін на сторінці, сокет, логін на апі.
  • 3.2 (приклад складнощів) — Golden lady-online.service кожні 60с робить два механізми: перевірка онлайну (getOnlineLadies → тригер реконекту, ≤3 спроби якщо !вкладка / !онлайн) + активний setAuthUserOnline (keepAlive). Chathouse: ApiOnlineLadyRunner (per-TU 60с) лише реєструє TU у глобальний PingOnlineListRunner, який батчить per-adminId і пінгує адмін-API 60с (тільки prod). Prime: без keep-alive, онлайн тримає лише Centrifuge WS. Перевірка онлайну з партнерського API реально є тільки в Golden (getOnlineLadies); Prime її не робить, хоча адмінка datame.cloud/platform/trusted-user/collection повертає TU з is_online; Chathouse окремого запиту не має (presence зі сокета). Реконект: Golden — re-init вкладки (≤~4 спроби) + Red5-сокет 5× (3/7/10/20/20с); Chathouse ReconnectLadyRunner лише на fail старту TU, до 15×; Prime — вбудований Centrifuge-бекоф без re-login.
  • 3.3 — з даних сайту по-різному: Golden оверлей (база + пер-хв статистика); isActiveFavorite = активність за 7 днів (той самий поріг, що й Chathouse — не унікальний для нього). Chathouse FavoriteWorker (7д, флаги blocked/isBlackList/isFree, синк блок-листа в ClickHouse). Prime FavoritesStore (поріг 11 платних) + mailTaskPrime при першому проході робить one-time скрол усієї історії per TU, рахує платні вхідні й наповнює фаворитів.
  • 3.4 — Golden — сокет усередині браузерної вкладки анкети; Chathouse/Prime — серверний Centrifuge WS.
  • 3.5 — Golden оновлює фаворитів зі статистики, чат-історії нема. Chathouse WorkspaceRunner 60с: два списки (saved + all), вікно історії 2год, тегує freeloader. Prime PrimeWorkspaceRunner 60с: чат-історія вікно 4год, закладки глибина , мейл-історія 7д.
  • 3.6 — Всі мають таск фабрику та сервіси, але реалізовано по-різному
  • 3.7 — Айс-воркер: раз на день на TU активує 1 рандомний ice на кожен тип (діалог / inmail), стрімить у чек-ліст статусів. Golden такого не має.
  • 3.8 — 💬 Зараз вайт лист має голден і ця ініціалізація просто треба, але потребувати обговорення.
  • 3.9 — Golden: онлайн+стрім кожні 15с, профілі RU ~5хв; Голден має апі для цього, щоб тримати пул РЮ онлайн та оновлювати їх міні-профіль.

4. Таски

#ТаскКолірКласGoldenChathousePrime
4.1UnansweredMessageжовтийСпільне🟡 50с🟡 120с🟡 120с
4.2ActiveChatжовтийВимушено різне🟢 50с
4.3UnansweredMailжовтийСпільне🟡 600с🟡 900с🟡 900с
4.4NeedToWriteMessageзеленийСпільне🟡 120с🟡 180с🟡 180с
4.5NeedToWriteMailзеленийСпільне🟡 600с🟡 1200с
4.6LikeсинійВимушено різне🟡 50с🟡 300с🟡 300с
4.7LimitsAreOpenedчервонийСпільне🟢 300с🟢 300с
4.8Typing?🔴🟢🟡
4.9UnansweredEmailжовтийУнікальне🟢 3600с

Числа в таблиці — таймер авто-закриття таска, не інтервал скану (інтервали — у таблиці «Умови створення» нижче). Golden mail: оператору показується 900с, хард-закриття — 600с. Prime-числа теж таймери; реальні кадансі скану лише в умовах.

  • 4.1 — RU написав повідомлення.
  • 4.2 — Особливість голдена та платного чату.
  • 4.3 — RU написав листа.
  • 4.4 — активний фаворит онлайн, останнє від TU >10хв.
  • 4.5 — активний фаворит онлайн + останній лист >12год..
  • 4.6 — вхідний лайк/розочка (Golden 🌹 → Like; Chathouse/Prime — лайк профіля).
  • 4.7 — пустий діалог з відкритими лімітами;
  • 4.8 — подія typing по сокету, інфо-таск без збереження (Prime — no-op).
  • 4.9 — клієнт-email діалог (окремий канал, не листи сайту).

Умови створення тасків

Три осі. Механізм: сокет (реалтайм-подія) · скрол (інтервальний обхід/пагінація діалогів) · статистика (колонки подій). Типи: Unanswered чат/мейл, NeedToWrite чат/мейл, OpenLimits, OpenLimits VIP, Like, Typing. Скрол-логіки: що крутимо → знаходимо → як часто → як глибоко.

Шляхи створення по типах:

ТипGoldenChathousePrime
Unanswered чатсокет + скролсокет + скролсокет + скрол
Unanswered мейлстатистикасокет + скролскрол
NeedToWrite чатскролскрол + сокетскрол (×2)
NeedToWrite мейлстатистикаскрол + статистика + сокет— (зводиться)
OpenLimitsскролскрол + сокет
OpenLimits VIPпланувальник (наш DB)
Likeсокетсокет + скролскрол + сокет
Typingсокет

Golden-only: ActiveChat (сокет, стейт-машина платного чату). Prime має ще LikeMail (скрол, окремий 600с).

Скрол-логіки — що крутимо і що знаходимо:

ПроєктЩо крутимо (запит)ЗнаходитьКадансГлибина
Goldenростер онлайн-фаворитів (in-memory) + chatHistoryUnanswered / NeedToWrite чат60сснапшот останнього повід. (без пагінації)
Goldenростер зі статистики + getMailUnanswered / NeedToWrite мейл60сснапшот останнього листа
Chathouseвкладка all + is_onlineNeedToWrite чат/мейл60сдо кінця (курсор next, поки стор. ≥50)
Chathouseвкладка newUnanswered чат/мейл, Like, OpenLimits60сдо кінця
Chathouseвкладка saved (фідер)— (годує PostChatMail)60сдо кінця
Primecriteria [active, online]NeedToWrite (online)120сдо кінця (limit 40)
Primecriteria unansweredUnanswered чат, Like60сдо кінця (40)
Primeпошта inbox_unansweredUnanswered мейл60с1 сторінка (15)
Primecriteria activeOpenLimits120с1 стор./тік, stateful-курсор назад до 7 днів
Primecriteria bookmarked (снапшот воркспейсу)NeedToWrite (офлайн-фаворит)60сдо 7 днів (limit 50)
Primecriteria [] (всі діалоги)LikeMail600сдо кінця (20) + повна історія на 1-му проході

Три патерни глибини: снапшот (Golden — не пагінує, тільки останнє повід.) · до кінця (Chathouse + більшість Prime — щотіка вся вкладка) · обмежене вікно (Prime openLimit і bookmarked — назад до 7 днів; openLimit ще й тягне курсор між тіками).

Скрол — що саме крутимо (+ умови попадання в таск):

Unanswered чат.

  • Golden — ростер онлайн-фаворитів, по кожному chatHistory (снапшот останнього, без пагінації). Умова: останнє — від RU + чат ready-to-send.
  • Chathouse — пагінує вкладку new (курсор next, до <50). Умова: останнє — платне вхідне.
  • Prime — criteria unanswered (курсор, limit 40). Умова: останнє — платний тип + messagesLeft.

Unanswered мейл.

  • Golden — скролу нема (від статистики); getMail звіряє: останній лист від RU, <1 рік, не заблокований.
  • Chathouse — та сама вкладка new, якщо останнє = платний inmail.
  • Prime — пошта inbox_unanswered (1 стор., limit 15). Умова: lettersLeft + діалог не заблокований.

NeedToWrite чат.

  • Golden — ростер активних онлайн-фаворитів, chatHistory. Умова: останнє — від TU >10хв, не white-list, чат ready-to-send.
  • Chathouse — вкладка all+is_online. Умова: TU-останнє, є chat-ліміти, збережений/онлайн або >1год.
  • Prime — criteria [active,online]: TU-останнє ≥2год + messagesLeft + bookmarked. + сканер bookmarked (NoOnlineActiveFavorite): RU офлайн, останнє 12–16год, є ліміти.

NeedToWrite мейл.

  • Golden — від статистики: активний фаворит онлайн, останній лист >12год або прийшов бонус, mail ready-to-send.
  • Chathouse — вкладка all+online при mail-лімітах (решта шляхів — статистика/сокет).
  • Prime — окремого типу нема (зводиться в NeedToWrite / обробляє мейл-сендер).

OpenLimits.

  • Chathouse — вкладка new: порожній/непроявлений діалог (id=null) або «liked each other» з відкритими лімітами.
  • Prime — criteria active, stateful-курсор (1 стор./тік, limit 15, reset на 7 днях). Умова: останнє = system, є messagesLeft, не заблокований, ≤7 днів.

OpenLimits VIP.

  • Prime — не скрол: планувальник по нашому DB. Умова: леді активна + canCreateChat, є ліміти, не частіше ніж 1 VIP / 2год на TU; + ручне.

Like.

  • Chathouse — fallback у вкладці new: вхідне = лайк + ліміти.
  • Prime — criteria unanswered: останнє = like-тип + messagesLeft. LikeMail — усі діалоги ([], limit 20): like + bookmarked + lettersLeft, чат-ліміти вичерпані.

Typing — тільки сокет, скролу нема.

Статистика (є лише там, де є детальна статистика подій):

  • Golden — temp-statistics: EMAIL_SEND → Unanswered мейл; EmailRead/OpenAttach → NeedToWrite мейл (жене весь mail-блок).
  • Chathouse — Mongo-статистика: inmail_read → NeedToWrite мейл (кап 2 на оператора); spend-події → PostChatMail (≥10хв після чату). 2 з 4 mail-шляхів.
  • Primeдетальної статистики нема → статистичні шляхи неможливі. Тому mail Prime тягне сканом пошти/лімітів, а окремого NeedToWrite мейл узагалі нема.

Client-email (Golden UnansweredEmail) — окрема логіка: EmailService 60с сканує зовнішній email-інбокс леді, зав’язана на поштові акаунти, а не на воркспейс-API сайтів.

Закриття тасків

Golden — статуси: лише not_active_by_timer (+ хард-видалення).

  • Відповідь оператора: chat закриває chat-таски, mail — mail-таски, email — email-таск (лог дій).
  • Таймер: сам не закриває — треба «таймер минув І RU офлайн» (sweep 15с); NeedToWriteMessage — щойно RU офлайн.
  • RU заблокував / блек-лист сайту (5хв): закриває NeedToWriteMessage/NeedToWriteMail.
  • Втрата статусу активного фаворита (60с): закриває NeedToWriteMessage/NeedToWriteMail.
  • Витіснення: UnansweredMail > NeedToWriteMail; ActiveChat/Unanswered > NeedToWrite/Like.
  • Дисконект / закриття програми: зупинка lady-runner закриває всі таски одразу (прострочені → not_active_by_timer, решта — хард-видалення); нові не створюються.
  • Ре-старт після логіну: хард-видаляє висячі таски леді.

Chathouse — статуси: not_active_by_timer / closed_offline / need_debug (+ хард).

  • Відповідь оператора: mail-повідомлення закриває тільки mail-таски; chat — усі не-mail для пари.
  • Таймер: сервер форсить тільки для NeedToWrite (і лише якщо RU офлайн); для решти типів таймер — візуальний на фронті.
  • RU заблокував анкету: виявляється сканом (blocked_by_ru у діалозі), не сокетом (подія trusted_user_block не в allowed-списку ApiWs) → хард-видалення всіх типів пари.
  • Витіснення: Unanswered > NeedToWrite; mail-слот (кап 2 таски).
  • Дисконект / закриття програми: воркер із затримкою 10хв — не повернувся → closed_offline (+ «підмітання» решти → need_debug); повернувся <10хв — таски лишаються.
  • Анти-воскресіння: кеш закритих mail-тасків не дає їх перестворити скану.

Prime — статуси: another_task / closed_offline / notactive_by_timer / need_debug (+ хард).

  • Відповідь оператора: будь-яка відправка закриває всі таски пари (lady+man).
  • Таймер: авто-закриває тільки online/NeedToWrite (лише якщо RU офлайн); інші типи по таймеру не закриваються.
  • RU заблокував: сокет Blocked або помилка відправки → хард-видалення всіх типів пари.
  • Витіснення / дедуп: новий таск по тому ж діалогу або парі витісняє старий → another_task.
  • Дисконект / закриття програми: воркер із затримкою 10хвclosed_offline (+ решта → need_debug); повернувся <10хв — лишаються.
  • Ре-старт після логіну: перевіряє DB-таски (unanswered/openLimit) → another_task якщо застаріли (online-таски не відновлює).

Спільні тригери зупинки ранера (Chathouse/Prime): авто-дисконект неактивного оператора (5хв, prod), вхід іншого оператора на ту саму анкету, закриття вкладки/додатку, помилки авторизації сокета.

Створення діалогів

  • Prime — окрема підсистема CreatingChat: глобальний планувальник (не в ранері оператора, prod) тікає кожні 2хв і створює VIP-чат на TU не частіше ніж раз на 2год; є ручне створення оператором. Кандидати: наша агенція (profit ≥ 11), зовнішня (>30 повідомлень) або мікс; пошук рандомного онлайн-RU батчами по 50, перевірка лімітів. Коли таск-стор порожній — оператору йде сигнал readyCreateChat (пропозиція почати новий чат).
  • Golden — окремого створення діалогів нема. Еквівалент — реактивна стейт-машина ActiveChat на сокет-подіях paidChatStarted / paidChatStopped (заголовки ChatActive ↔ Unanswered ↔ Finished).
  • Chathouse — окремого створення нема; LimitsAreOpened для «непроявленого» діалогу (id=null) або «liked each other»; відправка неявно створює діалог.

5. Сендери

#ФічаКласGoldenChathousePrime
5.1АрхітектураВимушено різне2 окремієдинийєдиний
5.2Чат та мейл по двох типах ще (NAF/FANM)Унікальне🟢
5.3Ланцюжки інвайтівСпільне🟡🟢🟡
5.4Блек-листСпільне🟢🟢🟡
5.5Медіа-обмеженняСпільне🟢
5.6Довідправка після сендеруСпільне🔴🟢🟡
5.7Хто робить інвайтиВимушено різне 💬операторитімлідтімлід

Затримки:

чатмейл
Golden (API)рандом 65–360с/чоловіка + гейт черги 5.5с/TUNAF 1 доба / FANM 7 діб
Chathouse1год/чоловіка6год
Prime2год/чоловіка12год/чоловіка
  • 5.1 — Golden: окремі ChatSender + MailSender; Chathouse/Prime: єдиний ранер (чат → мейл, вирішує сам).
  • 5.2 — Мейл сендер NAF (Not Active Friends, ресет щодоба; ціль — неактивні фаворити, що були онлайн за 48год, квота до дедлайну 23:45) / FANM (First Admire New Men, ресет 7 діб) — тільки Golden.
  • 5.3 — Golden: чат-слоти 1–18 (FAV) / 1–6 (NEW), повтор FAV через 3год, NEW через 1год; Chathouse: шаблони + до 2 дод.; Prime: скриптовий ланцюг.
  • 5.4 — Golden: golden_naf/fanm_black_list + окремий сайт-блок-лист (оновлення 300с); Chathouse: через сторінку фаворитів (isBlackList per-(TU,RU), скіп 10хв); Prime: per-(lady,man) + глобальний.
  • 5.5 — Chathouse: фото лише при витраті 20+, стікер — при limits.sticker; для витрати 0–20 — окремий low-credit шаблон мейлу.
  • 5.6 — Chathouse: до 2 дод. (текст/стікер/фото), перед кожною перевіряє що попереднє дійшло; (Prime через UI 💬 ???).
  • 5.7 — Golden вручну (оператор/topManager + модерація); Chathouse та Prime - тімліди.

6. Імейли

#ФічаКласGoldenChathousePrime
6.1Окремий канал клієнт-emailУнікальне🟢
6.2Листи сайту (inmail)Спільне🟢🟢🟢
  • 6.1 — зовнішні клієнт-email діалоги → таск UnansweredEmail (3600с); у Chathouse/Prime окремого email-модуля нема.
  • 6.2 — листи сайту обробляються сендер/таск-блоками (розділи 4–5).

7. Великі розбіжності

#ФічаКласGoldenChathousePrime
7.1ФрілоадериСпільне 💬🔴🟢🟢
7.2White-listУнікальне🟢
7.3Фаворити та чатхісторіВимушено різне 💬🟡🟡🟡
  • 7.1 — чоловік лише з «безкоштовним» профітом (Chathouse isFreeProfit, Prime profit<11), виключається з мейл-тасків; Golden концепту не має. ⚠️ Chathouse: активний OnlineTask-шлях NeedToWriteMail isFreeProfit не перевіряє (виключає лише operator-level NeedToWriteMailTask) — виключення не суцільне.
  • 7.2Set<manId_api> на кожен LadyRunner (1 список на TU, багато RU), авто-видалення при profit ≥ 10; RU зі статусом контакту проходять повз white-list.
  • 7.3 — Голден оновлює фаворитів з статистики в себе в системі. Чатхаус та прайм мають апі відмічати та підгружати діалоги з останнім повідомленням по цих типах.

8. Нотатки

  • Переробить збереження нотаток чатхаус та прайм в спілну колекцію (як голден) і разом з АІ нотатками отримувати їх по курсору.