RU-онлайн сервіс
Тримає окремий online-пул для кожної TU та за інтервалом оновлює його:
- Golden — робить один запит і отримує готовий масив online RU id;
- Chathouse / Prime — послідовно витягує cursor-сторінки онлайн-діалогів і збирає RU id з усіх сторінок.
Після повного проходу конкретної TU замінює тільки її Set<ruId>. Пули різних TU не об’єднуються.
Дані / стан
Найважливіше, що тримаємо
- Онлайн RU по TU —
Map<project + tuId, Set<ruId>>
Усі логіки перевіряють онлайн у контексті конкретної TU: isOnline(project, tuId, ruId).
Запити на одну TU
| Проєкт | Запит | Інтервал | Запитів за 60 с |
|---|---|---|---|
| Golden | POST https://goldenbride.net/goldenbride/services/chat/v26 | 15 с | 4 |
| Chathouse | GET https://external-api.chatshouse.com/v1/tru/dialogs | 60 с | N |
| Prime | POST https://talkytimes.com/platform/chat/dialogs/by-criteria | 60 с | 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 не визначає нашого фаворита.
Спільна розвилка:
- Block — діалог не потрапляє ні у Follow-up, ні в сендер.
- Favorite з
isWhite— кандидат у сендер, якщо немаєsenderIgnore. - 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, затримки, історію та інвайти.
Зв’язки
- Віддає online-пул логікам конкретної TU.
- Передає знайдені inline-профілі в сервіс профілів RU.
- Онлайн TU — окремий Сервіс онлайну TU.