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:
parent
8428cda555
commit
6d86aa7c36
@ -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 <LoadingScreen text="Rublox Player" subText="Open /<gameId> to launch a game." />;
|
||||
return <LoadingScreen text="Плеер Рублокса" subText="Открой /<gameId> чтобы запустить игру." />;
|
||||
}
|
||||
|
||||
export default function App() {
|
||||
|
||||
@ -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=<id> — main site reads it and re-opens the
|
||||
// game card (so users return to the page they came from).
|
||||
// Передаём gameId через ?game=<id> — главный сайт прочитает и снова
|
||||
// откроет карточку игры (юзер возвращается на ту же страницу).
|
||||
const sep = RUBLOX_HOME.includes('?') ? '&' : '?';
|
||||
window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`);
|
||||
} else {
|
||||
|
||||
@ -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/';
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user