diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 28994f72e..0ec0fb4c3 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.11.13", + "version": "3.11.14", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 93f728533..59078a906 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -32,9 +32,10 @@ interface AcmDetail extends AcmJournal { } function buildContestRule(def: ContestRule): ContestRule { - def._originalRule = { scoreboard: def.scoreboard, stat: def.stat }; + const _originalRule = { scoreboard: def.scoreboard, stat: def.stat }; def.scoreboard = (def._originalRule?.scoreboard || def.scoreboard).bind(def); def.stat = (def._originalRule?.stat || def.stat).bind(def); + def._originalRule = _originalRule; return def; } @@ -189,7 +190,7 @@ const oi = buildContestRule({ const detail = {}; let score = 0; for (const j of journal.filter((i) => tdoc.pids.includes(i.pid))) { - if (detail[j.pid]?.status !== STATUS.STATUS_ACCEPTED || this.submitAfterAccept) detail[j.pid] = j; + if ((detail[j.pid]?.score || 0) < j.score || this.submitAfterAccept) detail[j.pid] = j; } for (const i in detail) score += detail[i].score; return { score, detail }; @@ -246,8 +247,8 @@ const oi = buildContestRule({ const rows: ScoreboardNode[][] = [columns]; for (const [rank, tsdoc] of rankedTsdocs) { const tsddict = {}; - if (tsdoc.journal) { - for (const item of tsdoc.journal) tsddict[item.pid] = item; + for (const item of tsdoc.journal || []) { + if ((tsddict[item.pid]?.score || 0) < item.score || this.submitAfterAccept) tsddict[item.pid] = item; } const row: ScoreboardNode[] = [ { type: 'string', value: rank.toString() }, @@ -387,7 +388,7 @@ const homework = buildContestRule({ for (const [rank, tsdoc] of rankedTsdocs) { const tsddict = {}; for (const item of tsdoc.detail || []) { - tsddict[item.pid] = item; + if ((tsddict[item.pid].score || 0) <= item.score) tsddict[item.pid] = item; } const row: ScoreboardRow = [ { type: 'string', value: rank },