holy shit i can score an event properly!!!! this is awesome
This commit is contained in:
15
;
15
;
@@ -1,15 +0,0 @@
|
|||||||
{ pkgs, config, ... }: {
|
|
||||||
languages.typescript.enable = true;
|
|
||||||
dotenv.disableHint = true;
|
|
||||||
packages = with pkgs; [
|
|
||||||
bun
|
|
||||||
eslint_d
|
|
||||||
];
|
|
||||||
env.DEVSHELL_NAME = " devenv/#fab387| Bun/yellow";
|
|
||||||
processes = {
|
|
||||||
server = {
|
|
||||||
ports.http.allocate = 5173;
|
|
||||||
exec = "bun run dev";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -107,6 +107,7 @@ export async function getAllRegisteredEventPlayers(eventId: number) {
|
|||||||
id: players.playerId,
|
id: players.playerId,
|
||||||
firstName: players.firstName,
|
firstName: players.firstName,
|
||||||
lastName: players.lastName,
|
lastName: players.lastName,
|
||||||
|
registeredPlayerId: players.registeredPlayerId,
|
||||||
placement: players.placement,
|
placement: players.placement,
|
||||||
bracket: players.bracket,
|
bracket: players.bracket,
|
||||||
eventId: players.eventId,
|
eventId: players.eventId,
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ export const registeredEventPlayersView = sqliteView('registeredEventPlayersView
|
|||||||
return qb
|
return qb
|
||||||
.select({
|
.select({
|
||||||
playerId: players.id,
|
playerId: players.id,
|
||||||
|
registeredPlayerId: registeredPlayers.id,
|
||||||
firstName: players.firstName,
|
firstName: players.firstName,
|
||||||
lastName: players.lastName,
|
lastName: players.lastName,
|
||||||
placement: registeredPlayers.placement,
|
placement: registeredPlayers.placement,
|
||||||
|
|||||||
@@ -177,7 +177,10 @@
|
|||||||
{:else if event.state == 2}
|
{:else if event.state == 2}
|
||||||
<span
|
<span
|
||||||
class="event-winner event-status goldman"
|
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}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ export async function POST({ request }: any) {
|
|||||||
return new Error();
|
return new Error();
|
||||||
}
|
}
|
||||||
let scoringPreset = eventData.events[0].scoringPreset;
|
let scoringPreset = eventData.events[0].scoringPreset;
|
||||||
console.log(scoringPreset);
|
|
||||||
|
|
||||||
// make a new main ledger entry
|
// make a new main ledger entry
|
||||||
let newLedgerEntry = await db
|
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 (let bracket in responseBody.brackets) {
|
||||||
|
// for every player
|
||||||
for (let player in responseBody.brackets[bracket].players) {
|
for (let player in responseBody.brackets[bracket].players) {
|
||||||
// variable fun
|
// variable fun
|
||||||
let currentPlayer = responseBody.brackets[bracket].players[player];
|
let currentPlayer = responseBody.brackets[bracket].players[player];
|
||||||
console.log(currentPlayer);
|
|
||||||
let currentPlayerTeam = currentPlayer.teamId;
|
let currentPlayerTeam = currentPlayer.teamId;
|
||||||
let currentPlayerPosition = currentPlayer.position;
|
let currentPlayerPosition = currentPlayer.position;
|
||||||
|
|
||||||
// If they put in a score
|
// If they put in a score / result
|
||||||
if (currentPlayerPosition > 0) {
|
if (currentPlayerPosition > 0) {
|
||||||
let score = getPoints(scoringPreset, currentPlayerPosition);
|
let score = getPoints(scoringPreset, currentPlayerPosition);
|
||||||
// If their score is in the preset and they put in a score
|
// If their score is in the preset and they put in a score
|
||||||
if (currentPlayer.scores.length > 0) {
|
if (currentPlayer.scores.length > 0) {
|
||||||
if (score > 0) {
|
if (score > 0) {
|
||||||
// put the scores on the board baby
|
// Accumulate points for this team instead of inserting right away
|
||||||
// THIS SHOULDNT BE REFERENCED THIS IS INTENDED
|
const currentTeamScore = teamScores.get(currentPlayerTeam) || 0;
|
||||||
let newScoreLedgerEntry = await db
|
teamScores.set(currentPlayerTeam, currentTeamScore + score);
|
||||||
.insert(schema.scoreLedger)
|
|
||||||
.values({ ledgerID: ledgerEntryId, teamID: currentPlayerTeam, points: score });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PLACEMENT LOGIC (Left untouched)
|
||||||
let newPlayerPlacement = await db
|
let newPlayerPlacement = await db
|
||||||
.update(schema.registeredPlayers)
|
.update(schema.registeredPlayers)
|
||||||
.set({ placement: currentPlayerPosition })
|
.set({ placement: currentPlayerPosition })
|
||||||
.where(eq(schema.registeredPlayers.playerID, currentPlayer.id))
|
.where(eq(schema.registeredPlayers.id, currentPlayer.registeredPlayerId))
|
||||||
.returning();
|
.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
|
// Update the frontends
|
||||||
globalEmitter.emit('scoreUpdate');
|
globalEmitter.emit('scoreUpdate');
|
||||||
// Return a resonse because
|
// Return a response because
|
||||||
return new Response('coolsies');
|
return new Response('coolsies');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,29 @@
|
|||||||
'Content-type': 'application/json; charset=UTF-8'
|
'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();
|
let eventDataPromise = getEventData();
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
return { destroy: () => ro.disconnect() };
|
return { destroy: () => ro.disconnect() };
|
||||||
}
|
}
|
||||||
|
|
||||||
let eventId = params.eventId;
|
let eventId = parseInt(params.eventId);
|
||||||
let eventEndpoint: EventSource;
|
let eventEndpoint: EventSource;
|
||||||
|
|
||||||
type Player = { firstName: string; lastName: string; teamColor: string; [key: string]: any };
|
type Player = { firstName: string; lastName: string; teamColor: string; [key: string]: any };
|
||||||
@@ -93,6 +93,19 @@
|
|||||||
...bracket,
|
...bracket,
|
||||||
items: sortByScore
|
items: sortByScore
|
||||||
? [...bracket.items].sort((a, b) => {
|
? [...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 fallback = lowerIsBetter ? Infinity : -Infinity;
|
||||||
const sa = useAverage
|
const sa = useAverage
|
||||||
? average(committedScores[a.id] ?? [], fallback)
|
? average(committedScores[a.id] ?? [], fallback)
|
||||||
@@ -100,6 +113,7 @@
|
|||||||
const sb = useAverage
|
const sb = useAverage
|
||||||
? average(committedScores[b.id] ?? [], fallback)
|
? average(committedScores[b.id] ?? [], fallback)
|
||||||
: best(committedScores[b.id] ?? [], fallback);
|
: best(committedScores[b.id] ?? [], fallback);
|
||||||
|
|
||||||
return lowerIsBetter ? sa - sb : sb - sa;
|
return lowerIsBetter ? sa - sb : sb - sa;
|
||||||
})
|
})
|
||||||
: bracket.items
|
: bracket.items
|
||||||
@@ -238,9 +252,9 @@
|
|||||||
<div class="flex justify-center">
|
<div class="flex justify-center">
|
||||||
<div class="w-full flex-col px-[2vw] text-center">
|
<div class="w-full flex-col px-[2vw] text-center">
|
||||||
<div
|
<div
|
||||||
style:background-color={event.state == 1
|
style:background-color={event.state === 1
|
||||||
? 'color-mix(in srgb, #fe640b 18%, transparent);'
|
? 'color-mix(in srgb, #fe640b 18%, transparent)'
|
||||||
: undefined}
|
: ''}
|
||||||
class="align-text-middle my-7 h-10 w-full rounded-2xl border-2 border-solid border-ctp-surface1"
|
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
|
{event.name} - {event.division} - scoring {#if event.state == 1}- ONGOING
|
||||||
@@ -323,6 +337,7 @@
|
|||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
placeholder="run {run + 1}"
|
placeholder="run {run + 1}"
|
||||||
|
class="text-black"
|
||||||
disabled={event.state != 1}
|
disabled={event.state != 1}
|
||||||
value={pendingScores[player.id]?.[run] ?? ''}
|
value={pendingScores[player.id]?.[run] ?? ''}
|
||||||
oninput={(e) => {
|
oninput={(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user