From 1b1faa9ff9671bf121ab3c3483276907dbfc003d Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 10 May 2023 20:20:12 +0800 Subject: [PATCH] core: langs: add validAs option --- packages/hydrooj/src/handler/problem.ts | 3 +-- packages/hydrooj/src/model/record.ts | 36 ++++++++----------------- packages/utils/lib/lang.ts | 4 +++ packages/vjudge/src/model.ts | 4 ++- 4 files changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index b47f00c8..c94ec990 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -340,7 +340,7 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { let baseLangs; if (this.pdoc.config.type === 'remote_judge') { const p = this.pdoc.config.subType; - const dl = [p, ...Object.keys(setting.langs).filter((i) => i.startsWith(`${p}.`))]; + const dl = [p, ...Object.keys(setting.langs).filter((i) => i.startsWith(`${p}.`) || setting.langs[i].validAs[p])]; baseLangs = dl; } else { baseLangs = Object.keys(setting.langs).filter((i) => !setting.langs[i].remote); @@ -512,7 +512,6 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { } if (pretest) { if (setting.langs[lang]?.pretest) lang = setting.langs[lang].pretest as string; - if (setting.langs[lang]?.pretest === false) throw new ProblemNotAllowPretestError('language'); if (!['default', 'fileio', 'remote_judge'].includes(this.response.body.pdoc.config?.type)) { throw new ProblemNotAllowPretestError('type'); } diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index eb39ffea..41ba29a4 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -68,41 +68,27 @@ export default class RecordModel { if (!rids.length) return null; const rdoc = await RecordModel.get(domainId, rids[0]); if (!rdoc) return null; - let data: FileInfo[] = []; let source = `${domainId}/${rdoc.pid}`; - meta = { ...meta, problemOwner: 1 }; await task.deleteMany({ rid: { $in: rids } }); - if (rdoc.pid) { - let pdoc = await problem.get(rdoc.domainId, rdoc.pid); + let pdoc = await problem.get(rdoc.domainId, rdoc.pid); + if (!pdoc) throw new ProblemNotFoundError(rdoc.domainId, rdoc.pid); + if (pdoc.reference) { + pdoc = await problem.get(pdoc.reference.domainId, pdoc.reference.pid); if (!pdoc) throw new ProblemNotFoundError(rdoc.domainId, rdoc.pid); - if (pdoc.reference) { - pdoc = await problem.get(pdoc.reference.domainId, pdoc.reference.pid); - if (!pdoc) throw new ProblemNotFoundError(rdoc.domainId, rdoc.pid); - } - meta.problemOwner = pdoc.owner; source = `${pdoc.domainId}/${pdoc.docId}`; - data = pdoc.data; - if (typeof pdoc.config === 'string') throw new Error(pdoc.config); - config.type = pdoc.config.type === 'fileio' ? 'default' : pdoc.config.type as any; - if (pdoc.config.type === 'remote_judge' && rdoc.contest?.toHexString() !== '0'.repeat(24)) { - return await task.addMany(rids.map((rid) => ({ - ...(pdoc.config as any), - priority, - type: 'remotejudge', - rid, - domainId, - config, - data, - } as any))); - } } + meta = { ...meta, problemOwner: pdoc.owner }; + if (typeof pdoc.config === 'string') throw new Error(pdoc.config); + const type = (pdoc.config.type === 'remote_judge' && rdoc.contest?.toHexString() !== '0'.repeat(24)) ? 'remotejudge' : 'judge'; + config.type = pdoc.config.type === 'fileio' ? 'default' : pdoc.config.type as any; return await task.addMany(rids.map((rid) => ({ + ...(pdoc.config as any), priority, - type: 'judge', + type, rid, domainId, config, - data, + data: pdoc.data, source, meta, } as any))); diff --git a/packages/utils/lib/lang.ts b/packages/utils/lib/lang.ts index 77ed73e4..f41423e8 100644 --- a/packages/utils/lib/lang.ts +++ b/packages/utils/lib/lang.ts @@ -15,7 +15,10 @@ export interface LangConfig { key: string; hidden: boolean; analysis?: string; + /** @deprecated */ remote?: string; + validAs?: Record; + /** @deprecated */ pretest?: string | false; comment?: string | [string, string]; compile_time_limit?: number; @@ -47,6 +50,7 @@ export function parseLang(config: string): Record { entry.key = key; entry.hidden ||= false; entry.disabled ||= false; + entry.validAs ||= {}; } return file; } diff --git a/packages/vjudge/src/model.ts b/packages/vjudge/src/model.ts index 94d678e9..acd6badd 100644 --- a/packages/vjudge/src/model.ts +++ b/packages/vjudge/src/model.ts @@ -42,7 +42,9 @@ class AccountService { const end = (payload) => JudgeHandler.end({ ...payload, rid: task.rid }); await next({ status: STATUS.STATUS_FETCHED }); try { - const comment = SettingModel.langs[task.lang].comment; + const langConfig = SettingModel.langs[task.lang]; + if (langConfig.validAs?.[this.account.type]) task.lang = langConfig.validAs[this.account.type]; + const comment = langConfig.comment; if (comment) { const msg = `Hydro submission #${task.rid}@${new Date().getTime()}`; if (typeof comment === 'string') task.code = `${comment} ${msg}\n${task.code}`;