player/API_USAGE.md
МИН 8f0524cbb3 feat: порт 3D-стрелки-указателя в плеер (фича-парность) + dev JWT-панель
- game.fx.pointer + расширенный game.fx.beam: BeamManager (текстуры/curved/
  градиент/quest-marker), ScriptSandboxWorker (_normFxPoint от DataCloneError),
  GameRuntime (fx.createPointer/pointerTarget/pointerUpdate/beamUpdate/
  beamVisible), BabylonScene._activatePointers. 1-в-1 со студией.
- Dev JWT-панель на экране «Нужен JWT» (только localhost): кнопка → инпут →
  localStorage.player_jwt + reload.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 21:46:24 +03:00

105 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# API, которые использует плеер
Плеер — это **клиент**. Все данные он берёт с серверных API. Этот документ — полный список эндпоинтов которые он дёргает, зачем и от чего ломается если API изменится.
## Базовый URL
В prod: `https://api.rublox.pro` (alias на `minecraftia-school.ru/api-storys`)
В dev: `https://dev-api.rublox.pro` (staging, см. [reference-staging-env])
Локально: `http://localhost:8674` (storys-микросервис)
## Эндпоинты — список
### Игры и лента
| Method | Path | Когда зовётся | Сломается если... |
|---|---|---|---|
| GET | `/kubikon3d/feed?tab=hot\|new\|popular\|topweek` | при заходе на главную | поле `games[]` отсутствует |
| GET | `/kubikon3d/trending` | главная, секция трендов | возвращает не-массив |
| GET | `/kubikon3d/search?q=<query>` | поиск игр | поле `results[]` отсутствует |
| GET | `/kubikon3d/collections` | главная, секции «Хиты», «Новинки» | возвращает не-массив |
| GET | `/kubikon3d/projects/<id>` | при открытии конкретной игры | поле `project_data` отсутствует или поломан JSON-формат |
| GET | `/kubikon3d/my-projects` | страница «Мои игры» | в ответе нет `projects[]` |
| GET | `/kubikon3d/top-authors` | страница «Топ авторов» | возвращает не-массив |
| GET | `/kubikon3d/events` | главная, баннер мероприятий | возвращает не-массив |
### Игровой процесс (telemetry)
| Method | Path | Когда | Что шлёт |
|---|---|---|---|
| POST | `/kubikon3d/play/heartbeat` | каждые 30 сек пока игрок в игре | `{ game_id, play_time_ms }` |
| POST | `/kubikon3d/activity` | при входе/выходе из игры | `{ game_id, action: 'enter'\|'leave' }` |
| POST | `/kubikon3d/perf-log` | при детектировании просадки FPS <20 на 5+ сек | `{ game_id, fps, draw_calls, mem }` |
| POST | `/kubikon3d/bug-reports` | юзер жмёт «Сообщить о баге» | `{ game_id, description, screenshot_b64 }` |
| POST | `/kubikon3d/reports` | юзер репортит игру | `{ game_id, reason, comment }` |
### Скины и аватары (Рублокс-персонажи)
| Method | Path | Когда |
|---|---|---|
| GET | `/kubikon3d/rublox/equipped-skin/<user_id>` | при спавне аватара любого игрока |
| GET | `/kubikon3d/rublox/owned-skins` | страница «Мои скины» |
| POST | `/kubikon3d/rublox/equipped-skin` | юзер сменил скин |
| GET | `/api-storys/rublox/avatars/<user_id>` | список аватаров юзера |
| GET | `/api-storys/rublox/outfit/<user_id>` | детали одежды |
| GET | `/kubikon-assets/characters/skins_manifest.json` | при загрузке плеера, список всех доступных скинов |
### Эмоушены (R15 анимации)
| Method | Path | Когда |
|---|---|---|
| GET | `/api-storys/rublox/emotes/list` | при заходе в игру (для меню эмоушенов) |
| POST | `/api-storys/rublox/emotes/play/<emote_id>` | юзер выбрал эмоушен |
### Модели и ассеты
| Method | Path | Когда |
|---|---|---|
| GET | `/kubikon3d/models/public` | при загрузке игры список public GLB-моделей |
| GET | `/kubikon3d/models/mine` | в редакторе (плеер запускает превью своих моделей) |
| GET | `/kubikon3d/models/<id>` | при первом упоминании модели в проекте |
### Админка (только видна юзерам с ролью admin)
Все `/kubikon3d/admin/*` доступны только если в JWT юзер имеет роль `admin`. Иначе бэк возвращает 403.
| Method | Path | Что показывает |
|---|---|---|
| GET | `/kubikon3d/admin/dashboard` | сводка: онлайн, активные игры |
| GET | `/kubikon3d/admin/online` | список онлайн-юзеров |
| GET | `/kubikon3d/admin/all-games` | все игры с фильтрами |
| GET | `/kubikon3d/admin/moderation-queue` | очередь премодерации (для review-игр) |
| GET | `/kubikon3d/admin/reports` | репорты на игры |
| GET | `/kubikon3d/admin/bug-reports` | баг-репорты |
| GET | `/kubikon3d/admin/comments` | модерация комментариев |
| GET | `/kubikon3d/admin/chat/messages` | чат-сообщения |
| GET | `/kubikon3d/admin/chat/bans` | список банов в чате |
| GET | `/kubikon3d/admin/authors` | топ авторов с детальной статистикой |
### Multiplayer (Colyseus)
WebSocket-соединение, не HTTP. Адрес: `wss://multiplayer.rublox.pro/<room_id>`. Сейчас работает через `kubikon-realtime` микросервис (VM 110, port 8685, Node.js+Colyseus+Redis).
## Аутентификация
Все приватные эндпоинты ожидают **JWT в заголовке** `Authorization: Bearer <token>`. JWT выдаёт `/api-user/auth/login`. Срок жизни access-токена 1 час, refresh-токена 30 дней.
В плеере токен хранится в `localStorage.jwt`, рефрешится автоматически при 401 через `localStorage.refresh_token` `/api-user/auth/refresh`.
## Изменения API
**До publish:** если меняешь сигнатуру эндпоинта (убираешь поле, переименовываешь, меняешь тип) это **breaking change**. Объявление за 48 часов в канале `#разработка` на https://team.rublox.pro.
Записывай в `API_CHANGELOG.md` админ-репо (приватный, `minecraftia-school.ru/...`) это позволяет отследить какие изменения когда были.
## Что делать если эндпоинт пропал
1. Открой issue в репо плеера: «API endpoint /xxx not found».
2. Прикрепи console-лог с ошибкой.
3. Кто-то из core-команды посмотрит в `API_CHANGELOG.md` админ-репо и ответит это было умышленное изменение или баг.
## Контакты
- Issue tracker: https://git.rublox.pro/rublox/player/issues
- Чат: `#разработка` на https://team.rublox.pro