Skip to content

Константы ответов (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). У остальных ключа нет.

ПолеЗначениеСмысл
statuslockedв клановых войнах не участвует
reasonleft_clanушёл из клана (сам, исключением, роспуском) во время войны — до открытия следующего цикла войн (until — крайний срок)
reasonbannedклановые войны аккаунту закрыл оператор
untilRFC3339 | 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).