ru-online

RU-онлайн сервіс

Тримає окремий online-пул для кожної TU та за інтервалом оновлює його:

  • Golden — робить один запит і отримує готовий масив online RU id;
  • Chathouse / Prime — послідовно витягує cursor-сторінки онлайн-діалогів і збирає RU id з усіх сторінок.

Після повного проходу конкретної TU замінює тільки її Set<ruId>. Пули різних TU не об’єднуються.

Дані / стан

Найважливіше, що тримаємо

  • Онлайн RU по TUMap<project + tuId, Set<ruId>>

Усі логіки перевіряють онлайн у контексті конкретної TU: isOnline(project, tuId, ruId).

Запити на одну TU

ПроєктЗапитІнтервалЗапитів за 60 с
GoldenPOST https://goldenbride.net/goldenbride/services/chat/v2615 с4
ChathouseGET https://external-api.chatshouse.com/v1/tru/dialogs60 сN
PrimePOST https://talkytimes.com/platform/chat/dialogs/by-criteria60 сN

N — кількість cursor-сторінок онлайн-діалогів конкретної TU.

Golden

Актуальний запит

POST https://goldenbride.net/goldenbride/services/chat/v26
Content-Type: application/x-www-form-urlencoded
{
  mode: 'update_v2',
  isPublishStream: boolean
}
{
  auth: boolean,
  camStatus: boolean,
  online: number[],
  hasStream: number[],
  mobile: number[]
}
  • online → online-пул RU;
  • camStatus і hasStream → Golden stream-логіка;
  • викликається кожні 15 с для кожної TU: 4 × L запитів/хв.

Другий наявний запит

POST https://goldenbride.net/usermodule/services/agencyhelper/v2
Cookie: JSESSIONID=<TU session>
{ command: 'online' }
{
  success: boolean,
  result: number[]
}

Метод реалізований як officialApiService.online, але в актуальному stack-electron не викликається. Цільово використовуємо chat/v26, бо він одним запитом дає онлайн і stream-дані.

Chathouse

Окремого API списку онлайн-RU немає. Пул збираємо з онлайн-діалогів.

GET https://external-api.chatshouse.com/v1/tru/dialogs
Authorization: Bearer <TU token>
{
  tab: 'all',
  is_online: true
}

Наступні сторінки запитуються за URL із response.next.

{
  data: Array<{
    id: number,
    last_message_body: string,
    last_message_sent_at: string,
    last_message_format: number,
    last_message_type: number,
    is_last_message_incoming: boolean,
    is_saved: boolean,
    is_favourite: boolean,
    blocked_by_ru: boolean,
    contact: {
      ulid_id: string,
      name: string,
      lastname: string,
      age: number,
      main_photo: object | null,
      country: object,
      credits: { spend: number | string },
      is_active: boolean,
      last_active_at: string,
      is_online: boolean
    }
  }>,
  next: string,
  limits: {
    [ruId: string]: {
      id: string,
      message_limit: number,
      mail_limit: number,
      sticker_limit: number,
      gift_private_limit: number,
      gift_social_limit: number
    }
  }
}
  • online id беремо з data[].contact.ulid_id;
  • профілі з data[].contact передаємо в сервіс профілів RU;
  • решта даних діалогу передається сервісам профілів, блокувань, останнього контакту, тасків і сендера;
  • прохід до next === '', сторінка близько 50 діалогів;
  • запити: L × P / хв, де P — кількість сторінок.

Prime

Повний пул також збираємо з онлайн-діалогів.

POST https://talkytimes.com/platform/chat/dialogs/by-criteria
Cookie: <TU session>
{
  cursor: '',
  limit: 40,
  criteria: ['active', 'online']
}
{
  cursor: string,
  dialogs: Array<{
    idUser: number,
    idInterlocutor: number,
    type: string,
    isBlocked: boolean,
    isActive: boolean,
    isBookmarked: boolean,
    hasNewMessage: boolean,
    lastMessage: {
      id: number | string,
      dateCreated: string,
      idUserFrom: number,
      idUserTo: number,
      type: string,
      content: object
    },
    dateUpdated: string,
    messagesLeft: number
  }>
}
  • online id беремо з dialogs[].idInterlocutor;
  • профілів RU відповідь не містить;
  • решта даних передається сервісам блокувань, останнього контакту, тасків і сендера;
  • сторінки по 40, далі response.cursor; кінець — сторінка коротша за 40;
  • запити: L × P / хв, де P — кількість сторінок.

Точкова перевірка Prime

POST https://talkytimes.com/platform/online
{ ids: number[] }
{ [ruId: string]: boolean }

Цей endpoint лише перевіряє вже відомі id і не може сам побудувати online-пул.

Нюанси

  • Online id збираємо із сирої відповіді до фільтрів лімітів, фаворитів і black-list.
  • Chathouse/Prime повертають online лише серед діалогів, доступних конкретній TU; це не глобальний список усіх RU сайту.
  • Додаткові дані Golden streams і Chathouse/Prime dialogs цей сервіс не обробляє — лише передає далі.
  • Incremental online/offline socket-події описані в обробці socket-подій. Вони уточнюють стан між повними проходами, але не замінюють повний online-пул.

Розподіл online-діалогів

Golden отримує тільки RU id. Його окрема логіка працює з online-пулом і сама дістає потрібні дані.

Chathouse / Prime після повного cursor-проходу передають далі всі отримані online-діалоги без бізнес-фільтрів. Сайтова ознака saved/bookmarked не визначає нашого фаворита.

Спільна розвилка:

  1. Block — діалог не потрапляє ні у Follow-up, ні в сендер.
  2. Favorite з isWhite — кандидат у сендер, якщо немає senderIgnore.
  3. Active favorite без isWhite — кандидат у Follow-up-логіку.

Для Follow-up-кандидата:

  • є chat limit — передати в Follow-up chat;
  • chat limit немає, але доступний mail limit і RU не freeloader — передати в Follow-up mail;
  • немає доступного каналу — нічого не робити.

Chathouse містить chat і mail limits у snapshot. Prime містить тільки chat limit; потрібність і доступність mail перевіряє Follow-up mail логіка через своє API.

Sender отримує власний пул кандидатів і сам застосовує свої limits, затримки, історію та інвайти.

Зв’язки