diff --git a/packages/vjudge/package.json b/packages/vjudge/package.json index eefdca840..008233946 100644 --- a/packages/vjudge/package.json +++ b/packages/vjudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/vjudge", - "version": "1.0.8", + "version": "1.0.9", "description": "Submit problems to remote oj", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/vjudge/src/providers/codeforces.ts b/packages/vjudge/src/providers/codeforces.ts index 896959015..fce72ec54 100644 --- a/packages/vjudge/src/providers/codeforces.ts +++ b/packages/vjudge/src/providers/codeforces.ts @@ -97,13 +97,29 @@ export default class CodeforcesProvider implements IBasicProvider { return false; } + async getPdfProblem(id: string) { + const [, contestId, problemId] = id.startsWith('P921') + ? ['', '921', '01'] + : /^P(\d+)([A-Z][0-9]?)$/.exec(id); + const file = new PassThrough(); + this.get(`/problemset/problem/${contestId}/${problemId}`).pipe(file); + return { + title: '__NO_TITLE__', + data: { 'config.yaml': Buffer.from(`type: remote_judge\nsubType: codeforces\ntarget: ${id}`) }, + files: { 'problem.pdf': file }, + tag: [], + content: '@[pdf](file://problem.pdf)', + }; + } + async getProblem(id: string) { logger.info(id); + if (id === 'P936E') return null; // Problem Missing const [, contestId, problemId] = id.startsWith('P921') ? ['', '921', '01'] : /^P(\d+)([A-Z][0-9]?)$/.exec(id); const res = await this.get(`/problemset/problem/${contestId}/${problemId}`); - if (!res.text) return null; + if (!res.text) return await this.getPdfProblem(id); const $dom = new JSDOM(res.text.replace(/\$\$\$/g, '$')); const tag = Array.from($dom.window.document.querySelectorAll('.tag-box')).map((i) => i.textContent.trim()); const text = $dom.window.document.querySelector('.problem-statement').innerHTML;