Константы ответов (V2)
Здесь собраны значения, по которым клиент ветвится: коды системных событий чата и строковые enum'ы, которые сервер кладёт в поля ответов. Источник правды — константы в domain/models/; таблицы ниже описывают тот же набор, но в одном месте, чтобы не вычитывать его из описаний отдельных полей.
Общее правило: неизвестное значение — не ошибка. Сервер может начать присылать новый код события или новый статус раньше, чем выйдет клиент, который его понимает. Клиент обязан такое значение проигнорировать (или показать нейтральную заглушку), а не падать и не прятать всю ленту.
Коды событий чата (event_code)
Приходят в сообщениях clans/chat/since и clans/chat/history у строк с kind = 1 (системные). У обычных сообщений игроков (kind = 0) поля event_code нет.
Диапазоны закреплены за источником события, чтобы модули не сталкивались:
| Диапазон | Кто выдаёт | Смысл |
|---|---|---|
| 1–99 | базовый модуль кланов | жизненный цикл состава |
| 100–199 | игровой модуль (война) | события войны |
| 900+ | ядро чата | служебные сигналы, не строки ленты |
1–99 — база клана
| Код | Событие | event_meta |
|---|---|---|
| 1 | Игрок вступил в клан | {name} |
| 2 | Игрок вышел из клана | {name} |
| 3 | Игрока исключили | {name, by} — by это тот, кто исключил |
| 4 | Смена роли | {name, role, by} — role это новая роль (см. «Роли») |
| 5 | Передача лидерства | {name, by} — name новый лидер, by прежний |
100–199 — война
| Код | Событие | event_meta |
|---|---|---|
| 100 | Война началась | {opponent} — название клана-противника |
| 101 | Война завершена | {opponent, outcome}, outcome: win | lose | tie (со стороны клана-получателя) |
| 102 | Началась новая фаза | {phase_index, type} — type см. «Типы фаз войны» |
| 103 | Победа в атаке | {player_name, player_avatar, opponent_name, opponent_avatar, attack_id} |
103 по умолчанию выключен. В боевой фазе он даёт по строке на каждую выигранную атаку и топит ленту, поэтому он за флагом domain.clan_war.chat_attack_win_event. Пока флаг false, сервер этот тип события не шлёт вообще. attack_id можно передать в clans/war/attack/get и получить снапшоты, сид и исход боя для превью.
900+ — служебные сигналы ядра чата
| Код | Событие | event_meta |
|---|---|---|
| 900 | Сообщение удалено модератором | {message_id, seq} |
900 — не строка ленты, а команда. Он существует для тех клиентов, чей курсор прочтения уже ушёл дальше удалённого сообщения: обычный перезапрос окна им ничего не покажет, потому что они это окно уже прошли. Получив 900, клиент гасит у себя сообщение по message_id/seq. Рисовать его в чате как текст не нужно — и вообще любой код из диапазона 900+ клиент должен уметь не показывать.
Событие шлётся и при удалении из игры (co-leader+), и при удалении оператором из ACP, включая разбор жалобы с удалением. Само сообщение остаётся в истории тумбстоуном: deleted: true и пустое тело.
Enum'ы кланов
Роли (role)
| Значение | Смысл |
|---|---|
member | участник |
elder | старейшина |
coleader | заместитель |
leader | лидер |
Порядок — по возрастанию прав. Модерация чата доступна с coleader, и действовать можно только против строго младшей роли: равного или старшего замьютить/размьютить нельзя.
Политика приёма (join_policy)
| Значение | Смысл |
|---|---|
open | вступление сразу |
approval | по заявке |
invite_only | только по приглашению |
Статус модерации имени и тега (name_status, tag_status)
| Значение | Смысл |
|---|---|
ok | проверку прошло |
pending | на проверке |
flagged | помечено модератором |
auto_rejected | отклонено автофильтром |
Статус заявки на вступление (status)
| Значение | Смысл |
|---|---|
pending | ждёт решения |
accepted | принята |
rejected | отклонена |
cancelled | отозвана заявителем |
Идентификация игрока
У аккаунта два идентификатора, и путать их дорого:
| Поле | Меняется? | Для чего |
|---|---|---|
public_id | никогда | найти себя в ростере, сопоставить участника между ответами |
api_type + api_uid | да | показать, под каким логином игрок сейчас |
Пара — это зеркало текущего отображаемого логина, и она съезжает при привязке сильного логина (Google/FB/Apple вытесняет гостевой), при отвязке и при «забыть логин». Членство в клане при этом не теряется: оно принадлежит аккаунту, один клан на аккаунт. Сравнение по паре после любого из этих событий перестаёт находить игрока — сравнивать надо по public_id.
Разделение по платформе (временное)
Включается флагом domain.clans.split_mobile. Игроки делятся на две стороны, и каждая видит, вступает и воюет только со своей:
| Сторона | Кто |
|---|---|
| мобильная | у аккаунта есть хотя бы один логин с api_type 10–19 (мобильные сторы) |
| остальные | все прочие, включая гостевые логины |
Сторона считается по аккаунту, а не по текущему логину: мобильный игрок, привязавший Google или Facebook, остаётся на мобильной стороне. Сторона клана — сторона аккаунта его лидера; клан без записанного аккаунта лидера классифицируется по его записанному логину.
Гостевой вход с телефона (api_type 9xx) — это «остальные», пока игрок не привяжет логин стора.
Вид сообщения чата (kind)
| Значение | Смысл |
|---|---|
0 | текст игрока — есть sender и body |
1 | системное — есть event_code и event_meta |
Статус жалобы на сообщение (status)
| Значение | Смысл |
|---|---|
0 | ждёт руководство клана (co-leader+) |
1 | эскалирована модератору (ACP) |
2 | модератор разобрал |
3 | закрыта без действий |
Enum'ы войны
Статус войны (status)
| Значение | Смысл |
|---|---|
active | идёт |
finished | закончена |
Типы фаз (type)
| Значение | Смысл |
|---|---|
points | набор очков — очки шлются через war/points/report |
battle | бои — атаки через war/attack/start и war/attack/result |
results | подведение итогов — исход уже определён, награды начислены |
squad5x5 | финал 5×5 |
Статус фазы (status)
| Значение | Смысл |
|---|---|
pending | ещё не началась |
active | идёт |
finished | закончена |
Статус бойца в боевом ростере (status)
| Значение | Смысл |
|---|---|
free | можно атаковать |
active | уже забронирован атакой — в by лежит атакующий и attack_id |
beaten | уже побеждён в этой фазе — в by лежит победитель и attack_id |
Статус атаки (status)
| Значение | Смысл |
|---|---|
pending | забронирована, исход не отправлен |
finish | исход зафиксирован |
expired | бронь протухла по таймауту |
Отстранение от войн (my_participation)
Приходит в clans/war/current только участнику клана, отстранённому от клановых войн, — вместо войны (war и my_contribution при этом null). У остальных ключа нет.
| Поле | Значение | Смысл |
|---|---|---|
status | locked | в клановых войнах не участвует |
reason | left_clan | ушёл из клана (сам, исключением, роспуском) во время войны — до открытия следующего цикла войн (until — крайний срок) |
reason | banned | клановые войны аккаунту закрыл оператор |
until | RFC3339 | null | когда отстранение кончится; null — бессрочно |
Награды за войну
Начисление приходит двумя письмами — за итог войны и за личный вклад, — чтобы клиент мог назвать их по-разному. Различать их нужно по description.code:
description.code | Что внутри |
|---|---|
clan_war_result | общая награда за победу/поражение (пер-тир) |
clan_war_contribution | стадии индивидуальной лестницы по личным очкам |
У обоих в description.params лежат {outcome, opponent_clan_name}, где outcome — те же win | lose | tie, что у события 101. Если игрок не взял ни одной стадии лестницы, второго письма не будет вовсе. Первого письма нет у того, кто набрал за войну меньше min_points_for_reward (см. clans/war/config).
