From d7908aaff64ec7a2e913af0719f7899f74e37f33 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 8 Nov 2022 00:25:04 +0800 Subject: [PATCH] core: small enhancements --- packages/fps-importer/index.ts | 3 ++- packages/hydrooj/setting.yaml | 2 +- packages/hydrooj/src/handler/problem.ts | 5 ++--- packages/hydrooj/src/lib/i18n.ts | 12 +++++++++--- packages/prom-client/metrics.ts | 10 ++++++++++ 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/fps-importer/index.ts b/packages/fps-importer/index.ts index 956cdaa0d..3958b9d64 100644 --- a/packages/fps-importer/index.ts +++ b/packages/fps-importer/index.ts @@ -2,7 +2,7 @@ import decodeHTML from 'decode-html'; import xml2js from 'xml2js'; import { - _, AdmZip, buildContent, ContentNode, Context, FileTooLargeError, fs, + _, AdmZip, BadRequestError, buildContent, ContentNode, Context, FileTooLargeError, fs, Handler, PERM, ProblemConfigFile, ProblemModel, SolutionModel, ValidationError, } from 'hydrooj'; @@ -12,6 +12,7 @@ class FpsProblemImportHandler extends Handler { } async run(domainId: string, result: any) { + if (!result?.fps) throw new BadRequestError('Selected file is not a valid FPS problemset.'); for (const p of result.fps.item) { const content: ContentNode[] = []; if (p.description?.[0]) { diff --git a/packages/hydrooj/setting.yaml b/packages/hydrooj/setting.yaml index 7e599d225..9c4e29d86 100644 --- a/packages/hydrooj/setting.yaml +++ b/packages/hydrooj/setting.yaml @@ -44,7 +44,7 @@ langs: c: compile: /usr/bin/gcc -Wall --std=c99 -o foo foo.c -lm highlight: c - monaco: cpp + monaco: c display: C cc: compile: /usr/bin/g++ -Wall -std=c++14 -o foo foo.cc -lm diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 042d590a5..c5bb7f66d 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -648,10 +648,9 @@ export class ProblemEditHandler extends ProblemManageHandler { ) { if (newPid !== this.pdoc.pid && await problem.get(domainId, newPid)) throw new BadRequestError('new pid exists'); const $update: Partial = { - title, content, pid: newPid, hidden, assign, tag: tag ?? [], difficulty, + title, content, pid: newPid, hidden, assign, tag: tag ?? [], difficulty, html: false, }; - let pdoc = await problem.get(domainId, pid); - pdoc = await problem.edit(domainId, pdoc.docId, $update); + const pdoc = await problem.edit(domainId, this.pdoc.docId, $update); this.response.redirect = this.url('problem_detail', { pid: newPid || pdoc.docId }); } } diff --git a/packages/hydrooj/src/lib/i18n.ts b/packages/hydrooj/src/lib/i18n.ts index 2d9415f94..4d8d7a904 100644 --- a/packages/hydrooj/src/lib/i18n.ts +++ b/packages/hydrooj/src/lib/i18n.ts @@ -58,15 +58,21 @@ function load(data: Record>) { export = load; +function collect(lang: string) { + const s = translations[lang]; + if (!(s instanceof Array)) return {}; + const result = {}; + for (let i = s.length - 1; i >= 0; i--) Object.assign(result, s[i]); + return result; +} + global.Hydro.locales = new Proxy(translations, { get(self, lang: string) { if (!self[lang]) return {}; return new Proxy(self[lang], { get(s, key) { if (typeof key === 'string') return app.i18n.get(key, lang); - const result = {}; - for (let i = s.length - 1; i >= 0; i--) Object.assign(result, s[i]); - return result; + return Object.assign(collect(lang.split('_')[0]), collect(lang)); }, has(s, key: string) { return !!s.find((i) => !!i[key]); diff --git a/packages/prom-client/metrics.ts b/packages/prom-client/metrics.ts index 7d8f18e0d..405135dc5 100644 --- a/packages/prom-client/metrics.ts +++ b/packages/prom-client/metrics.ts @@ -3,6 +3,14 @@ import { } from 'prom-client'; import { Context, db } from 'hydrooj'; +declare module 'hydrooj' { + interface Context { + metrics: Registry; + } +} + +Context.service('metrics'); + export function createRegistry(ctx: Context) { const registry = new Registry(); @@ -61,5 +69,7 @@ export function createRegistry(ctx: Context) { }); collectDefaultMetrics({ register: registry }); + + ctx.metrics = registry; return registry; }