diff --git a/frontend/public/war-thunder-deviss.gif b/frontend/public/war-thunder-deviss.gif new file mode 100644 index 0000000..092c5fe Binary files /dev/null and b/frontend/public/war-thunder-deviss.gif differ diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index d15faa1..9613bbe 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -69,7 +69,13 @@ const missingStaticDataPaths = new Set() const turnstileRequiredEvent = 'tssbot:turnstile-required' const BLOCKED_PLAYER_UIDS = new Set(['165569402', '86157459', '33536334', '41808996', '3651161']) -const BLOCKED_TEAM_NAMES = new Set(['TPC']) +const BLOCKED_TEAM_NAMES = new Set() +const TEAM_DISPLAY_NAMES = new Map([ + ['TPC', 'They Prefer Children'], +]) +const TEAM_LOOKUP_NAMES = new Map([ + ['they prefer children', 'TPC'], +]) const blogPostFiles = import.meta.glob('./blog/posts/*.md', { eager: true, import: 'default', @@ -150,8 +156,14 @@ const publicDataSources = { players: dataSource(apiEndpoints.players, staticDataPath('leaderboard-players.json')), homeTeams: dataSource(apiEndpoints.homeTeams, staticDataPath('home-teams.json')), recentGames: dataSource(apiEndpoints.recentGames, staticDataPath('recent-games.json')), - detail: (name) => dataSource(apiEndpoints.detail(name), staticDataPath('teams', `${staticDataKey(name)}.json`)), - games: (name) => dataSource(apiEndpoints.games(name), staticDataPath('teams', `${staticDataKey(name)}.games.json`)), + detail: (name) => { + const lookupName = normalizeTeamLookupName(name) + return dataSource(apiEndpoints.detail(lookupName), staticDataPath('teams', `${staticDataKey(lookupName)}.json`)) + }, + games: (name) => { + const lookupName = normalizeTeamLookupName(name) + return dataSource(apiEndpoints.games(lookupName), staticDataPath('teams', `${staticDataKey(lookupName)}.games.json`)) + }, player: (uid) => dataSource(apiEndpoints.player(uid), staticDataPath('players', `${staticDataKey(uid)}.json`)), game: (gameId) => dataSource(apiEndpoints.game(gameId), staticDataPath('games', `${staticDataKey(gameId)}.json`)), gameLogs: (gameId) => dataSource(apiEndpoints.gameLogs(gameId), staticDataPath('games', `${staticDataKey(gameId)}.logs.json`)), @@ -382,7 +394,8 @@ function gameParticipants(game) { } function displayTeamName(value) { - return String(value || '').trim() + const name = String(value || '').trim() + return TEAM_DISPLAY_NAMES.get(name) || name } function ParticipantNames({ participants, spread = false }) { @@ -428,13 +441,22 @@ function ParticipantNames({ participants, spread = false }) { } function bestTeamName(team) { - return team?.name || '' + return displayTeamName(team?.name) +} + +function sourceTeamName(team) { + return String(team?.name || '').trim() } function searchKey(value) { return String(value || '').trim().toLocaleLowerCase() } +function normalizeTeamLookupName(value) { + const name = String(value || '').trim() + return TEAM_LOOKUP_NAMES.get(searchKey(name)) || name +} + function teamSearchResult(team) { const name = bestTeamName(team) return { @@ -489,7 +511,7 @@ function teamDetailLooksReal(detail) { } function canonicalTeamName(detail, fallback = '') { - return detail?.name || fallback + return displayTeamName(detail?.name || fallback) } function normalizeAnalyticsPreferences(value) { @@ -2058,7 +2080,7 @@ function AppContent() { return } - const resolved = await fetchJson(apiEndpoints.resolve(name)) + const resolved = await fetchJson(apiEndpoints.resolve(normalizeTeamLookupName(name))) const resolvedName = resolved.name if (!resolvedName) throw new Error('Team not found') @@ -2696,11 +2718,19 @@ function PlayerStatCard({ label, value }) { ) } -function BlockedPage({ onBack }) { +function BlockedPage({ imageAlt = '', imageSrc = '', onBack }) { return (
-

🤡🤡🤡🤡

+ {imageSrc ? ( + {imageAlt} + ) : ( +

🤡🤡🤡🤡

+ )}

user affiliated with pedophiles, blocked~

{onBack ? (