Сендер
SenderService приймає готового кандидата, вибирає інвайт і виконує автоматичну chat/mail-відправку. Сам online/new/all діалоги не скролить.
Джерела кандидатів
- Chathouse/Prime chat і mail — online-фаворити з
isWhite, отримані із завершеного RU-online проходу; Prime за потреби точково отримує актуальний mail limit; - Golden chat/mail — окремі
FAV- іNEW-кандидати з поточного online-пулу без скролу діалогів.
SenderService приймає кандидата Chathouse/Prime лише з isWhite. Block або globalFavorite.senderIgnore відхиляє кандидата.
Сайтова ознака saved/bookmarked не визначає нашого фаворита. Вона може використовуватися лише як додаткове партнерське поле.
Дані
SenderCandidate {
project
tuId
ruId
online
lastMessage
chatLimit
mailLimit
}
SenderHistory {
tuId
ruId
channel
inviteId
externalMessageId
sentAt
}inFlight: Set<TU+RU>— локальний захист;SenderHistory— затримки й порядок інвайтів;- атомарний server claim
TU+RU+channel— захист, коли одна TU відкрита у двох Electron.
Claim має короткий TTL і завершується результатом success/failure. Без успішного claim партнерський send не викликається.
Спільна відправка Chathouse/Prime
- Взяти lock
TU+RU. - Повторно перевірити TU/session, online, blocks,
senderIgnore, favorite/white-list. - Повторно перевірити актуальні limits зі snapshot; застарілий snapshot не використовувати.
- Перевірити затримку
TU+RU+channelу SenderHistory. - Отримати перший невикористаний активний інвайт.
- Якщо доступні chat limit, chat delay та chat invite — відправити chat.
- Інакше, якщо доступні mail limit, mail delay та mail invite — відправити mail.
- Після підтвердженого успіху:
- записати SenderHistory та останній контакт;
- збільшити лічильник інвайта й автоматичну дію оператора;
- передати результат у DataSync;
- завершити claim як success.
- Після помилки завершити claim як failure; інвайт і його порядок не змінювати.
Mail не є fallback після невдалої chat-відправки. Він розглядається лише до send, коли chat зараз недоступний.
Поточна логіка Chathouse/Prime · as-is
TODO
Цільовий алгоритм роботи сендера з інвайтами ще не спроєктований. Нижче зафіксована поточна логіка; вибір і порядок інвайтів, затримки, додаткові повідомлення та умови скасування будуть перероблені.
| Параметр | Chathouse | Prime |
|---|---|---|
| Chat delay | 1 год | 2 год |
| Mail delay | 6 год | 12 год |
| Chat додаткові повідомлення | до 2 | — |
| Один RU з різних TU | до 5 TU/хв | окремого cap немає |
| Low-credit mail | spend 0–20; без фото | — |
| Звичайний Chathouse mail | spend 20+; фото дозволено | — |
| Chat-текст | тільки латиниця | окремого правила немає |
| Mail media | фото | до 10 фото + до 10 відео |
Додаткові повідомлення Chathouse · as-is
Після основного chat можуть бути до двох відкладених повідомлень.
Перед кожним:
- Отримати останні повідомлення діалогу.
- Переконатися, що попереднє sender-повідомлення досі останнє.
- Перевірити відповідний text/sticker/photo limit.
- Для photo повторно перевірити spend
20+. - Відправити й окремо записати успішний результат.
Отже кожне дослання додає до 1 history + 1 send партнерського запиту.
Цільовий ланцюжок ще треба спроєктувати: точний порядок і затримки, скасування після reply/manual send/block/offline, поведінка після reconnect/restart і збереження незавершеного стану.
Golden chat
Golden не отримує готовий dialog snapshot. Кандидати беруться з online-пулу:
- white-list favorite з наступним невикористаним FAV-інвайтом;
- новий white-list favorite;
- повтор FAV-інвайта після
3 год; - online RU з окремого Golden
NEW-пулу та наступним NEW-інвайтом; - новий online RU у
NEW-пулі; - повтор NEW-інвайта після
3 год.
Для кожного кандидата повторно перевіряються block, контактні дані, тимчасовий stop і senderIgnore.
Chat queue
На одну TU:
- між send-командами не менше
5.5 с; - одночасно одна sender-відправка;
- ручна відправка має пріоритет і може зарезервувати наступний слот;
- socket
confirmFromClientпідтверджує успіх одразу; - після
confirmFromServerочікується ще1 с; limit,limitSecond,offlineUserзавершують спробу помилкою;- без відповіді за
10 сспроба вважається невдалою.
Лише після такого підтвердження оновлюється SenderHistory. П’ять послідовних невідомих помилок у поточному Electron зупиняють TU runner; у новій програмі це має стати явним degraded-станом сендера, а не тихою зупинкою.
Golden mail
Golden mail sender працює partner batch-процедурою:
- Перевірити
FAV/NAF-кандидатів; якщо кандидатів немає —NEW/FANM-кандидатів. - Відфільтрувати blocks, sender-ignore, контакти, sender black-list та історію.
- Взяти до
10RU. - Запустити
command='send'. - Раз на
6 считатиcommand='status', доки не будеendабоlimit. - Записати success окремо для кожного RU.
Поточні цикли інвайтів:
- FAV/NAF — один раз на день;
- NEW/FANM — один раз на
7 днів.
UNREAD запускає точкове відкриття mail history; Duplicated пропускає RU. Технічний exception зараз додає RU у sender black-list. У цільовій логіці постійний block ставиться лише за підтвердженою відповіддю API; невідома помилка має retry/backoff і не змінює BlockService.
Фіксація відповіді RU
Після успішної відправки Sender зберігає inviteId, partner externalMessageId і час. Коли socket або прохід діалогу приносить вхідне повідомлення:
- Знайти sender-відправку за
externalMessageIdу впорядкованій історії діалогу. - Переконатися, що наступне повідомлення надійшло від RU, а між ними немає іншого повідомлення TU.
- Передати факт відповіді через DataSync у SenderAnalyticsService.
Electron лише знаходить зв’язок відправлення з відповіддю. Сервер idempotent-зберігає результат і будує аналітику.
Помилки
| Результат | Дія |
|---|---|
timeout / network / 5xx | не рухати інвайт; звільнити claim; retry з backoff |
| rate limit | зупинити канал TU до retryAt |
| RU offline | оновити online точково; без retry у цьому проході |
| confirmed blocked | BlockService.update і закриття тасків пари |
| invalid invite/media | позначити помилку конфігурації TU; інших RU не блокувати |
| success | історія, контакт, дія оператора, DataSync |
Запити
Скрол-запитів SenderService не додає.
- основний chat/mail success — один chat або mail send;
- Chathouse додатково: до
2 × (history + send); - Golden mail batch:
1 send + N_status; - API-перевірки кандидата належать сервісу, який сформував snapshot.
Зв’язки
- Читає: Invites, FavoriteService, BlockService, RUOnlineService, SenderHistory.
- Отримує кандидатів: RU Online, RU All Dialogs і Golden runtime-state.
- Віддає результат: останній контакт, дії оператора, DataSync та UI-стан сендера.