X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fhelpers%2FTournament.js;h=792b593091b70ba62a24414325420e8645100786;hb=d1f28ea443b090c7593791eba9631796ccaeafe1;hp=6b4ca28fb93c2c185ec096ed4579707a93f52ead;hpb=a907ef7c6676fef11f42933b2d79bdd496b20122;p=alttp.git diff --git a/resources/js/helpers/Tournament.js b/resources/js/helpers/Tournament.js index 6b4ca28..792b593 100644 --- a/resources/js/helpers/Tournament.js +++ b/resources/js/helpers/Tournament.js @@ -1,12 +1,74 @@ import Participant from './Participant'; import Round from './Round'; +export const calculateScores = tournament => { + const scores = getRunners(tournament).map(participant => ({ participant, score: 0 })); + if (!tournament.rounds || !tournament.rounds.length) return scores; + tournament.rounds.forEach(round => { + const filtered = Participant + .sortByResult(tournament.participants, round) + .map(p => ({ participant: p, result: Participant.findResult(p, round) })) + .filter(r => r.result && (r.result.time || r.result.forfeit)) + .reverse(); + let running = 0; + let bonus = 1; + let lastResult = null; + for (let i = 0; i < filtered.length; ++i) { + const score = scores.find(s => s.participant.id === filtered[i].participant.id); + if (!score) return; + const result = filtered[i].result; + const betterThanLast = lastResult === null || result.time < lastResult; + if (!result.forfeit && betterThanLast) { + running += bonus; + lastResult = result.time; + bonus = 1; + } else { + ++bonus; + } + if (!result.forfeit) { + score.score += running; + } + } + }); + return scores.sort(compareScore).reverse(); +}; + +export const compareScore = (a, b) => { + const a_score = a && a.score ? a.score : 0; + const b_score = b && b.score ? b.score : 0; + if (a_score < b_score) return -1; + if (b_score < a_score) return 1; + return Participant.compareUsername(a.participant, b.participant) * -1; +}; + export const findParticipant = (tournament, user) => { if (!tournament || !tournament.participants || !tournament.participants.length) return null; if (!user || !user.id) return null; return tournament.participants.find(p => p.user_id == user.id); }; +export const getRunners = tournament => { + if (!tournament || !tournament.participants || !tournament.participants.length) return []; + return tournament.participants + .filter(Participant.isRunner) + .sort(Participant.compareUsername); +}; + +export const getTournamentAdmins = tournament => { + if (!tournament || !tournament.participants || !tournament.participants.length) return []; + return tournament.participants + .filter(Participant.isTournamentAdmin) + .sort(Participant.compareUsername); +}; + +export const hasRunners = tournament => { + return getRunners(tournament).length > 0; +}; + +export const hasTournamentAdmins = tournament => { + return getTournamentAdmins(tournament).length > 0; +}; + export const patchResult = (tournament, result) => { if (!tournament || !tournament.rounds) return tournament; return { @@ -23,7 +85,16 @@ export const patchRound = (tournament, round) => { if (!tournament) return tournament; return { ...tournament, - rounds: tournament.rounds.map(r => r.id === round.id ? round : r), + rounds: tournament.rounds.map(r => r.id === round.id ? { ...r, ...round } : r), + }; +}; + +export const patchUser = (tournament, user) => { + if (!tournament || !tournament.participants || !user) return tournament; + if (!tournament.participants.find(p => p.user_id == user.id)) return tournament; + return { + ...tournament, + participants: tournament.participants.map(p => Participant.patchUser(p, user)), }; }; @@ -38,7 +109,13 @@ export const sortParticipants = tournament => { }; export default { + calculateScores, + compareScore, findParticipant, + getRunners, + getTournamentAdmins, patchResult, + patchRound, + patchUser, sortParticipants, };