From 6d86aa7c362db01f13c47a8b7cb3bfedd8effe56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Wed, 27 May 2026 23:18:38 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D1=88=D0=B8=D1=85?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B0=D0=BD=D0=B3=D0=BB=D0=B8=D0=B9=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=B8=D0=B5=D0=B2=20=D0=BD=D0=B0=20=D1=80=D1=83=D1=81?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/api/API.js — комменты, описание env - vite.config.js — описание полей - src/App.jsx — IndexRoute (текст «Плеер Рублокса») - src/KubikonPlayer/KubikonPlayer.jsx — exitPlayer - src/engine/PlayerController.js — _storysApiUrl - src/engine/GameRuntime.js — _resolveExternalUrl - src/engine/devlog.js — убрал упоминания приватных путей разработчика - src/fixtures/sample-game.json — title/description --- src/App.jsx | 8 +++---- src/KubikonPlayer/KubikonPlayer.jsx | 8 +++---- src/api/API.js | 34 ++++++++++++++--------------- src/engine/GameRuntime.js | 2 +- src/engine/PlayerController.js | 10 ++++----- src/engine/devlog.js | 12 +++++----- src/fixtures/sample-game.json | 6 ++--- vite.config.js | 28 ++++++++++++------------ 8 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index ecb1782..3c292fa 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -56,15 +56,15 @@ function PlayerRoute() { } function IndexRoute() { - // Direct hit on `/` without a gameId. - // On a real deployment users should arrive with a ticket, so redirect them - // back to the main Rublox site. On dev (localhost) just show a hint. + // Прямой заход на `/` без gameId. + // На реальном деплое юзер должен прийти с ticket'ом — редиректим обратно + // на главный сайт. На dev (localhost) показываем подсказку. if (typeof window !== 'undefined' && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') { window.location.assign(RUBLOX_HOME); return null; } - return ; + return ; } export default function App() { diff --git a/src/KubikonPlayer/KubikonPlayer.jsx b/src/KubikonPlayer/KubikonPlayer.jsx index 0c69b39..24ca076 100644 --- a/src/KubikonPlayer/KubikonPlayer.jsx +++ b/src/KubikonPlayer/KubikonPlayer.jsx @@ -32,14 +32,14 @@ import KubikonMobileControls from './KubikonMobileControls'; // document.referrer пуст, если юзер открыл вкладку напрямую или прошло // слишком много времени — тогда дефолт rublox.pro. function exitPlayer(gameId) { - // User clicked "Exit" — suppress browser-confirm on close (the - // onBeforeUnload listener below reads this flag). + // Юзер явно нажал «Выход» — отключаем browser-confirm о закрытии + // (флаг читает onBeforeUnload listener ниже). try { window.__rubloxExplicitExit = true; } catch {} const env = (typeof import.meta !== 'undefined' && import.meta.env) || {}; const RUBLOX_HOME = env.VITE_RUBLOX_HOME || 'https://rublox.pro/app'; if (gameId) { - // Pass gameId via ?game= — main site reads it and re-opens the - // game card (so users return to the page they came from). + // Передаём gameId через ?game= — главный сайт прочитает и снова + // откроет карточку игры (юзер возвращается на ту же страницу). const sep = RUBLOX_HOME.includes('?') ? '&' : '?'; window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`); } else { diff --git a/src/api/API.js b/src/api/API.js index 28e74f0..bc7662f 100644 --- a/src/api/API.js +++ b/src/api/API.js @@ -1,33 +1,33 @@ -// API endpoints for Rublox Player. +// API-эндпоинты плеера Рублокса. // -// All backend URLs are configurable via Vite environment variables: -// VITE_API_BASE — base URL for HTTP API (default: '' for localhost+vite-proxy) -// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP endpoint -// VITE_REALTIME_WS — Colyseus WebSocket endpoint -// VITE_RUBLOX_HOME — main Rublox site (where users are redirected if no JWT) +// Все URL бэкенда настраиваются через Vite environment variables: +// VITE_API_BASE — базовый URL HTTP-API (дефолт: '' для localhost+vite-proxy) +// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP-эндпоинт +// VITE_REALTIME_WS — Colyseus WebSocket-эндпоинт +// VITE_RUBLOX_HOME — главный сайт Рублокса (редирект если нет JWT) // -// See .env.example for a fully-working set of defaults that point at -// the public staging environment (https://dev-api.rublox.pro). +// См. .env.example с готовыми дефолтами на публичный staging +// (https://dev-api.rublox.pro). // -// In dev (vite on localhost) BASE is empty so requests go to relative -// /api-* paths, which vite.config.js proxies to staging/prod. +// В dev (vite на localhost) BASE пустой и запросы идут на относительные +// /api-* пути, которые vite.config.js проксирует на staging/prod. const ENV = (typeof import.meta !== 'undefined' && import.meta.env) || {}; const IS_DEV = typeof window !== 'undefined' && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'); -// Empty BASE in dev → vite proxy handles routing. -// In prod → either env-configured backend or current origin. +// Пустой BASE в dev → vite-proxy роутит сам. +// В prod → либо env-настроенный бэкенд, либо текущий origin. const BASE = ENV.VITE_API_BASE ?? (IS_DEV ? '' : (typeof window !== 'undefined' ? window.location.origin : '')); export const USER_addres = BASE + '/api-user'; export const STORYS_addres = BASE + '/api-storys'; -// Realtime (Colyseus) endpoints. Use HTTPS-protocol-relative variant when -// served from HTTPS page (vite proxy handles /api-game), otherwise use -// the env-configured direct URLs. +// Эндпоинты realtime (Colyseus). По умолчанию используем HTTPS-relative +// для HTTPS-страницы (vite-proxy обрабатывает /api-game), иначе берём +// env-настроенные прямые URL. const IS_HTTPS = typeof window !== 'undefined' && window.location.protocol === 'https:'; export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP @@ -35,9 +35,9 @@ export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP export const REALTIME_WS = ENV.VITE_REALTIME_WS ?? (IS_HTTPS ? `wss://${window.location.host}/api-game` : 'ws://localhost:8685'); -// Rublox main site — where to redirect users with no ticket/JWT. +// Главный сайт Рублокса — куда редиректить юзеров без ticket/JWT. export const RUBLOX_HOME = ENV.VITE_RUBLOX_HOME ?? 'https://rublox.pro/app'; -// Asset folders for profile photos & skins (served by user/storys microservices). +// Папки ассетов для фото профиля и скинов (раздают user/storys-микросервисы). export const FOLDER_PROFILE = USER_addres + '/assets/profile/'; export const FOLDER_STORYS = STORYS_addres + '/assets/skin/'; diff --git a/src/engine/GameRuntime.js b/src/engine/GameRuntime.js index 8ae57b9..5407740 100644 --- a/src/engine/GameRuntime.js +++ b/src/engine/GameRuntime.js @@ -3126,7 +3126,7 @@ export class GameRuntime { : ''; return `${playerBase}/${playMatch[1]}`; } - // Legacy /kubikon/* routes — redirect to main site. + // Legacy /kubikon/* роуты — редирект на главный сайт. if (url.startsWith('/kubikon/gd')) return rubloxBase + '/app/gd'; if (url.startsWith('/kubikon')) return rubloxBase + '/app'; if (url.startsWith('/app')) return rubloxBase + url; diff --git a/src/engine/PlayerController.js b/src/engine/PlayerController.js index aade580..142f4ad 100644 --- a/src/engine/PlayerController.js +++ b/src/engine/PlayerController.js @@ -41,11 +41,11 @@ const CAMERA_MODES = ['third', 'first', 'front']; const SIDEVIEW_DIST = 14; const SIDEVIEW_HEIGHT = 2.5; -// Build absolute /api-storys URL. -// Uses VITE_API_BASE env if set (preferred for deployments where player -// and API are on different domains), otherwise falls back to: -// - empty base in dev (vite proxy handles routing) -// - current origin in prod (assumes API is co-hosted) +// Строит абсолютный URL для /api-storys. +// Использует VITE_API_BASE если задан (предпочтительно когда плеер и API +// на разных доменах), иначе fallback: +// - пустой base в dev (vite-proxy роутит сам) +// - текущий origin в prod (предполагаем что API на том же домене) function _storysApiUrl(path) { const env = (typeof import.meta !== 'undefined' && import.meta.env) || {}; if (env.VITE_API_BASE) { diff --git a/src/engine/devlog.js b/src/engine/devlog.js index cb6e54e..fd82cf1 100644 --- a/src/engine/devlog.js +++ b/src/engine/devlog.js @@ -1,12 +1,14 @@ /** - * Dev-log клиент — шлёт логи на локальный Python-сервер - * (c:\Users\min\Desktop\server\dev-tools\devlog-server.py) + * Dev-log клиент — шлёт логи на локальный HTTP-сервер на localhost:8765. * - * Сервер пишет в файл `devlog.txt` который Claude читает через Read tool. - * Это убирает необходимость копировать логи из консоли вручную. + * Полезно когда нужно собирать console.* логи из браузера в файл для + * последующего просмотра (например при отладке вместе с AI-ассистентом). * * Активен только на localhost. На любом другом хосте запросы тихо - * игнорируются (devlog-сервер недоступен). + * игнорируются (если devlog-сервер не запущен). + * + * Простой devlog-сервер можно собрать за 30 строк на Python/Node.js — + * принимать POST /log с JSON-body и писать в файл. * * Использование: * import { devlog, attachConsoleHook } from './devlog'; diff --git a/src/fixtures/sample-game.json b/src/fixtures/sample-game.json index 6258a8c..d45a2d4 100644 --- a/src/fixtures/sample-game.json +++ b/src/fixtures/sample-game.json @@ -1,9 +1,9 @@ { "id": "sample", - "title": "Sample Game (standalone mode)", - "description": "A minimal demo project bundled with the player. Loaded when VITE_STANDALONE=true.", + "title": "Демо-игра (standalone-режим)", + "description": "Минимальный демо-проект встроенный в плеер. Загружается при VITE_STANDALONE=true.", "author_id": 0, - "author_username": "Rublox", + "author_username": "Рублокс", "likes_count": 0, "dislikes_count": 0, "play_count": 0, diff --git a/vite.config.js b/vite.config.js index ad4a319..64b6037 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,23 +1,23 @@ import { defineConfig, loadEnv } from 'vite'; import react from '@vitejs/plugin-react'; -// Vite config for Rublox Player. +// Vite-конфиг плеера Рублокса. // -// - port 5173 is fixed (player code and external links assume it) -// - outDir 'build' (deployed under nginx /var/www/rublox-player/build/) -// - manualChunks split babylon/colyseus into separate chunks -// (engine ~46k lines, single-bundle build is >5 MB; browsers parse longer) -// - define for process.env.NODE_ENV — shim for engine code that used the -// CRA-provided global -// - dev proxy targets staging by default; override via VITE_API_PROXY_TARGET -// in .env.development.local to point at your own backend. +// - порт 5173 фиксирован (код плеера и внешние ссылки на него рассчитывают) +// - outDir 'build' (деплоится в nginx /var/www/rublox-player/build/) +// - manualChunks выносят babylon/colyseus в отдельные чанки +// (движок ~46к строк, single-bundle >5 МБ; браузер парсит дольше) +// - define для process.env.NODE_ENV — шим для engine-кода, который +// использовал CRA-провайденный глобал +// - dev-proxy по умолчанию ходит на staging; переопределяй через +// VITE_API_PROXY_TARGET в .env.development.local чтобы указать свой бэкенд. export default defineConfig(({ mode }) => { - // Load env so we can use VITE_API_PROXY_TARGET in proxy config. + // Грузим env чтобы взять VITE_API_PROXY_TARGET для proxy-конфига. const env = loadEnv(mode, process.cwd(), ''); const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro'; - // All backend prefixes the player talks to. - // Each entry creates a Vite proxy: /api-X/* → ${PROXY_TARGET}/api-X/* + // Все префиксы бэкенда с которыми общается плеер. + // Каждая запись создаёт Vite-proxy: /api-X/* → ${PROXY_TARGET}/api-X/* const proxyPrefixes = ['/api-user', '/api-storys', '/api-game']; const proxy = Object.fromEntries( proxyPrefixes.map((p) => [ @@ -29,8 +29,8 @@ export default defineConfig(({ mode }) => { return { plugins: [react()], server: { - // Bind IPv4 explicitly — Vite defaults to [::1] on Windows, which - // breaks IPv4 localhost (ECONNREFUSED from curl / browser). + // Явно биндим IPv4 — Vite по умолчанию слушает [::1] на Windows, + // что ломает IPv4-localhost (ECONNREFUSED от curl/браузера). host: '127.0.0.1', port: 5173, strictPort: true,