holy shit i can score an event properly!!!! this is awesome

This commit is contained in:
2026-06-29 14:40:02 +01:00
parent 7ae5b2fbbc
commit 07692fe0bd
7 changed files with 95 additions and 33 deletions

View File

@@ -107,6 +107,7 @@ export async function getAllRegisteredEventPlayers(eventId: number) {
id: players.playerId,
firstName: players.firstName,
lastName: players.lastName,
registeredPlayerId: players.registeredPlayerId,
placement: players.placement,
bracket: players.bracket,
eventId: players.eventId,

View File

@@ -160,6 +160,7 @@ export const registeredEventPlayersView = sqliteView('registeredEventPlayersView
return qb
.select({
playerId: players.id,
registeredPlayerId: registeredPlayers.id,
firstName: players.firstName,
lastName: players.lastName,
placement: registeredPlayers.placement,

View File

@@ -177,7 +177,10 @@
{:else if event.state == 2}
<span
class="event-winner event-status goldman"
style="--winner-color:{event.winner.color}">Won By {event.winner.name}</span
style="--winner-color:{event.winner.color}"
>Won By {event.winner.name} at {new Date(event.completed)
.toLocaleTimeString()
.slice(0, -3)}</span
>
{/if}
</div>

View File

@@ -22,7 +22,6 @@ export async function POST({ request }: any) {
return new Error();
}
let scoringPreset = eventData.events[0].scoringPreset;
console.log(scoringPreset);
// make a new main ledger entry
let newLedgerEntry = await db
@@ -45,41 +44,77 @@ export async function POST({ request }: any) {
);
}
// for every bracket and player
// Create a Map to collect total scores per team
const teamScores = new Map<any, number>();
// for every bracket
for (let bracket in responseBody.brackets) {
// for every player
for (let player in responseBody.brackets[bracket].players) {
// variable fun
let currentPlayer = responseBody.brackets[bracket].players[player];
console.log(currentPlayer);
let currentPlayerTeam = currentPlayer.teamId;
let currentPlayerPosition = currentPlayer.position;
// If they put in a score
// If they put in a score / result
if (currentPlayerPosition > 0) {
let score = getPoints(scoringPreset, currentPlayerPosition);
// If their score is in the preset and they put in a score
if (currentPlayer.scores.length > 0) {
if (score > 0) {
// put the scores on the board baby
// THIS SHOULDNT BE REFERENCED THIS IS INTENDED
let newScoreLedgerEntry = await db
.insert(schema.scoreLedger)
.values({ ledgerID: ledgerEntryId, teamID: currentPlayerTeam, points: score });
// Accumulate points for this team instead of inserting right away
const currentTeamScore = teamScores.get(currentPlayerTeam) || 0;
teamScores.set(currentPlayerTeam, currentTeamScore + score);
}
// PLACEMENT LOGIC (Left untouched)
let newPlayerPlacement = await db
.update(schema.registeredPlayers)
.set({ placement: currentPlayerPosition })
.where(eq(schema.registeredPlayers.playerID, currentPlayer.id))
.where(eq(schema.registeredPlayers.id, currentPlayer.registeredPlayerId))
.returning();
console.log(newPlayerPlacement);
console.log(newPlayerPlacement[0].placement, currentPlayer.firstName);
}
}
}
}
// After calculating all player scores, batch insert team scores into the ledger
if (teamScores.size > 0) {
const ledgerEntries = Array.from(teamScores.entries()).map(([teamID, points]) => ({
ledgerID: ledgerEntryId,
teamID,
points
}));
let newScores = await db.insert(schema.scoreLedger).values(ledgerEntries).returning();
console.log(newScores);
}
// 2. Determine the winner right here using the same Map data
let highestScore = -1;
let winningTeamId = null;
for (let [teamID, points] of teamScores.entries()) {
if (points > highestScore) {
highestScore = points;
winningTeamId = teamID;
}
}
if (winningTeamId) {
let teamWinnerUpdate = await db
.update(schema.registeredEvents)
.set({ teamWinner: winningTeamId, state: 2, timeCompleted: Date.now() })
.where(eq(schema.registeredEvents.id, responseBody.eventId))
.returning();
console.log(teamWinnerUpdate);
}
}
// Update the frontends
globalEmitter.emit('scoreUpdate');
// Return a resonse because
// Return a response because
return new Response('coolsies');
}
}

View File

@@ -41,7 +41,29 @@
'Content-type': 'application/json; charset=UTF-8'
}
});
return response.json();
const data = await response.json();
// Sort the players inside each bracket before returning the data
if (data && data[0] && data[0].registeredPlayers) {
data[0].registeredPlayers.forEach((bracket: any) => {
bracket.items.sort((a: any, b: any) => {
// 1. Both have no placement (placement === 0) -> keep original order
if (a.placement === 0 && b.placement === 0) return 0;
// 2. 'a' has no placement, but 'b' does -> move 'b' to the top
if (a.placement === 0) return 1;
// 3. 'a' has a placement, but 'b' doesn't -> keep 'a' on top
if (b.placement === 0) return -1;
// 4. Both have placements -> sort ascending (1st, 2nd, 3rd, etc.)
return a.placement - b.placement;
});
});
}
return data;
}
let eventDataPromise = getEventData();

View File

@@ -29,7 +29,7 @@
return { destroy: () => ro.disconnect() };
}
let eventId = params.eventId;
let eventId = parseInt(params.eventId);
let eventEndpoint: EventSource;
type Player = { firstName: string; lastName: string; teamColor: string; [key: string]: any };
@@ -93,6 +93,19 @@
...bracket,
items: sortByScore
? [...bracket.items].sort((a, b) => {
// 1. Check if players actually have committed scores
const scoresA = committedScores[a.id]?.filter((s) => s !== null) ?? [];
const scoresB = committedScores[b.id]?.filter((s) => s !== null) ?? [];
const hasA = scoresA.length > 0;
const hasB = scoresB.length > 0;
// 2. Handle cases where one or both don't have scores
if (!hasA && !hasB) return 0; // Neither have scores, keep order
if (!hasA) return 1; // 'a' has no score -> push down
if (!hasB) return -1; // 'b' has no score -> push down
// 3. Both have scores, fallback to standard leaderboard sorting
const fallback = lowerIsBetter ? Infinity : -Infinity;
const sa = useAverage
? average(committedScores[a.id] ?? [], fallback)
@@ -100,6 +113,7 @@
const sb = useAverage
? average(committedScores[b.id] ?? [], fallback)
: best(committedScores[b.id] ?? [], fallback);
return lowerIsBetter ? sa - sb : sb - sa;
})
: bracket.items
@@ -238,9 +252,9 @@
<div class="flex justify-center">
<div class="w-full flex-col px-[2vw] text-center">
<div
style:background-color={event.state == 1
? 'color-mix(in srgb, #fe640b 18%, transparent);'
: undefined}
style:background-color={event.state === 1
? 'color-mix(in srgb, #fe640b 18%, transparent)'
: ''}
class="align-text-middle my-7 h-10 w-full rounded-2xl border-2 border-solid border-ctp-surface1"
>
{event.name} - {event.division} - scoring {#if event.state == 1}- ONGOING
@@ -323,6 +337,7 @@
<input
type="number"
placeholder="run {run + 1}"
class="text-black"
disabled={event.state != 1}
value={pendingScores[player.id]?.[run] ?? ''}
oninput={(e) => {