From 069f4203102d1ea6face3ae61eb62a2575e54abe Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 1 Jun 2022 10:21:29 +0800 Subject: [PATCH] core: contest: tsdoc.startAt --- packages/hydrooj/src/handler/contest.ts | 17 ++++++++--------- packages/hydrooj/src/handler/problem.ts | 2 +- packages/hydrooj/src/interface.ts | 5 +++++ packages/hydrooj/src/model/contest.ts | 12 +++++++----- .../ui-default/templates/contest_detail.html | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 24357f073..104aa2ae7 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -108,18 +108,18 @@ export class ContestDetailHandler extends Handler { const psdict = {}; let rdict = {}; if (tsdoc) { + if (tsdoc.attend && !tsdoc.startAt) { + await contest.setStatus(domainId, tid, this.user._id, { startAt: new Date() }); + tsdoc.startAt = new Date(); + } for (const pdetail of tsdoc.journal || []) psdict[pdetail.pid] = pdetail; if (contest.canShowSelfRecord.call(this, tdoc)) { - const q = []; - for (const i in psdict) q.push(psdict[i].rid); - rdict = await record.getList(domainId, q); + rdict = await record.getList(domainId, Object.values(psdict).map((i: any) => i.rid)); } else { for (const i in psdict) rdict[psdict[i].rid] = { _id: psdict[i].rid }; } } - this.response.body.pdict = pdict; - this.response.body.psdict = psdict; - this.response.body.rdict = rdict; + Object.assign(this.response.body, { pdict, psdict, rdict }); } @param('tid', Types.ObjectID) @@ -238,7 +238,7 @@ export class ContestEditHandler extends Handler { this.response.template = 'contest_edit.html'; const rules = {}; for (const i in contest.RULES) rules[i] = contest.RULES[i].TEXT; - let ts = new Date().getTime(); + let ts = Date.now(); ts = ts - (ts % (15 * Time.minute)) + 15 * Time.minute; const dt = this.tdoc?.beginAt || new Date(ts); this.response.body = { @@ -246,8 +246,7 @@ export class ContestEditHandler extends Handler { tdoc: this.tdoc, duration: tid ? (this.tdoc.endAt.getTime() - this.tdoc.beginAt.getTime()) / Time.hour : 2, pids: tid ? this.tdoc.pids.join(',') : '', - date_text: dt.format('%Y-%m-%d'), - time_text: dt.format('%H:%M'), + startAt: dt, page_name: tid ? 'contest_edit' : 'contest_create', }; } diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 00760623b..778bd998f 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -316,7 +316,7 @@ export class ProblemDetailHandler extends ProblemHandler { if (!this.tdoc) throw new ContestNotFoundError(domainId, tid); this.tsdoc = await contest.getStatus(domainId, tid, this.user._id); if (contest.isNotStarted(this.tdoc)) throw new ContestNotLiveError(tid); - if (!contest.isDone(this.tdoc) && !this.tsdoc?.attend) throw new ContestNotAttendedError(tid); + if (!contest.isDone(this.tdoc, this.tsdoc) && (!this.tsdoc?.attend || !this.tsdoc.startAt)) throw new ContestNotAttendedError(tid); this.pdoc.tag.length = 0; if (!contest.canShowScoreboard.call(this, this.tdoc) || !contest.isLocked(this.tdoc)) { delete this.pdoc.nAccept; diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 4f5730db1..c8e29de2b 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -341,6 +341,11 @@ export interface Tdoc readyAt - days * 24 * 3600 * 1000 && now < tdoc.beginAt.getTime()); + return (now > readyAt - days * Time.day && now < tdoc.beginAt.getTime()); } export function isNotStarted(tdoc: Tdoc) { @@ -560,8 +560,10 @@ export function isOngoing(tdoc: Tdoc) { return (tdoc.beginAt <= now && now < tdoc.endAt); } -export function isDone(tdoc: Tdoc) { - return tdoc.endAt <= new Date(); +export function isDone(tdoc: Tdoc, tsdoc?: any) { + if (tdoc.endAt <= new Date()) return true; + if (tsdoc?.startAt <= new Date(Date.now() + tdoc.duration * Time.hour)) return true; + return false; } export function isLocked(tdoc: Tdoc) { diff --git a/packages/ui-default/templates/contest_detail.html b/packages/ui-default/templates/contest_detail.html index 64b521654..fafb2d744 100644 --- a/packages/ui-default/templates/contest_detail.html +++ b/packages/ui-default/templates/contest_detail.html @@ -32,7 +32,7 @@ {% endif %} - {% if model.contest.isOngoing(tdoc) or model.contest.isDone(tdoc) %} + {% if model.contest.isOngoing(tdoc) or model.contest.isDone(tdoc, tsdoc) %}

{{ _('Problem') }}