service chat

LadyRunner-Tab

Створення вкладки анкети

tabsService.createChatTab({ id_api, password, PUBLIC_KEY }) · src/main/services/tabs.service.ts
loginFn(...) · src/main/scripts/connect-lady.script.ts

Відкриває реальну Electron BrowserWindow для анкети і повністю ініціалізує сесію на сайті.


1. Підготовка BrowserWindow

Для кожної анкети створюється ізольована сесія з partition: temp:profile_${id_api}:

session.clearStorageData()
session.clearCache()
session.clearHostResolverCache()
session.cookies.flushStore()

BrowserWindow прихований (show: false), nodeIntegration: false, devTools: false.

Після цього — два обробники:

JSESSIONID interception (onHeadersReceived):

  • Якщо відповідь містить Set-Cookie: JSESSIONID і URL — /rlogin → дозволяємо, логуємо в criticalLogsRepository
  • Якщо URL — agencyhelper → пропускаємо мовчки
  • Будь-який інший URL → блокуємо (видаляємо з заголовків), логуємо в criticalLogsRepository

Дозвіл на медіа (setPermissionRequestHandler):

  • permission === 'media'callback(true) — автоматично надається доступ до камери/мікрофона
  • Все інше → callback(false)

2. Завантаження та вхід (loginFn)

Вкладка відкриває https://goldenbride.net/chat#!CHAT;.

На події dom-readyexecuteJavaScript запускає loginFn у контексті вкладки.

Очищення стану в браузері

localStorage.clear()
sessionStorage.clear()
document.cookie // очищуємо всі cookies через expires=1970

Логін на сайті

POST /rlogin з { username: id_api, userpass: password, doremember: true, requestType: 'login' }

Повертає ILoginData:

ПолеЩо це
idid анкети на сайті
loginTokenChatтокен для WebSocket (param5)
isOnlineпоточний статус онлайн
urlURL аватарки
mainPhotoDTOметадані фото

Перевірка PUBLIC_KEY

getViews(PUBLIC_KEY) → GWT RPC запит getCometData. Якщо відповідь некоректна — надсилає tab:need-refresh-public-key в main-процес.


3. WebSocket підключення

initWebSocket({ param2, param5: loginTokenChat })

wss://goldenbride.net/Red5Chat/?param1={id_api}&param2=jfbvjebrfjhvbhbrehv&param3=0&param4=lufsfhwykdpyngp&param5={loginTokenChat}

Всі повідомлення сокету → sentToElectron({ type: 'tab:socket-message' }) → main-процес обробляє через SocketMessageParser.

Автоматичне перепідключення при close/error:

  • Затримки: 3с → 7с → 10с → 20с → 20с (5 спроб)
  • ALREADY_CONNECTED у повідомленні → примусово закриває і перепідключається

Проміс createChatTab резолвиться коли main-процес надсилає tab:socket-resolve після успішного connectFromServer.


Якщо вкладка не створилась

existsTab залишається false. Анкета працює в обмеженому режимі — без чату і сендерів. Логується помилка. Може бути ініціалізована повторно через handleNeedRefreshPublicKey.


4. Socket події анкети (SocketMessageParser)

src/main/socket/message-parser.ts

Всі повідомлення сокету вкладки обробляє SocketMessageParser в main-процесі.

ПодіяДія
connectFromServer / reconnectFromServersocketConnected = true
errorsocketConnected = false, показує помилку в UI
authErrorsocketConnected = false, надсилає SocketReject в табу
paidChatStartedtemporaryStop для RU + ActiveChat таск
paidChatStoppedОновлює ActiveChat таск
receivePrivateMessageПарсить повідомлення, створює таск (Like або UnansweredMessage)
WebRTC подіїoffer, answer, iceCandidate* — проксуються в табу
closeStreamСтрім закрито → оновлює UI
receiveVideoModeRU дивиться/не дивиться відео

receivePrivateMessage

  1. chatSender.addToTemporaryStop(manId_api) — зупиняє автоінвайти
  2. autoAnswer() — підтвердження серверу
  3. Якщо текст == 🌹TaskType.Like, інакше → TaskType.UnansweredMessage
  4. reactService.sendChatMessage() → UI

paidChatStarted

  1. chatSender.addToTemporaryStop(manId_api)
  2. TaskType.ActiveChat таск
  3. Синтетичне повідомлення CHAT_STARTED → UI