Предметы роста¶
Кабинет зрителя: /play/growth или /play/growth/{channel_id}. Вход — существующая авторизация Twitch. Можно переключаться между каналами, где зритель уже проверял рост: инвентарь, серия, бонусы и история у каждого стримера независимы. Последний канал запоминается.
Включение и правила¶
Владелец открывает вкладку «Предметы и журнал» в «Настройках роста» (/channels/{channel_id}/growth-settings?tab=items). Старый адрес /channels/{channel_id}/growth-items перенаправляет на эту вкладку. По умолчанию механика выключена. Он выбирает разрешённые предметы, лимиты, интервал наград после 14 дней серии и режим сообщений. Изменения применяются кнопкой «Сохранить»; переключение вкладок сохраняет черновик до ухода со страницы. Панель и полный журнал доступны только владельцу. Журнал загружается независимо от формы и обновляется кнопкой «Обновить».
- По умолчанию рука вмещает три предмета; владелец может выбрать от 1 до 5. Снижение лимита не удаляет имеющиеся карты.
- Карта выпадает за дневную проверку при серии 3, 7, 14, затем 19, 24 и далее с шагом 5 по умолчанию. Шаг после 14 дней настраивается от 2 до 30.
- Повторное достижение награждённой отметки после сброса только серии не награждается.
- При полной руке награда пропускается и фиксируется в журнале. Освобождение места позднее её не возвращает.
- По умолчанию одно активное применение за стрим; настраивается от 1 до 3. Атака, отражённая щитом, тоже тратит карту и ход.
- По умолчанию на игрока допускается одна атака за стрим, включая отражённую; владелец может выбрать от 1 до 3.
- Автор и цель должны написать обычный !рост в текущем эфире. Повтор в тот же день отмечает участие, но не выдаёт второй дневной рост или карту.
- Офлайн, включая окно повторных offline-проверок, применять карты нельзя.
- Карты не сбрасывают серию, не создают таймаутов Twitch и не затрагивают другой канал.
- Сброс роста начинает сезон: предметы, удобрение и отметки наград очищаются, журнал сохраняется. Сброс только серии оставляет инвентарь, усиление и использованные отметки наград.
| Предмет | Эффект |
|---|---|
| Удобрение | +4 см к следующей проверке после множителей. Два ожидающих удобрения не складываются |
| Карманник | Переводит от цели автору до 3 см, не больше 5% роста цели с округлением вниз |
| Секатор | Срезает до 5 см, не больше 5% роста цели с округлением вниз |
| Щит | Автоматически блокирует атаку, пока находится в руке и разрешён стримером |
При росте меньше 20 см атака не отнимает сантиметры и карту. Отключённые предметы остаются в руке, но не применяются и не выпадают. Отключённый щит не срабатывает.
Чат без лишних сообщений¶
- !рост предметы — рука одной строкой и ссылка в кабинет.
- !рост история — пять последних входящих действий, включая отказы и защиту.
- !рост помощь — короткая подсказка.
- !рост удобрение — усиление на себя.
- !рост кража @ник / !рост секатор @ник — атака.
- !рост щит — напоминание об автоматической защите.
Просмотры и подсказки об отклонённых действиях имеют общий кулдаун 30 секунд на игрока и канал. Повторы не вызывают предупреждений. Дополнительно ограничено число попыток применения: шесть за минуту.
Выпадение добавляется к ответу !рост. Успешное применение не создаёт немедленного второго ответа: worker twitch-chat-execution раз в 10 секунд забирает события из общего журнала. Розыгрыш и защита попадают в один итог. Режимы владельца:
- compact: короткие итоги одной сводкой; слишком длинная сводка заменяется количеством розыгрышей;
- summary: только количество розыгрышей;
- off: автоматических объявлений нет, результат доступен в кабинете и истории.
Это одинаково для сайта и чата. Подтверждение в кабинете и история сохраняются независимо от сообщений. Объявления — best effort: после остановки эфира, смены сезона или задержки больше минуты старые сообщения не публикуются. После захвата события аварийная остановка worker-а может пропустить чатовый итог, но не откатить и не повторить эффект карты.
Кабинет¶
Зритель видит рост, серию, удобрение, карточки и входящую/исходящую историю с пагинацией. Для атаки вводится Twitch-ник; перед списанием есть подтверждение с названием карты и целью. Повтор сетевого запроса сохраняет ключ операции. Автор определяется серверной сессией, а не полями запроса. На главной странице есть кнопка «Мой рост и предметы».
Полный журнал содержит награды, пропуски из-за полной руки, применения, защиту, отклонённые попытки, дневные изменения роста и смены сезонов с момента включения механики. Сохраняются имена на момент события, результат, изменения сантиметров, время и источник. Тексты сообщений чата и токены не записываются.
API и исполнение¶
Public API, обязательная сессия с подключённым Twitch:
- GET /api/v1/growth/player/channels;
- GET /api/v1/growth/player/{channel_id};
- GET /api/v1/growth/player/{channel_id}/leaderboard;
- GET /api/v1/growth/player/{channel_id}/events?filter=incoming|outgoing|all&before={id} — 30 записей;
- POST /api/v1/growth/player/{channel_id}/use — kind, target_login, request_key (16–100 символов).
OwnAdmin API, только владелец:
- GET/PUT /api/v1/channels/{channel_id}/growth-items — enabled, allowed_items, announcement_mode, hand_limit, uses_per_stream, attacks_per_target, reward_every;
- GET /api/v1/channels/{channel_id}/growth-items/events?before={id} — 50 записей.
Логика — internal/growthitems, запросы — src/pg/growth_items.sql. Транзакция и блокировка канала защищают проверки роста, применение, лимиты и смену сезона. Повтор ключа операции не списывает карту дважды. Собственная история ограничена авторизованным игроком; user_id от клиента не используется.
Новых OAuth scopes нет. Используется существующий вход Twitch и чатовая возможность chat_interactions с прежним channel:bot; сообщение отправляет бот через существующий dispatcher. Каталог прав не меняется.