daily_reward_calendar
Объект состояния календаря наград за вход, возвращается в calendars[] методом /rewards/daily/status и в calendar методом /rewards/daily/claim.
{
"calendar_id": "daily_rewards_2026_08",
"calendar_type": "standard",
"month": "august",
"cycle_number": 1,
"days": [
{
"day": 1,
"reward": { "type_id": "soft", "amount": 1000 },
"claimed": false,
"claimable": true,
"isSpecial": false,
"rewardState": "claimable"
}
],
"current_day": 1,
"available_day": 1,
"claimed_days": [],
"can_claim": true,
"is_visible": true,
"locked_reason": null,
"server_time": 1780000000,
"next_reset_at": 1780012800,
"next_month_at": 1782000000,
"starts_at": 1780000000,
"ends_at": 1782000000,
"reset_at": 1780012800,
"next_reward_at": 1780012800,
"days_count": 30,
"claimed_total": 0,
"last_claimed_at": 0,
"day_key": 20260801
}
Авто-копирование standard-календаря: если для текущего момента не сконфигурирован ни один активный standard-календарь (например, ГД забыли занести следующий месяц), сервер автоматически копирует конфиг последнего закончившегося standard-календаря в новый calendar_id, привязанный к текущему месяцу, — до тех пор, пока ГД не занесёт настоящий календарь на этот месяц. event-календари в этом не участвуют — они просто заканчиваются. Прогресс у игроков начинается заново (личный День 1) на новом calendar_id, как при любой смене месяца.
| Поле | Тип | Описание |
|---|---|---|
| calendar_id | string | Идентификатор календаря из конфига |
| calendar_type | string | standard или event |
| month | string | Название месяца в нижнем регистре (august), выводится из starts_at. Никогда не пусто. |
| cycle_number | int | Номер цикла прогресса. Увеличивается при клейме последнего дня конфига. |
| days | array | Сетка дней, см. ниже |
| current_day | int | Текущий день прогресса, кламп на days_count (effectiveDay) |
| available_day | int | День, который можно забрать прямо сейчас; 0, если нечего забирать |
| claimed_days | int[] | Дни, забранные в рамках текущего цикла |
| can_claim | bool | Инвариант: can_claim === (locked_reason === null) |
| is_visible | bool | Календарь сейчас в своём окне [starts_at, ends_at) и включён (для auto-скопированного календаря это всегда так — у него своё собственное окно на текущий месяц) |
| locked_reason | string|null | null (доступно) | claimed_today | not_started | ended | inactive |
| server_time | int | Текущее игровое время сервера (с учётом time_shift) |
| next_reset_at | int | Следующая граница сброса фичи (FeatureDay::nextResetAt) |
| next_month_at | int | Момент, когда календарь закончится/сменится. Никогда не 0. |
| starts_at / ends_at | int | Границы окна активности календаря, полуоткрытый интервал |
| reset_at | int | Алиас next_reset_at |
| next_reward_at | int | next_reset_at, если календарь активен; 0, если неактивен |
| days_count | int | Длина конфига (количество дней) |
| claimed_total | int | Пожизненное количество забранных дней по этому календарю |
| last_claimed_at | int | Метка времени последнего клейма, 0 если не было |
| day_key | int | Серверный дневной ключ ответа (YYYYMMDD), для поддержки |
days[i]
| Поле | Тип | Описание |
|---|---|---|
| day | int | Номер дня, 1..days_count |
| reward | object | { type_id, amount } |
| claimed | bool | Забран в рамках текущего цикла |
| claimable | bool | Можно забрать прямо сейчас |
| isSpecial | bool | Флаг ценной награды |
| rewardState | string | claimed | claimable | locked |