From fc1f703e21375fef23ad94ce04abc7130310df1a Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 18 Oct 2022 17:05:23 +0800 Subject: [PATCH] core: add contest/scoreboard hook --- packages/hydrooj/src/model/contest.ts | 5 +++-- packages/hydrooj/src/service/bus.ts | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 77a0f7afc..ed2b3196b 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -500,7 +500,7 @@ function _getStatusJournal(tsdoc) { export async function add( domainId: string, title: string, content: string, owner: number, rule: string, beginAt = new Date(), endAt = new Date(), pids: number[] = [], - rated = false, data: Partial = {}, + rated = false, data: Partial> = {}, ) { if (!RULES[rule]) throw new ValidationError('rule'); if (beginAt >= endAt) throw new ValidationError('beginAt', 'endAt'); @@ -698,7 +698,7 @@ export function canShowScoreboard(tdoc: Tdoc<30>, allowPermOverride = true) { export async function getScoreboard( this: Handler, domainId: string, tid: ObjectID, isExport = false, ignoreLock = false, -): Promise<[Tdoc<30 | 60>, ScoreboardRow[], Udict, ProblemDict]> { +): Promise<[Tdoc<30>, ScoreboardRow[], Udict, ProblemDict]> { const tdoc = await get(domainId, tid); if (!canShowScoreboard.call(this, tdoc)) throw new ContestScoreboardHiddenError(tid); if (ignoreLock) delete tdoc.lockAt; @@ -708,6 +708,7 @@ export async function getScoreboard( isExport, this.translate.bind(this), tdoc, pdict, tsdocsCursor, ); + await bus.parallel('contest/scoreboard', tdoc, rows, udict, pdict); return [tdoc, rows, udict, pdict]; } diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index 9194c7be4..d4e1224c3 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -7,8 +7,8 @@ import type { ProblemSolutionHandler } from '../handler/problem'; import type { UserRegisterHandler } from '../handler/user'; import type { DiscussionDoc, DomainDoc, FileInfo, - MessageDoc, ProblemDoc, RecordDoc, - Tdoc, TrainingDoc, User, + MessageDoc, ProblemDict, ProblemDoc, RecordDoc, + ScoreboardRow, Tdoc, TrainingDoc, Udict, User, } from '../interface'; import type { DocType } from '../model/document'; import type { ConnectionHandler, Handler } from './server'; @@ -86,8 +86,9 @@ export interface EventMap extends LifecycleEvents, HandlerEvents { 'problem/addAdditionalFile': (domainId: string, docId: number, name: string, payload: Omit) => VoidReturn 'problem/delAdditionalFile': (domainId: string, docId: number, name: string[]) => VoidReturn - 'contest/before-add': (payload: Partial) => VoidReturn - 'contest/add': (payload: Partial, id: ObjectID) => VoidReturn + 'contest/before-add': (payload: Partial>) => VoidReturn + 'contest/add': (payload: Partial>, id: ObjectID) => VoidReturn + 'contest/scoreboard': (tdoc: Tdoc<30>, rows: ScoreboardRow[], udict: Udict, pdict: ProblemDict) => VoidReturn 'oplog/log': (type: string, handler: Handler, args: any, data: any) => VoidReturn;