From 7343c596e95cd7f83173dc45674f99dd285d3b08 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 7 Sep 2022 20:30:44 +0800 Subject: [PATCH] core&ui: optimize injectable --- packages/hydrooj/package.json | 4 +- packages/hydrooj/src/handler/judge.ts | 2 +- packages/hydrooj/src/handler/problem.ts | 7 +- packages/hydrooj/src/init.ts | 2 +- packages/hydrooj/src/interface.ts | 10 +-- packages/hydrooj/src/lib/ui.ts | 85 +++++++++---------- packages/ui-default/package.json | 2 +- .../ui-default/templates/partials/nav.html | 10 +-- .../ui-default/templates/problem_main.html | 6 +- 9 files changed, 64 insertions(+), 64 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 998fc558d..0d33a55b6 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.17.2", + "version": "3.17.3", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", @@ -8,7 +8,7 @@ "author": "undefined ", "license": "AGPL-3.0-or-later", "engines": { - "node": ">=10.4" + "node": ">=12" }, "preferUnplugged": true, "dependencies": { diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index 330865532..c3860a50b 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -131,7 +131,7 @@ export async function end(body: Partial) { $push.compilerTexts = body.compilerText; } if (body.status) $set.status = body.status; - if (Number.isSafeInteger(body.score)) $set.score = body.score; + if (Number.isFinite(body.score)) $set.score = Math.floor(body.score * 100) / 100; if (Number.isFinite(body.time)) $set.time = body.time; if (Number.isFinite(body.memory)) $set.memory = body.memory; $set.judgeAt = new Date(); diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index b27eef462..6afff9bfc 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -396,11 +396,16 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { .replace(/="file:\/\/(.+?)"/g, (str) => { const info = str.match(/="file:\/\/(.+?)"/); return `="./${this.pdoc.docId}/file/${info[1]}${info[1].includes('?') ? '&' : '?'}tid=${args[1]}"`; + }) + .replace(/=\\"file:\/\/(.+?)"/g, (str) => { + const info = str.match(/=\\"file:\/\/(.+?)"/); + return `=\\"./${this.pdoc.docId}/file/${info[1]}${info[1].includes('?') ? '&' : '?'}tid=${args[1]}"`; }); } else { this.response.body.pdoc.content = this.response.body.pdoc.content .replace(/\(file:\/\//g, `(./${this.pdoc.docId}/file/`) - .replace(/="file:\/\//g, `="./${this.pdoc.docId}/file/`); + .replace(/="file:\/\//g, `="./${this.pdoc.docId}/file/`) + .replace(/=\\"file:\/\//g, `=\\"${this.pdoc.docId}/file/`); } } this.response.body.page_name = this.tdoc diff --git a/packages/hydrooj/src/init.ts b/packages/hydrooj/src/init.ts index daa617739..268bdaaaa 100644 --- a/packages/hydrooj/src/init.ts +++ b/packages/hydrooj/src/init.ts @@ -1,5 +1,5 @@ const versionNum = +process.version.replace(/v/gim, '').split('.')[0]; -if (versionNum < 10) throw new Error('NodeJS >=10.4 required'); +if (versionNum < 12) throw new Error('NodeJS >=12 required'); else if (versionNum < 14 && process.env.NODE_APP_INSTANCE === '0') { console.warn('NodeJS version <14, startup performance will be impacted.'); } diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 868d13133..dc2fde7f5 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -694,17 +694,15 @@ export interface Lib extends Record { problemSearch: ProblemSearch; } +export type UIInjectableFields = 'ProblemAdd' | 'Nav' | 'UserDropdown'; export interface UI { manifest: Dictionary, template: Dictionary, - nodes: { - nav: any[], - problem_add: any[], - user_dropdown: any[], - }, + nodes: Record, + getNodes: typeof import('./lib/ui').getNodes, Nav: typeof import('./lib/ui').Nav, ProblemAdd: typeof import('./lib/ui').ProblemAdd, - UserDropdown: typeof import('./lib/ui').UserDropdown, + inject: typeof import('./lib/ui').inject, } export interface HydroGlobal { diff --git a/packages/hydrooj/src/lib/ui.ts b/packages/hydrooj/src/lib/ui.ts index f1c8b6872..30cd4f72f 100644 --- a/packages/hydrooj/src/lib/ui.ts +++ b/packages/hydrooj/src/lib/ui.ts @@ -1,3 +1,4 @@ +import { UIInjectableFields } from '../interface'; import { PERM, PRIV } from '../model/builtin'; const trueChecker = () => true; @@ -6,7 +7,8 @@ const Checker = (perm: bigint | bigint[], priv: number | number[], checker: Func && (perm ? handler.user.hasPerm(perm) : true) && (priv ? handler.user.hasPriv(priv) : true) ); -const buildChecker = (...permPrivChecker: Array) => { +type PermPrivChecker = Array; +const buildChecker = (...permPrivChecker: PermPrivChecker) => { let _priv: number | number[]; let _perm: bigint | bigint[]; let checker: Function = trueChecker; @@ -22,51 +24,46 @@ const buildChecker = (...permPrivChecker: Array Record) | Record = {}, prefix: string, - ...permPrivChecker: Array -) => { - if (typeof args !== 'function') args = () => (args || {}); - const checker = buildChecker(...permPrivChecker); - if (name.startsWith('@@')) { - global.Hydro.ui.nodes.nav.splice(+name.split('@@')[1], 0, { - name: name.split('@@')[2], args, prefix, checker, - }); - } else { - global.Hydro.ui.nodes.nav.push({ - name, args, prefix, checker, - }); - } +export const nodes = new Proxy({}, { + get(self, key) { + if (!self[key]) self[key] = []; + return self[key]; + }, +}); +export function inject(node: UIInjectableFields, name: string, args: Record = {}, ...permPrivChecker: PermPrivChecker) { + nodes[node].push({ name, args: args || {}, checker: buildChecker(...permPrivChecker) }); +} +export function getNodes(name: UIInjectableFields) { + return nodes[name]; +} +/** @deprecated */ +export const Nav = (name, args, prefix, ...permPrivChecker) => { + inject('Nav', name, { ...args, prefix }, ...permPrivChecker); +}; +/** @deprecated */ +export const ProblemAdd = (name, args, icon = 'add', text = 'Create Problem') => { + inject('ProblemAdd', name, { ...args, icon, text }); }; -export const ProblemAdd = ( - name: string, args: Record = {}, icon = 'add', text = 'Create Problem', -) => { - global.Hydro.ui.nodes.problem_add.push({ - name, args, icon, text, - }); -}; - -export const UserDropdown = ( - name: string, args: Record = {}, ...permPrivChecker: Array -) => { - global.Hydro.ui.nodes.user_dropdown.push({ - name, args: args || {}, checker: buildChecker(...permPrivChecker), - }); -}; - -Nav('homepage', {}, 'homepage'); -Nav('problem_main', {}, 'problem', PERM.PERM_VIEW_PROBLEM); -Nav('training_main', {}, 'training', PERM.PERM_VIEW_TRAINING); -Nav('homework_main', {}, 'homework', PERM.PERM_VIEW_HOMEWORK); -Nav('discussion_main', {}, 'discussion', PERM.PERM_VIEW_DISCUSSION); -Nav('contest_main', {}, 'contest', PERM.PERM_VIEW_CONTEST); -Nav('record_main', (handler) => (handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) ? { query: { uidOrName: handler.user._id } } : {}), 'record'); -Nav('ranking', {}, 'ranking', PERM.PERM_VIEW_RANKING); -Nav('domain_dashboard', {}, 'domain', PERM.PERM_EDIT_DOMAIN); -Nav('manage_dashboard', {}, 'manage', PRIV.PRIV_EDIT_SYSTEM); -ProblemAdd('problem_create'); +inject('Nav', 'homepage', { prefix: 'homepage' }); +inject('Nav', 'problem_main', { prefix: 'problem' }, PERM.PERM_VIEW_PROBLEM); +inject('Nav', 'training_main', { prefix: 'training' }, PERM.PERM_VIEW_TRAINING); +inject('Nav', 'contest_main', { prefix: 'contest' }, PERM.PERM_VIEW_CONTEST); +inject('Nav', 'homework_main', { prefix: 'homework' }, PERM.PERM_VIEW_HOMEWORK); +inject('Nav', 'discussion_main', { prefix: 'discussion' }, PERM.PERM_VIEW_DISCUSSION); +inject('Nav', 'record_main', { + prefix: 'record', + query: (handler) => (handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) + ? ({ uidOrName: handler.user._id }) + : ({})), +}); +inject('Nav', 'ranking', { prefix: 'ranking' }, PERM.PERM_VIEW_RANKING); +inject('Nav', 'domain_dashboard', { prefix: 'domain' }, PERM.PERM_EDIT_DOMAIN); +inject('Nav', 'manage_dashboard', { prefix: 'manage' }, PRIV.PRIV_EDIT_SYSTEM); +inject('ProblemAdd', 'problem_create', { icon: 'add', text: 'Create Problem' }); +global.Hydro.ui.inject = inject; +global.Hydro.ui.nodes = nodes as any; +global.Hydro.ui.getNodes = getNodes; global.Hydro.ui.Nav = Nav; global.Hydro.ui.ProblemAdd = ProblemAdd; -global.Hydro.ui.UserDropdown = UserDropdown; diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index dd1ddfa72..3579d3084 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.40.2", + "version": "4.40.3", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/partials/nav.html b/packages/ui-default/templates/partials/nav.html index ee98e15bb..7fe9437a6 100644 --- a/packages/ui-default/templates/partials/nav.html +++ b/packages/ui-default/templates/partials/nav.html @@ -1,7 +1,7 @@ -{%- macro nav_item(target_page_name, target_page_args, target_page_prefix) -%} +{%- macro nav_item(target_name, target_args, target_prefix) -%} {%- endmacro -%} @@ -10,8 +10,8 @@