member
Объект содержит информацию с данными пользователя.
{
"member_id": 1,
"user_name": "Andrew",
"ref_code": "7KQ9XA",
"is_premium": 0,
"is_admin": 0,
"is_banned": 0,
"arena_initialized": 0,
"arena_onboarded": 1,
"character_name": "BraveKnight42",
"community": 0,
"inviter": {
"member_id": 2,
"user_name": "Alex"
},
"invites": 0,
"created": 1757544925,
"created_at": 1757544925,
"options": {
"level": 2,
"levelup": false,
"exp": 0,
"energy_regeneration": 1,
"energy_capacity": 50,
"energy_current_tier": 1,
"energy_tier_reset_at": 1758067200,
"energy_at": 0,
"time_shift": 0
},
"data": {
...
},
"gacha": {
"count": 1,
"cooldown": 300,
"spin": 1758498973,
"spin_at": 1758498973,
"spin_free": 1758498776,
"spin_free_at": 1758498776,
},
"slots": {
"available": 5,
"slot_1": 6,
"slot_2": 0,
"slot_3": 0,
"slot_4": 0,
"slot_5": 0
},
"wallet": [
{...currency},
{...currency},
{...currency}
],
"levels": [
{...level},
{...level},
{...level}
],
"skills": [
{...skill},
{...skill},
{...skill}
],
"activity": [
{...activity},
{...activity},
{...activity}
],
"triggers": [
{...trigger},
{...trigger},
{...trigger},
],
"feature_variants": [
{...feature_variant},
{...feature_variant},
{...feature_variant}
],
"bounty": [
{...bounty},
{...bounty},
{...bounty},
],
"quests": {...quests_state},
"achievements": {...achievements_state},
"unclaimedQuestsCount": 1,
"unclaimedAchievementsCount": 2,
"dailyChestProgress": {...daily_chest_progress}
}
| Поле | Тип | Описание |
|---|---|---|
| member_id | int | Идентификатор пользователя |
| user_name | string | Отображаемое имя пользователя |
| ref_code | string | Содержит реферальный идентификатор пользователя (всегда одной длины) |
| is_premium | int | Есть ли у пользователя Telegram Premium |
| is_admin | int | Является ли пользователь администратором, вычисляется по списку тестеров (Telegram ID или mid_<member id>); на non-production также true для mobile-пользователей |
| is_banned | int | Заблокирован ли пользователь |
| arena_initialized | int | Инициализирована ли арена (/arena/init). Подсказка, чтобы клиент не выяснял первый заход ошибкой — разбор ниже |
| arena_onboarded | int | Прошёл ли игрок онбординг арены (победа над Цукером). Та же подсказка: бой до онбординга отбивается кодом 10061 |
| character_name | string | Имя персонажа, выбранное на арене. Только после онбординга; до него поля нет — разбор ниже |
| community | int | Вступил ли пользователь в сообщество |
| inviter | object/null | Объект с информацией о пользователе, который пригласил текущего игрока |
| inviter.member_id | int | Идентификатор пригласившего пользователя |
| inviter.user_name | string | Отображаемое имя пригласившего пользователя |
| invites | int | Количество приглашенных пользователей |
| created | int | Время регистрации пользователя в timestamp |
| created_at | int | Время регистрации пользователя в timestamp |
| options | object | Объект с дополнительной информацией пользователя |
| options.level | int | Текущий уровень персонажа пользователя |
| options.levelup | bool | Можно ли увеличить уровень игрока и получить за это награду |
| options.exp | int | Текущее количество опыта игрока |
| options.energy_regeneration | int | Количество восстанавливаемой энергии |
| options.energy_capacity | int | Максимальное количество накапливаемой энергии |
| options.energy_current_tier | int | Текущий шаг стоимости покупки энергии |
| options.energy_tier_reset_at | int | Время следующего сброса шага стоимости покупки энергии в timestamp |
| options.energy_at | int | Время последнего начисления энергии игрока |
| data | object | Объект с дополнительными полями (подробнее) |
| gacha | object | Объект с данными гача-автомата пользователя |
| gacha.count | int | Количество вращений автомата пользователем |
| gacha.cooldown | int | Таймаут бесплатного вращения автомата |
| gacha.spin | int | Время последнего вращения автомата за токены в timestamp |
| gacha.spin_at | int | Время последнего вращения автомата за токены в timestamp |
| gacha.spin_free | int | Время последнего бесплатного вращения автомата в timestamp |
| gacha.spin_free_at | int | Время последнего бесплатного вращения автомата в timestamp |
| gacha.items.{gacha_id}.event_id | string | Идентификатор текущего запуска ивентовой гачи (lifetime.schedule[].id). Отсутствует у гач без расписания |
| gacha.items.{gacha_id}.progress | object | Прогресс сундуков гачи. Отсутствует у гач без chestProgress |
| gacha.items.{gacha_id}.progress.current | int | Очки прогресса в текущем запуске. Каждая успешная крутка добавляет pointsPerSpin из конфига |
| gacha.items.{gacha_id}.progress.max | int | Длина шкалы в очках (chestProgress.maxPoints) |
| gacha.items.{gacha_id}.progress.chests | array | Сундуки в порядке возрастания порога |
| gacha.items.{gacha_id}.progress.chests[].id | string | Идентификатор сундука внутри гачи |
| gacha.items.{gacha_id}.progress.chests[].required_points | int | Порог очков, с которого сундук доступен |
| gacha.items.{gacha_id}.progress.chests[].state | string | locked - порог не достигнут, available - можно забрать, claimed - награда выдана |
| gacha.items.{gacha_id}.progress.chests[].reward | string | Идентификатор набора наград из таблицы rewards, по которому клиент строит предпросмотр |
| slots | object | Объект со слотами умений |
| slots.available | int | Количество доступных для активации слотов |
| slots.slot_n | int | Идентификатор умения (0 - не используется) |
| wallet | array | Список с объектами валют пользователя |
| levels | array | Список с объектами уровней пользователя |
| skills | array | Список с объектами умений пользователя |
| activity | array | Список с объектами активностей пользователя |
| triggers | array | Список с объектами триггеров пользователя |
| feature_variants | array | Список вариантов фич пользователя |
| bounty | array | Список с объектами наград пользователя |
| quests | object | Состояние ежедневных заданий пользователя |
| achievements | object | Состояние достижений пользователя |
| unclaimedQuestsCount | int | Количество ежедневных заданий с доступной наградой |
| unclaimedAchievementsCount | int | Количество достижений с доступной наградой |
| dailyChestProgress | object | Короткое состояние daily chest progress |
arena_initialized — подсказка, а не истина
Поле отвечает на один вопрос: звать клиенту /arena/init или сразу /arena/info. До него клиент
выяснял это ошибкой — звал /arena/info, получал законный по контракту отказ ArenaNotInitialized
(10060) и только потом инициализировал арену. Отказ правильный, но в критический канал алертов
уходит любая ошибка API, то есть каждый новый игрок арены поднимал критическое сообщение. Порядок
вызовов на первом заходе стал init → info, число запросов не изменилось.
Это подсказка, и обрабатывать 10060 всё равно нужно. Значение устаревает — игрок сменил
аккаунт, администратор сбросил арену игрока кнопкой в админке, — а сервер старше поля его вообще не
присылает. Поэтому договор такой: выключает только явный ноль, всё остальное (единица,
отсутствие поля) означает «пробуй /arena/info», а 10060 остаётся страховкой. Сервер отказывать не
перестал и не перестанет: явный /arena/init существует затем, чтобы игрок не становился валидным
противником, ничего не выбрав.
Поле приезжает и в ответе /auth/* — там рендерится тот же объект пользователя, — поэтому
отдельный запрос ради него не нужен.
arena_onboarded — прошёл ли игрок онбординг арены
0 — игрок зарегистрирован на арене (или ещё нет), но Цукера в арене не победил: все экраны арены
работают, а участия в боях нет — сам не атакует, его не атакуют, наград не получает. Бой, ре-бой,
обновление целей и клейм наград до онбординга сервер отбивает кодом 10061 (ArenaNotOnboarded), и
поле существует, чтобы клиент не узнавал об этом ошибкой — тот же приём, что у arena_initialized.
Онбординг завершается методом /arena/onboarding/complete.
Договор тот же: подсказка, а не истина. Сервер старше поля его не присылает — отсутствие поля
значит «онбординга на сервере нет, игрок — участник»; 10061 остаётся страховкой. Внутри арены то же
значение приходит блоком onboarding в /arena/info.
character_name — имя персонажа
Имя, которое игрок выбрал на арене, — имя его персонажа везде: на базе, в профиле, в боях и
диалогах, а не только на аренных экранах. Поле приходит, только когда игрок прошёл онбординг арены
(arena_onboarded = 1), и равно arena.name из /arena/info. До онбординга
поля нет: на арене у игрока случайное имя, которое видит только он сам, а вне арены клиент показывает
имя героя, выбранное из списка, как раньше. Сервер старше поля его тоже не присылает — правило
клиента одно: character_name, если оно есть, иначе выбранное из списка имя.
Имя меняется методом /arena/customization/set (правила имени,
уникальность, отказы — там же). Это текст игрока, а не ключ локализации: его нельзя пропускать через
перевод. Поле, как и соседние подсказки, приезжает и в ответе /auth/*.