diff --git a/packages/hydrojudge/src/testlib.ts b/packages/hydrojudge/src/testlib.ts index de824998..07a90bed 100644 --- a/packages/hydrojudge/src/testlib.ts +++ b/packages/hydrojudge/src/testlib.ts @@ -6,7 +6,7 @@ export function parse(output: string, fullscore: number) { let status = STATUS.STATUS_WRONG_ANSWER; let score = 0; let builder = (msg: string) => msg; - let message = output.substring(0, 1024); + let message = `${output.substring(0, 1024)} `; if (output.startsWith('ok ')) { status = STATUS.STATUS_ACCEPTED; score = fullscore; diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 6893b8cc..7893a45c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "4.2.14", + "version": "4.2.15", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 075daa32..e20b9f3b 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -22,7 +22,8 @@ const validatePenaltyRules = (input: string) => yaml.load(input); const convertPenaltyRules = validatePenaltyRules; class HomeworkMainHandler extends Handler { - async get({ domainId, page = 1 }) { + @param('page', Types.PositiveInt, true) + async get(domainId: string, page = 1) { const cursor = contest.getMulti(domainId, { rule: 'homework' }); const [tdocs, tpcount] = await paginate(cursor, page, system.get('pagination.contest')); const calendar = []; diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 2f12dd5c..7a05e1a4 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -181,13 +181,12 @@ const acm = buildContestRule({ docType: document.TYPE_CONTEST, docId: tdoc.docId, accept: { $gte: 1 }, - detail: { $elemMatch: { status: STATUS.STATUS_ACCEPTED } }, }, }, - { $unwind: '$detail' }, - { $match: { 'detail.status': STATUS.STATUS_ACCEPTED } }, - { $sort: { 'detail.rid': 1 } }, - { $group: { _id: '$detail.pid', first: { $first: '$detail.rid' } } }, + { $project: { r: { $objectToArray: '$detail' } } }, + { $unwind: '$r' }, + { $match: { 'r.v.status': STATUS.STATUS_ACCEPTED } }, + { $group: { _id: '$r.v.pid', first: { $min: '$r.v.rid' } } }, ]).toArray() as any[]; for (const t of data) first[t._id] = t.first.generationTime; diff --git a/packages/ui-default/backendlib/misc.ts b/packages/ui-default/backendlib/misc.ts index 5f345f65..cdf6a46c 100644 --- a/packages/ui-default/backendlib/misc.ts +++ b/packages/ui-default/backendlib/misc.ts @@ -13,7 +13,7 @@ export function ansiToHtml(str: string, whiteToBlack = true) { export function datetimeSpan(dt: Date | ObjectID, relative = true, format = 'YYYY-M-D H:mm:ss', tz = 'Asia/Shanghai') { if (!dt) return 'DATETIME_SPAN_ERROR'; - if (dt instanceof ObjectID) dt = new Date(dt.generationTime * 1000); + if (dt instanceof ObjectID) dt = dt.getTimestamp(); else if (typeof dt === 'string' && ObjectID.isValid(dt)) dt = new Date(new ObjectID(dt).generationTime * 1000); else if (typeof dt === 'number' || typeof dt === 'string') dt = new Date(dt); return '{2}'.format( diff --git a/packages/ui-default/components/monaco/languages/yaml.ts b/packages/ui-default/components/monaco/languages/yaml.ts index 46d7bfc3..fe9faede 100644 --- a/packages/ui-default/components/monaco/languages/yaml.ts +++ b/packages/ui-default/components/monaco/languages/yaml.ts @@ -99,7 +99,7 @@ setDiagnosticsOptions({ schema: problemConfigSchema as any, }, { - uri: '/manage/config/schema.json', + uri: new URL('/manage/config/schema.json', window.location.href).toString(), fileMatch: ['hydro://system/setting.yaml'], }, ],