ai generated solutions to our ai generated problems
This commit is contained in:
+54
-6
@@ -1162,8 +1162,24 @@ fn games_for(conn: &Connection, team_name: &str) -> Result<Vec<GameRow>, ApiErro
|
|||||||
COALESCE(SUM(p.missile_evades), 0),
|
COALESCE(SUM(p.missile_evades), 0),
|
||||||
COALESCE(SUM(p.shell_interceptions), 0),
|
COALESCE(SUM(p.shell_interceptions), 0),
|
||||||
COALESCE(SUM(p.team_kills_stat), 0),
|
COALESCE(SUM(p.team_kills_stat), 0),
|
||||||
m.winning_slot,
|
(SELECT pg.team_name
|
||||||
m.losing_slot
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = p.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Win'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1),
|
||||||
|
(SELECT pg.team_name
|
||||||
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = p.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Loss'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1)
|
||||||
FROM player_games_hist p
|
FROM player_games_hist p
|
||||||
LEFT JOIN match_summary m ON m.session_id = p.session_id
|
LEFT JOIN match_summary m ON m.session_id = p.session_id
|
||||||
WHERE p.team_name = ?1 COLLATE NOCASE
|
WHERE p.team_name = ?1 COLLATE NOCASE
|
||||||
@@ -1240,8 +1256,24 @@ fn recent_games_for(conn: &Connection, limit: i64) -> Result<Vec<GameRow>, ApiEr
|
|||||||
COALESCE(SUM(p.missile_evades), 0),
|
COALESCE(SUM(p.missile_evades), 0),
|
||||||
COALESCE(SUM(p.shell_interceptions), 0),
|
COALESCE(SUM(p.shell_interceptions), 0),
|
||||||
COALESCE(SUM(p.team_kills_stat), 0),
|
COALESCE(SUM(p.team_kills_stat), 0),
|
||||||
m.winning_slot,
|
(SELECT pg.team_name
|
||||||
m.losing_slot
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = r.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Win'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1),
|
||||||
|
(SELECT pg.team_name
|
||||||
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = r.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Loss'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1)
|
||||||
FROM recent r
|
FROM recent r
|
||||||
JOIN player_games_hist p
|
JOIN player_games_hist p
|
||||||
ON p.session_id = r.session_id AND p.team_name = r.team_name COLLATE NOCASE
|
ON p.session_id = r.session_id AND p.team_name = r.team_name COLLATE NOCASE
|
||||||
@@ -1303,8 +1335,24 @@ fn game_for(conn: &Connection, session_id: &str) -> Result<Option<GameRow>, ApiE
|
|||||||
COALESCE(SUM(p.missile_evades), 0),
|
COALESCE(SUM(p.missile_evades), 0),
|
||||||
COALESCE(SUM(p.shell_interceptions), 0),
|
COALESCE(SUM(p.shell_interceptions), 0),
|
||||||
COALESCE(SUM(p.team_kills_stat), 0),
|
COALESCE(SUM(p.team_kills_stat), 0),
|
||||||
m.winning_slot,
|
(SELECT pg.team_name
|
||||||
m.losing_slot
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = p.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Win'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1),
|
||||||
|
(SELECT pg.team_name
|
||||||
|
FROM player_games_hist pg
|
||||||
|
WHERE pg.session_id = p.session_id
|
||||||
|
AND pg.team_name IS NOT NULL
|
||||||
|
AND pg.team_name != ''
|
||||||
|
AND pg.victor_bool = 'Loss'
|
||||||
|
GROUP BY pg.team_name COLLATE NOCASE
|
||||||
|
ORDER BY COUNT(DISTINCT pg.UID) DESC, pg.team_name COLLATE NOCASE
|
||||||
|
LIMIT 1)
|
||||||
FROM player_games_hist p
|
FROM player_games_hist p
|
||||||
LEFT JOIN match_summary m ON m.session_id = p.session_id
|
LEFT JOIN match_summary m ON m.session_id = p.session_id
|
||||||
WHERE p.session_id = ?1
|
WHERE p.session_id = ?1
|
||||||
|
|||||||
+13
-15
@@ -110,8 +110,8 @@ function formatDate(timestamp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function gameParticipants(game) {
|
function gameParticipants(game) {
|
||||||
const winner = game?.winning_team || ''
|
const winner = displayTeamName(game?.winning_team)
|
||||||
const loser = game?.losing_team || ''
|
const loser = displayTeamName(game?.losing_team)
|
||||||
|
|
||||||
if (winner || loser) {
|
if (winner || loser) {
|
||||||
return [
|
return [
|
||||||
@@ -131,6 +131,11 @@ function gameParticipants(game) {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function displayTeamName(value) {
|
||||||
|
const name = String(value || '').trim()
|
||||||
|
return /^\d+$/.test(name) ? '' : name
|
||||||
|
}
|
||||||
|
|
||||||
function ParticipantNames({ participants }) {
|
function ParticipantNames({ participants }) {
|
||||||
if (!participants.length) {
|
if (!participants.length) {
|
||||||
return <p className="truncate text-sm font-semibold text-text-soft">Participants unknown</p>
|
return <p className="truncate text-sm font-semibold text-text-soft">Participants unknown</p>
|
||||||
@@ -2390,8 +2395,6 @@ function RecentGamesSection({ live, matches, navigate }) {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-3 flex flex-wrap gap-2 text-xs text-text-soft">
|
<div className="mt-3 flex flex-wrap gap-2 text-xs text-text-soft">
|
||||||
<span>{formatNumber(match.stats?.ground_kills)} ground</span>
|
|
||||||
<span>{formatNumber(match.stats?.air_kills)} air</span>
|
|
||||||
<span>{formatNumber(match.stats?.deaths)} deaths</span>
|
<span>{formatNumber(match.stats?.deaths)} deaths</span>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
@@ -2786,8 +2789,8 @@ function GamePage({ gameId, navigate }) {
|
|||||||
{game ? (
|
{game ? (
|
||||||
<div className="mt-6 grid gap-5 sm:grid-cols-2 xl:grid-cols-4">
|
<div className="mt-6 grid gap-5 sm:grid-cols-2 xl:grid-cols-4">
|
||||||
<Stat label="Players" value={formatNumber(game.player_count)} />
|
<Stat label="Players" value={formatNumber(game.player_count)} />
|
||||||
<Stat label="Ground" value={formatNumber(game.stats?.ground_kills)} />
|
<Stat label="Assists" value={formatNumber(game.stats?.assists)} />
|
||||||
<Stat label="Air" value={formatNumber(game.stats?.air_kills)} />
|
<Stat label="Score" value={formatNumber(game.stats?.score)} />
|
||||||
<Stat label="Deaths" value={formatNumber(game.stats?.deaths)} />
|
<Stat label="Deaths" value={formatNumber(game.stats?.deaths)} />
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
@@ -2806,7 +2809,7 @@ function GamePage({ gameId, navigate }) {
|
|||||||
const won = String(participant.result || '').toLowerCase() === 'win'
|
const won = String(participant.result || '').toLowerCase() === 'win'
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_repeat(5,auto)] md:items-center"
|
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_repeat(4,auto)] md:items-center"
|
||||||
key={participant.team_name}
|
key={participant.team_name}
|
||||||
onClick={() => navigate(teamPath(participant.team_name))}
|
onClick={() => navigate(teamPath(participant.team_name))}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -2815,9 +2818,8 @@ function GamePage({ gameId, navigate }) {
|
|||||||
{participant.team_name}
|
{participant.team_name}
|
||||||
</p>
|
</p>
|
||||||
<p className="text-sm">{formatNumber(participant.player_count)} players</p>
|
<p className="text-sm">{formatNumber(participant.player_count)} players</p>
|
||||||
<p className="text-sm">{formatNumber(participant.stats?.ground_kills)} ground</p>
|
|
||||||
<p className="text-sm">{formatNumber(participant.stats?.air_kills)} air</p>
|
|
||||||
<p className="text-sm">{formatNumber(participant.stats?.assists)} assists</p>
|
<p className="text-sm">{formatNumber(participant.stats?.assists)} assists</p>
|
||||||
|
<p className="text-sm">{formatNumber(participant.stats?.score)} score</p>
|
||||||
<p className="text-sm">{formatNumber(participant.stats?.deaths)} deaths</p>
|
<p className="text-sm">{formatNumber(participant.stats?.deaths)} deaths</p>
|
||||||
</button>
|
</button>
|
||||||
)
|
)
|
||||||
@@ -2884,7 +2886,7 @@ function BattleResults({ games, navigate, status }) {
|
|||||||
<div className="max-h-[560px] overflow-auto">
|
<div className="max-h-[560px] overflow-auto">
|
||||||
{games.map((game) => (
|
{games.map((game) => (
|
||||||
<button
|
<button
|
||||||
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_minmax(10rem,0.8fr)_repeat(5,auto)] md:items-center"
|
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_minmax(10rem,0.8fr)_repeat(3,auto)] md:items-center"
|
||||||
key={game.session_id}
|
key={game.session_id}
|
||||||
onClick={() => navigate(gamePath(game.session_id))}
|
onClick={() => navigate(gamePath(game.session_id))}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -2897,8 +2899,6 @@ function BattleResults({ games, navigate, status }) {
|
|||||||
</div>
|
</div>
|
||||||
<ParticipantNames participants={gameParticipants(game)} />
|
<ParticipantNames participants={gameParticipants(game)} />
|
||||||
<p className="text-sm">{formatNumber(game.player_count)} players</p>
|
<p className="text-sm">{formatNumber(game.player_count)} players</p>
|
||||||
<p className="text-sm">{formatNumber(game.stats?.ground_kills)} ground</p>
|
|
||||||
<p className="text-sm">{formatNumber(game.stats?.air_kills)} air</p>
|
|
||||||
<p className="text-sm">{formatNumber(game.stats?.assists)} assists</p>
|
<p className="text-sm">{formatNumber(game.stats?.assists)} assists</p>
|
||||||
<p className="text-sm">{formatNumber(game.stats?.deaths)} deaths</p>
|
<p className="text-sm">{formatNumber(game.stats?.deaths)} deaths</p>
|
||||||
</button>
|
</button>
|
||||||
@@ -2926,7 +2926,7 @@ function BattleLogsPage({ live, matches, navigate }) {
|
|||||||
<div className="overflow-hidden rounded-lg border border-border bg-fury-white shadow-sm">
|
<div className="overflow-hidden rounded-lg border border-border bg-fury-white shadow-sm">
|
||||||
{matches.map((match) => (
|
{matches.map((match) => (
|
||||||
<button
|
<button
|
||||||
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_minmax(10rem,0.8fr)_repeat(4,auto)] md:items-center"
|
className="grid w-full gap-4 border-b border-surface px-5 py-4 text-left transition hover:bg-surface md:grid-cols-[1fr_minmax(10rem,0.8fr)_repeat(2,auto)] md:items-center"
|
||||||
key={match.session_id}
|
key={match.session_id}
|
||||||
onClick={() => navigate(gamePath(match.session_id))}
|
onClick={() => navigate(gamePath(match.session_id))}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -2939,8 +2939,6 @@ function BattleLogsPage({ live, matches, navigate }) {
|
|||||||
</div>
|
</div>
|
||||||
<ParticipantNames participants={gameParticipants(match)} />
|
<ParticipantNames participants={gameParticipants(match)} />
|
||||||
<p className="text-sm">{formatNumber(match.player_count)} players</p>
|
<p className="text-sm">{formatNumber(match.player_count)} players</p>
|
||||||
<p className="text-sm">{formatNumber(match.stats?.ground_kills)} ground</p>
|
|
||||||
<p className="text-sm">{formatNumber(match.stats?.air_kills)} air</p>
|
|
||||||
<p className="text-sm">{formatNumber(match.stats?.deaths)} deaths</p>
|
<p className="text-sm">{formatNumber(match.stats?.deaths)} deaths</p>
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user