Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
Site internet de l'association BlueGenji, site vitrine avec plateforme de gestion de tournois, et classement interne type ELO
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Site de l'association BlueGenji Esport : tournois amateurs francophones sur Overwatch et Marvel Rivals, fiches d'équipes et de joueurs, classement du site, et intégration avec le bot Discord blueGenjiBot.查看完整 README ↗
Site de l'association BlueGenji Esport : tournois amateurs francophones sur Overwatch et Marvel Rivals, fiches d'équipes et de joueurs, classement du site, et intégration avec le bot Discord blueGenjiBot.
/regles), recrutement, pages légales (RGPD et registre des traitements, conditions d'utilisation, déclaration d'accessibilité)./profil./api/tournaments/[id]/stream), un instantané calculé une fois pour tous les spectateurs.mysql2, sans ORM ; le schéma est créé à la première requête (lib/server/database.ts)app/globals.css, Radix UI Slot, LucideblueGenjiBot démarré avec son API interne, pour les codes de connexion et les messages Discord (le site fonctionne sans, en mode dégradé)npm install
cp .env.production.example .env # puis renseigner les valeurs
npm run dev
Les tables bg_* sont créées automatiquement au premier accès API.
| Variable | Rôle |
|---|---|
DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE | Connexion à la base |
APP_URL | Adresse publique du site (ex. http://localhost:3000), à régler aussi au moment du build |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI | Connexion Google |
DISCORD_AUTH_CLIENT_ID, DISCORD_CLIENT_SECRET, DISCORD_REDIRECT_URI | Connexion Discord (DISCORD_AUTH_CLIENT_ID retombe sur DISCORD_BOT_CLIENT_ID) |
BLIZZARD_CLIENT_ID, BLIZZARD_CLIENT_SECRET, BLIZZARD_REDIRECT_URI, BLIZZARD_REGION | Connexion Blizzard |
DISCORD_BOT_CLIENT_ID, DISCORD_BOT_PERMISSIONS | Lien d'invitation du bot |
BOT_INTERNAL_URL, BOT_INTERNAL_TOKEN | API interne du bot (BOT_INTERNAL_TOKEN = INTERNAL_API_TOKEN du bot) |
BOT_DOCS_PATH | Chemin du dépôt du bot, pour /bot/docs (défaut : ../blueGenjiBot) |
VISIT_HASH_SALT | Sel des empreintes de visite (recommandé en production) |
TRUSTED_PROXY_HOPS, TRUSTED_PROXY_REAL_IP | Proxys de confiance devant l'application |
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT | Notifications push (paire tirée une fois par npm run push:keys ; absentes = push éteint ; la clé privée ne change plus une fois en production) |
DEV_AUTH_USER_ID | Développement seulement : connecte d'office ce compte (inactif hors NODE_ENV=development) |
Les redirections OAuth ont une valeur par défaut dérivée d'APP_URL.
npm run dev # serveur de développement (Turbopack)
npm run build # compilation de production
npm run start # démarrage de production
npm run lint # ESLint
npm run typecheck # tsc sur l'application et sur tests/
npm test # Jest
npm run test:coverage # Jest avec couverture
npm run test:e2e # Playwright
npm run seed # jeu de test (écrase les données préfixées Test_, refusé en production)
npm run seed:view # inspecte le jeu de test
npm run push:keys # tire une paire de clés VAPID (notifications push), une fois pour toutes
Scripts prévus pour la production (NODE_ENV=production) : npm run backfill:avatars (rapatrie les photos restées chez leur hébergeur) et npm run replay:deletions (rejoue les suppressions de compte après restauration d'une sauvegarde — lancer d'abord avec --dry-run).
Le site est installable (manifeste /manifest.webmanifest, voir docs/features/WEB_APP_MANIFEST.md), en mode minimal-ui et jamais standalone.
Le risque : lancée en mode autonome depuis l'écran d'accueil d'iOS, l'app a ses propres cookies, et l'aller-retour de la connexion Google, Discord ou Blizzard s'ouvre dans une feuille Safari qui ne les partage pas. La connexion échoue alors (?error=state le plus souvent), ou réussit dans la feuille en laissant l'app déconnectée. Le manifeste ne demande pas ce mode (minimal-ui), ce qui suffit jusqu'à iOS 18 ; depuis iOS 26, l'ajout à l'écran d'accueil coche par défaut « Ouvrir en tant qu'app web », qui l'impose quel que soit le manifeste — le cas est donc courant, pas marginal. Les navigateurs intégrés des applications (Instagram, TikTok, WebView Android…) posent le même problème. Le code Discord par message privé, qui ne quitte pas la page, fonctionne partout.
Ce que fait le site : /connexion reconnaît ces deux contextes (lib/shared/login-environment.ts) et affiche, au-dessus des boutons et avant le clic, un avertissement qui nomme les deux sorties : ouvrir le site dans un autre navigateur (Safari sur iOS), ou passer par le code Discord. Pour l'app iOS, c'est le seul moment utile : la redirection d'erreur s'ouvre dans la feuille Safari, qui ne se sait plus installée et ne peut plus nommer la cause. Dans un navigateur intégré, l'erreur revient au même endroit, et le message d'échec (state, oauth, params, session) reçoit en plus le même conseil. Le cas silencieux — connexion réussie dans la feuille, app restée déconnectée — ne produit aucune erreur : seul l'avertissement préalable le couvre.
En production : ~/apps/updateBlueGenji.sh (bot puis site, sans sudo ; site pour le site seul), qui appelle le ./update.sh de ce dépôt — voir docs/DEPLOYMENT.md.
CLAUDE.md : architecture, conventions et règles de travaildocs/features/ : une fiche par fonctionnalitédocs/DATABASE_SCHEMA.md, docs/AUTHORIZATION_RULES.mdACCESSIBILITE.md et ERREUR.txt : points d'accessibilité et erreurs connus, à traiterCode source sous licence GNU Affero General Public License v3.0 seulement (AGPL-3.0-only) — texte intégral dans LICENSE. Droits d'auteur : Copyright (C) 2026 Keryan Houssin ; portée de la licence et composants tiers dans NOTICE. Le site étant un service en ligne, l'article 13 de l'AGPL impose d'offrir le code source à ses utilisateurs : le lien « Code source » du pied de page et des mentions légales y pourvoit (SOURCE_CODE_URL, lib/shared/source-code.ts) — une instance modifiée doit le faire pointer vers son propre code.
Une branche feature/<nom> par fonctionnalité, puis une Pull Request vers main. Le CI enchaîne lint + typecheck, build et tests ; ne pas fusionner s'il est rouge.