docs: переводы оставшихся английских комментариев на русский

- 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
This commit is contained in:
МИН 2026-05-27 23:18:38 +03:00
parent 8428cda555
commit 6d86aa7c36
8 changed files with 55 additions and 53 deletions

View File

@ -56,15 +56,15 @@ function PlayerRoute() {
} }
function IndexRoute() { function IndexRoute() {
// Direct hit on `/` without a gameId. // Прямой заход на `/` без gameId.
// On a real deployment users should arrive with a ticket, so redirect them // На реальном деплое юзер должен прийти с ticket'ом редиректим обратно
// back to the main Rublox site. On dev (localhost) just show a hint. // на главный сайт. На dev (localhost) показываем подсказку.
if (typeof window !== 'undefined' && window.location.hostname !== 'localhost' if (typeof window !== 'undefined' && window.location.hostname !== 'localhost'
&& window.location.hostname !== '127.0.0.1') { && window.location.hostname !== '127.0.0.1') {
window.location.assign(RUBLOX_HOME); window.location.assign(RUBLOX_HOME);
return null; return null;
} }
return <LoadingScreen text="Rublox Player" subText="Open /<gameId> to launch a game." />; return <LoadingScreen text="Плеер Рублокса" subText="Открой /<gameId> чтобы запустить игру." />;
} }
export default function App() { export default function App() {

View File

@ -32,14 +32,14 @@ import KubikonMobileControls from './KubikonMobileControls';
// document.referrer пуст, если юзер открыл вкладку напрямую или прошло // document.referrer пуст, если юзер открыл вкладку напрямую или прошло
// слишком много времени тогда дефолт rublox.pro. // слишком много времени тогда дефолт rublox.pro.
function exitPlayer(gameId) { function exitPlayer(gameId) {
// User clicked "Exit" suppress browser-confirm on close (the // Юзер явно нажал «Выход» отключаем browser-confirm о закрытии
// onBeforeUnload listener below reads this flag). // (флаг читает onBeforeUnload listener ниже).
try { window.__rubloxExplicitExit = true; } catch {} try { window.__rubloxExplicitExit = true; } catch {}
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {}; const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const RUBLOX_HOME = env.VITE_RUBLOX_HOME || 'https://rublox.pro/app'; const RUBLOX_HOME = env.VITE_RUBLOX_HOME || 'https://rublox.pro/app';
if (gameId) { if (gameId) {
// Pass gameId via ?game=<id> main site reads it and re-opens the // Передаём gameId через ?game=<id> главный сайт прочитает и снова
// game card (so users return to the page they came from). // откроет карточку игры (юзер возвращается на ту же страницу).
const sep = RUBLOX_HOME.includes('?') ? '&' : '?'; const sep = RUBLOX_HOME.includes('?') ? '&' : '?';
window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`); window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`);
} else { } else {

View File

@ -1,33 +1,33 @@
// API endpoints for Rublox Player. // API-эндпоинты плеера Рублокса.
// //
// All backend URLs are configurable via Vite environment variables: // Все URL бэкенда настраиваются через Vite environment variables:
// VITE_API_BASE — base URL for HTTP API (default: '' for localhost+vite-proxy) // VITE_API_BASE — базовый URL HTTP-API (дефолт: '' для localhost+vite-proxy)
// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP endpoint // VITE_REALTIME_HTTP — Colyseus matchmaking HTTP-эндпоинт
// VITE_REALTIME_WS — Colyseus WebSocket endpoint // VITE_REALTIME_WS — Colyseus WebSocket-эндпоинт
// VITE_RUBLOX_HOME — main Rublox site (where users are redirected if no JWT) // VITE_RUBLOX_HOME — главный сайт Рублокса (редирект если нет JWT)
// //
// See .env.example for a fully-working set of defaults that point at // См. .env.example с готовыми дефолтами на публичный staging
// the public staging environment (https://dev-api.rublox.pro). // (https://dev-api.rublox.pro).
// //
// In dev (vite on localhost) BASE is empty so requests go to relative // В dev (vite на localhost) BASE пустой и запросы идут на относительные
// /api-* paths, which vite.config.js proxies to staging/prod. // /api-* пути, которые vite.config.js проксирует на staging/prod.
const ENV = (typeof import.meta !== 'undefined' && import.meta.env) || {}; const ENV = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const IS_DEV = typeof window !== 'undefined' const IS_DEV = typeof window !== 'undefined'
&& (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'); && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');
// Empty BASE in dev → vite proxy handles routing. // Пустой BASE в dev → vite-proxy роутит сам.
// In prod → either env-configured backend or current origin. // В prod → либо env-настроенный бэкенд, либо текущий origin.
const BASE = ENV.VITE_API_BASE const BASE = ENV.VITE_API_BASE
?? (IS_DEV ? '' : (typeof window !== 'undefined' ? window.location.origin : '')); ?? (IS_DEV ? '' : (typeof window !== 'undefined' ? window.location.origin : ''));
export const USER_addres = BASE + '/api-user'; export const USER_addres = BASE + '/api-user';
export const STORYS_addres = BASE + '/api-storys'; export const STORYS_addres = BASE + '/api-storys';
// Realtime (Colyseus) endpoints. Use HTTPS-protocol-relative variant when // Эндпоинты realtime (Colyseus). По умолчанию используем HTTPS-relative
// served from HTTPS page (vite proxy handles /api-game), otherwise use // для HTTPS-страницы (vite-proxy обрабатывает /api-game), иначе берём
// the env-configured direct URLs. // env-настроенные прямые URL.
const IS_HTTPS = typeof window !== 'undefined' && window.location.protocol === 'https:'; const IS_HTTPS = typeof window !== 'undefined' && window.location.protocol === 'https:';
export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP 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 export const REALTIME_WS = ENV.VITE_REALTIME_WS
?? (IS_HTTPS ? `wss://${window.location.host}/api-game` : 'ws://localhost:8685'); ?? (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'; 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_PROFILE = USER_addres + '/assets/profile/';
export const FOLDER_STORYS = STORYS_addres + '/assets/skin/'; export const FOLDER_STORYS = STORYS_addres + '/assets/skin/';

View File

@ -3126,7 +3126,7 @@ export class GameRuntime {
: ''; : '';
return `${playerBase}/${playMatch[1]}`; 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/gd')) return rubloxBase + '/app/gd';
if (url.startsWith('/kubikon')) return rubloxBase + '/app'; if (url.startsWith('/kubikon')) return rubloxBase + '/app';
if (url.startsWith('/app')) return rubloxBase + url; if (url.startsWith('/app')) return rubloxBase + url;

View File

@ -41,11 +41,11 @@ const CAMERA_MODES = ['third', 'first', 'front'];
const SIDEVIEW_DIST = 14; const SIDEVIEW_DIST = 14;
const SIDEVIEW_HEIGHT = 2.5; const SIDEVIEW_HEIGHT = 2.5;
// Build absolute /api-storys URL. // Строит абсолютный URL для /api-storys.
// Uses VITE_API_BASE env if set (preferred for deployments where player // Использует VITE_API_BASE если задан (предпочтительно когда плеер и API
// and API are on different domains), otherwise falls back to: // на разных доменах), иначе fallback:
// - empty base in dev (vite proxy handles routing) // - пустой base в dev (vite-proxy роутит сам)
// - current origin in prod (assumes API is co-hosted) // - текущий origin в prod (предполагаем что API на том же домене)
function _storysApiUrl(path) { function _storysApiUrl(path) {
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {}; const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
if (env.VITE_API_BASE) { if (env.VITE_API_BASE) {

View File

@ -1,12 +1,14 @@
/** /**
* Dev-log клиент шлёт логи на локальный Python-сервер * Dev-log клиент шлёт логи на локальный HTTP-сервер на localhost:8765.
* (c:\Users\min\Desktop\server\dev-tools\devlog-server.py)
* *
* Сервер пишет в файл `devlog.txt` который Claude читает через Read tool. * Полезно когда нужно собирать console.* логи из браузера в файл для
* Это убирает необходимость копировать логи из консоли вручную. * последующего просмотра (например при отладке вместе с AI-ассистентом).
* *
* Активен только на localhost. На любом другом хосте запросы тихо * Активен только на localhost. На любом другом хосте запросы тихо
* игнорируются (devlog-сервер недоступен). * игнорируются (если devlog-сервер не запущен).
*
* Простой devlog-сервер можно собрать за 30 строк на Python/Node.js
* принимать POST /log с JSON-body и писать в файл.
* *
* Использование: * Использование:
* import { devlog, attachConsoleHook } from './devlog'; * import { devlog, attachConsoleHook } from './devlog';

View File

@ -1,9 +1,9 @@
{ {
"id": "sample", "id": "sample",
"title": "Sample Game (standalone mode)", "title": "Демо-игра (standalone-режим)",
"description": "A minimal demo project bundled with the player. Loaded when VITE_STANDALONE=true.", "description": "Минимальный демо-проект встроенный в плеер. Загружается при VITE_STANDALONE=true.",
"author_id": 0, "author_id": 0,
"author_username": "Rublox", "author_username": "Рублокс",
"likes_count": 0, "likes_count": 0,
"dislikes_count": 0, "dislikes_count": 0,
"play_count": 0, "play_count": 0,

View File

@ -1,23 +1,23 @@
import { defineConfig, loadEnv } from 'vite'; import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
// Vite config for Rublox Player. // Vite-конфиг плеера Рублокса.
// //
// - port 5173 is fixed (player code and external links assume it) // - порт 5173 фиксирован (код плеера и внешние ссылки на него рассчитывают)
// - outDir 'build' (deployed under nginx /var/www/rublox-player/build/) // - outDir 'build' (деплоится в nginx /var/www/rublox-player/build/)
// - manualChunks split babylon/colyseus into separate chunks // - manualChunks выносят babylon/colyseus в отдельные чанки
// (engine ~46k lines, single-bundle build is >5 MB; browsers parse longer) // (движок ~46к строк, single-bundle >5 МБ; браузер парсит дольше)
// - define for process.env.NODE_ENV — shim for engine code that used the // - define для process.env.NODE_ENV — шим для engine-кода, который
// CRA-provided global // использовал CRA-провайденный глобал
// - dev proxy targets staging by default; override via VITE_API_PROXY_TARGET // - dev-proxy по умолчанию ходит на staging; переопределяй через
// in .env.development.local to point at your own backend. // VITE_API_PROXY_TARGET в .env.development.local чтобы указать свой бэкенд.
export default defineConfig(({ mode }) => { 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 env = loadEnv(mode, process.cwd(), '');
const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro'; 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 proxyPrefixes = ['/api-user', '/api-storys', '/api-game'];
const proxy = Object.fromEntries( const proxy = Object.fromEntries(
proxyPrefixes.map((p) => [ proxyPrefixes.map((p) => [
@ -29,8 +29,8 @@ export default defineConfig(({ mode }) => {
return { return {
plugins: [react()], plugins: [react()],
server: { server: {
// Bind IPv4 explicitly — Vite defaults to [::1] on Windows, which // Явно биндим IPv4 — Vite по умолчанию слушает [::1] на Windows,
// breaks IPv4 localhost (ECONNREFUSED from curl / browser). // что ломает IPv4-localhost (ECONNREFUSED от curl/браузера).
host: '127.0.0.1', host: '127.0.0.1',
port: 5173, port: 5173,
strictPort: true, strictPort: true,