From 24b606a95f15a533c7114cc60fe939e0c47d1422 Mon Sep 17 00:00:00 2001 From: panda Date: Sat, 23 Nov 2024 05:25:12 +0800 Subject: [PATCH] onsite-toolkit: support export cdp package (#906) Co-authored-by: Heartfirey Co-authored-by: cubercsl <2014cais01@gmail.com> --- packages/onsite-toolkit/index.ts | 192 +++++++++++++++++++++++- packages/onsite-toolkit/public/logo.png | Bin 0 -> 38109 bytes 2 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 packages/onsite-toolkit/public/logo.png diff --git a/packages/onsite-toolkit/index.ts b/packages/onsite-toolkit/index.ts index c781f1728..1e4edfda9 100644 --- a/packages/onsite-toolkit/index.ts +++ b/packages/onsite-toolkit/index.ts @@ -1,6 +1,9 @@ +/* eslint-disable max-len */ +import moment from 'moment'; import { - avatar, ContestModel, Context, db, ForbiddenError, - ObjectId, PERM, STATUS, Time, UserModel, + AdmZip, avatar, ContestModel, ContestNotEndedError, Context, db, findFileSync, ForbiddenError, + fs, + ObjectId, parseTimeMS, PERM, ProblemConfig, ProblemModel, STATUS, STATUS_SHORT_TEXTS, STATUS_TEXTS, Time, UserModel, } from 'hydrooj'; import { ResolverInput } from './interface'; @@ -75,5 +78,190 @@ export function apply(ctx: Context) { }, supportedRules: ['acm'], }); + + scoreboard.addView('cdp', 'CDP', { tdoc: 'tdoc' }, { + async display({ tdoc }) { + if (ContestModel.isLocked(tdoc) && !this.user.own(tdoc)) { + this.checkPerm(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD); + } + if (!ContestModel.isDone(tdoc)) throw new ContestNotEndedError(); + let token = 0; + const getFeed = (type: string, data: any) => ({ + type, id: data.id, data, token: `t${token++}`, + }); + const [pdict, tsdocs] = await Promise.all([ + ProblemModel.getList(tdoc.domainId, tdoc.pids, true, false, ProblemModel.PROJECTION_LIST, true), + ContestModel.getMultiStatus(tdoc.domainId, { docId: tdoc._id }).toArray(), + ]); + const udict = await UserModel.getList(tdoc.domainId, tsdocs.map((i) => i.uid)); + const teams = tsdocs.map((i) => { + const udoc = udict[i.uid]; + return { + team_id: `team-${udoc._id}`, + name: udoc.uname, + displayName: udoc.displayName, + organization: udoc.school || udoc.uname, + avatar: avatar(udoc.avatar), + group: [ + ...(udoc.group.filter((g) => g !== `${udoc._id}`)), + i.unrank ? 'observers' : 'participants', + ], + }; + }); + const relatedGroups = Array.from(new Set(teams.flatMap((i) => i.group))); + const groupId = {}; + let gid = 1; + for (const i of relatedGroups) groupId[i] = `group-${gid++}`; + const organizations = teams.flatMap((i) => i.organization); + const orgId = {}; + let oid = 1; + for (const i of organizations) orgId[i] = `org-${oid++}`; + const duration = moment(tdoc.endAt).diff(tdoc.beginAt, 'seconds'); + const lockDuration = tdoc.lockAt ? moment(tdoc.lockAt).diff(tdoc.beginAt, 'seconds') : null; + const eventfeed: Record[] = [ + getFeed('contest', { + id: tdoc._id.toHexString(), + name: tdoc.title, + formal_name: tdoc.title, + start_time: moment(tdoc.beginAt).format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + // 1:00:00.000 + duration: moment().startOf('day').seconds(duration).format('HH:mm:ss.SSS'), + ...lockDuration && { + scoreboard_freeze_duration: moment().startOf('day').seconds(lockDuration).format('HH:mm:ss.SSS'), + }, + penalty_time: 20, + }), + ...Object.keys(STATUS_SHORT_TEXTS).map((i) => getFeed('judgement-types', { + id: STATUS_SHORT_TEXTS[i], + name: STATUS_TEXTS[i], + penalty: ![STATUS.STATUS_ACCEPTED, STATUS.STATUS_COMPILE_ERROR, STATUS.STATUS_SYSTEM_ERROR].includes(+i), + solved: +i === STATUS.STATUS_ACCEPTED, + })), + getFeed('languages', { + id: 'c', name: 'C', 'entry_point_required': false, extensions: ['c'], + }), + getFeed('languages', { + id: 'cpp', name: 'C++', 'entry_point_required': false, extensions: ['cpp', 'cc', 'cxx', 'c++'], + }), + getFeed('languages', { + id: 'java', name: 'Java', 'entry_point_required': true, extensions: ['java'], + }), + getFeed('languages', { + id: 'python3', name: 'Python 3', 'entry_point_required': false, 'entry_point_name': 'Main file', extensions: ['py', 'py3'], + }), + getFeed('languages', { + id: 'kotlin', name: 'Kotlin', 'entry_point_required': true, extensions: ['kt'], + }), + getFeed('languages', { + id: 'rust', name: 'Rust', 'entry_point_required': true, extensions: ['rs'], + }), + getFeed('languages', { + id: 'go', name: 'Go', 'entry_point_required': true, extensions: ['go'], + }), + getFeed('groups', { id: 'participants', name: '正式队伍' }), + getFeed('groups', { id: 'observers', name: '打星队伍' }), + ...relatedGroups.map((i) => getFeed('groups', { + id: groupId[i], + name: i, + })), + ...organizations.map((i) => getFeed('organizations', { + id: orgId[i], + name: i, + formal_name: i, + logo: [{ + href: `contest/${tdoc._id}/organizations/${orgId[i]}/logo`, + filename: 'logo.png', + mime: 'image/png', + width: 64, + height: 64, + }], + })), + ...teams.map((i) => getFeed('teams', { + id: i.team_id, + label: i.team_id, + name: i.name, + display_name: i.displayName || i.name, + group_ids: i.group.map((j) => groupId[j]), + organization_id: orgId[i.organization], + photo: [{ + href: `contest/${tdoc._id}/teams/${i.team_id}/photo`, + filename: 'photo.png', + mime: 'image/png', + width: 1920, + height: 1080, + }], + })), + ...tdoc.pids.map((i, idx) => getFeed('problems', { + id: `${i}`, + label: String.fromCharCode(65 + idx), + name: pdict[i].title, + ordinal: idx, + color: (typeof (tdoc.balloon?.[idx]) === 'object' ? tdoc.balloon[idx].name : tdoc.balloon?.[idx]) || 'white', + rgb: (typeof (tdoc.balloon?.[idx]) === 'object' ? tdoc.balloon[idx].color : null) || '#ffffff', + time_limit: (parseTimeMS((pdict[i].config as ProblemConfig).timeMax) / 1000).toFixed(1), + test_data_count: 20, + })), + ]; + let cntJudge = 0; + const submissions = tsdocs.flatMap((i) => { + if (!i.journal) return []; + const journal = i.journal.filter((s) => tdoc.pids.includes(s.pid)); + const result: any[] = []; + for (const s of journal) { + const submitTime = moment(s.rid.getTimestamp()); + const submitDelta = submitTime.diff(tdoc.beginAt, 'seconds'); + const submitAt = moment().startOf('day').seconds(submitDelta).format('HH:mm:ss.SSS'); + const judgeTime = submitTime.add(1, 'seconds'); + const judgeDelta = judgeTime.diff(tdoc.beginAt, 'seconds'); + const judgeAt = moment().startOf('day').seconds(judgeDelta).format('HH:mm:ss.SSS'); + result.push(getFeed('submissions', { + id: s.rid, + team_id: `team-${i.uid}`, + problem_id: `${s.pid}`, + language_id: s.lang?.split('.')[0] || 'cpp', + files: [], + contest_time: submitAt, + time: submitTime.format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + })); + result.push(getFeed('judgements', { + id: `${cntJudge}`, + submission_id: s.rid, + judgement_type_id: STATUS_SHORT_TEXTS[s.status], + max_run_time: 0.1, + start_contest_time: submitAt, + end_contest_time: judgeAt, + start_time: submitTime.format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + end_time: judgeTime.format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + })); + cntJudge++; + } + return result; + }); + const endState = [ + getFeed('state', { + started: moment(tdoc.beginAt).format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + ended: moment(tdoc.endAt).format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + ...tdoc.lockAt && { + frozen: moment(tdoc.lockAt).format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + }, + finalized: moment().format('YYYY-MM-DDTHH:mm:ss.SSS+08:00'), + }), + ]; + const zip = new AdmZip(); + zip.addFile('event-feed.ndjson', Buffer.from(eventfeed.concat(submissions).concat(endState).map((i) => JSON.stringify(i)).join('\n'))); + zip.addFile('contest/logo.png', fs.readFileSync(findFileSync('@hydrooj/onsite-toolkit/public/logo.png'))); + for (const i of ['teams', 'organizations']) { + zip.addFile(`${i}/`, Buffer.alloc(0)); + } + for (const i of teams) { + zip.addFile(`teams/${i.team_id}/photo.download.txt`, Buffer.from(i.avatar)); + } + for (const i of organizations) { + zip.addFile(`organizations/${orgId[i]}/photo.download.txt`, Buffer.from(avatar(teams.find((j) => j.organization === i)?.avatar || 'no photo, find and download it yourself'))); + } + this.binary(zip.toBuffer(), `contest-${tdoc._id}-cdp.zip`); + }, + supportedRules: ['acm'], + }); }); } diff --git a/packages/onsite-toolkit/public/logo.png b/packages/onsite-toolkit/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0a2b4e628ebd25f5b969a013da733c3a6cd305 GIT binary patch literal 38109 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 literal 0 HcmV?d00001