Фаворити
src/main/lady/favorite.service.ts · src/main/operator/interval-services/favorite.service.ts
Список чоловіків з якими анкета має активні стосунки. Ключова сутність для ChatSender, MailSender, TaskService та відображення в UI.
Два рівні сервісу
| Сервіс | Рівень | Роль |
|---|---|---|
operator/interval-services/favorite.service.ts | Оператор (глобальний) | Завантажує всі фаворити з API кожні 60 сек, роздає по анкетах, надсилає в UI |
lady/favorite.service.ts | LadyRunner (per анкета) | Зберігає Map<manId, IFavorite>, рахує поля, вирішує NOT_ACTIVE_FAVORITES |
Поля IFavorite — звідки
З бекенду (IApiFavorite)
| Поле | Тип | Опис |
|---|---|---|
id | string | MongoDB _id запису фаворита |
manId_api | number | ID чоловіка на сайті |
ladyId_api | number | ID анкети на сайті |
type | FavoriteType | Тип чоловіка: New, Normal, Naughty, Aggressive |
contactDetails | { email, status: FavoriteContacts } | Контактні дані чоловіка (Yes/No) |
clientEmail | { status: EmailStatus } | Статус підключення email (connect / connected) |
profit | number | Сума витрат чоловіка з анкетою |
gifts | number | Кількість подарунків |
blockedByTU | boolean | Заблокований технічним юнітом |
language | string|null | Мова спілкування (може оновлюватись оператором) |
startDate | string | Дата початку стосунків (для lifetime) |
lastDate + time | string | Дата та час останньої активності (для isActiveFavorite і NOT_ACTIVE_FAVORITES) |
name | string | Ім’я чоловіка (fallback якщо немає в manService) |
Генеруються локально
| Поле | Як рахується | Навіщо |
|---|---|---|
isActiveFavorite | Date.now() - lastTS < 7 * oneDayMs | Чоловік проявляв активність за останні 7 днів → генеруються chat-таски |
isWhite | whiteListService.isWhite(manId_api) | Чи в whitelist → ChatSender FAV трек |
isOnline | manOnlineService.manIsOnline(manId_api) | Поточний онлайн-статус |
lastOnline | З manService.profiles | Timestamp останнього онлайну |
pubID | З manService.profiles | Публічний ID для посилань |
manName | manService.profiles або favorite.name | Ім’я + вік |
manPhoto | З manService.profiles | Аватар чоловіка |
ladyName | lady.name + age | Ім’я + вік TU |
ladyPhoto | lady.photo | Фото TU |
stackLadyId | lady.stackId | Stack ID анкети |
hasStream | manOnlineService.manHasStream(manId_api) | Чи є активний стрім |
lifetime | Math.floor((now - startDate) / oneDayMs) | Кількість днів стосунків |
messages | 0 (захардкоджено) | Заглушка, раніше рахувалось з ChatSender |
mails | 0 (захардкоджено) | Заглушка, раніше рахувалось з MailSender |
NOT_ACTIVE_FAVORITES — список для MailSender
NOT_ACTIVE_FAVORITES: number[] — ключовий список для FAV треку MailSender.
Логіка формування (в updateFavorites):
getDateForNAF()→dateT= 7 днів тому,time= час 7 днів томуids= Set чоловіків у якихlastDate+time < dateT+time— тобто остання активність була більше 7 днів тому (неактивні)timeForSender = now - 48 годинidsWasOnline= фаворити що є вidsІprofile.lastOnline >= timeForSender— були онлайн за останні 48 год
NOT_ACTIVE_FAVORITES = idsWasOnline
Суть: неактивні фаворити (давно не писали) але ще заходять на сайт → гарні кандидати для листа.
isActiveFavorite
lastTS = Date.parse(lastDate + 'T' + time)
isActiveFavorite = Date.now() - lastTS < 7 * 24 * 60 * 60 * 1000
Навіщо:
true→ генеруються chat-таски (TaskChatService)false+NeedToWriteMessage/NeedToWriteMailтаск існує → закривається одразу вupdateFavorites
Автоматичне видалення з whitelist
В updateFavorites є перевірка:
якщо isActiveFavorite && isWhite && profit >= 10
→ deleteFromWhiteList() + isWhite = false
Навіщо: якщо чоловік активний і вже витратив гроші (profit >= 10) — він більше не потребує автоматичних інвайтів від сендера. Видаляється з whitelist щоб не спамити.
Оновлення
Глобальний цикл (кожні 60 сек):
stackService.getFavorites()— одним запитом всі фаворити всіх анкет- Фільтрує per анкета →
lady.favoriteService.updateFavorites(ladyFavorites) sendToFrontend()— збирає всі фаворити всіх анкет →reactService.sendFavorites()
Після ініціалізації вкладки:
updateFavoritesAfterInit() — оновлює isOnline і isWhite для вже завантажених фаворитів (без запиту до API).
FavoriteType
| Тип | Опис |
|---|---|
New | Новий фаворит |
Normal | Звичайний |
Naughty | Грайливий |
Aggressive | Активний/агресивний |
Зв’язки з іншими сервісами
| Сервіс | Як використовує |
|---|---|
| ChatSender FAV | whiteListService.isWhite() + existsFavorite() + contactDetails.status !== Yes + blockedByTU |
| ChatSender NEW | !existsFavorite() — виключає всіх фаворитів з NEW треку |
| MailSender FAV | NOT_ACTIVE_FAVORITES — список кандидатів |
| MailSender NEW | !existsFavorite() — виключає фаворитів |
| TaskChatService | isActiveFavorite — чи генерувати таски для цього чоловіка |
| TaskService | blockedByTU — не створювати таски |
| ManOnlineService | Оновлює isOnline, hasStream при кожному тіку |