From b472b5c2454d0218158a74dce6c08d923389d8ee Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 10 Aug 2020 14:42:24 +0800 Subject: [PATCH] +translation +argType.Range --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/judge/interactive.ts | 2 +- packages/hydrooj/TODO | 7 +- packages/hydrooj/locales/zh_CN.yaml | 3 +- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 5 +- packages/hydrooj/src/handler/domain.ts | 4 +- packages/hydrooj/src/script/difficulty.ts | 2 +- packages/hydrooj/src/service/server.ts | 83 +++++++++++++------ packages/login-with-github/locales/zh_CN.yaml | 1 + packages/login-with-github/package.json | 2 +- packages/login-with-google/locales/zh_CN.yaml | 1 + packages/login-with-google/package.json | 2 +- packages/login-with-osu/locales/zh_CN.yaml | 1 + packages/login-with-osu/package.json | 2 +- packages/migrate-vijos/lib.ts | 2 +- packages/migrate-vijos/package.json | 2 +- packages/migrate-vijos/script.ts | 20 +++++ tsconfig.json | 1 + 19 files changed, 100 insertions(+), 44 deletions(-) create mode 100644 packages/login-with-github/locales/zh_CN.yaml create mode 100644 packages/login-with-google/locales/zh_CN.yaml create mode 100644 packages/login-with-osu/locales/zh_CN.yaml diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 280e17766..c8bfc8e60 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/hydrojudge", - "version": "2.0.2", + "version": "2.0.3", "main": "package.json", "author": "masnn", "os": [ diff --git a/packages/hydrojudge/src/judge/interactive.ts b/packages/hydrojudge/src/judge/interactive.ts index b124cf512..c694b15c3 100644 --- a/packages/hydrojudge/src/judge/interactive.ts +++ b/packages/hydrojudge/src/judge/interactive.ts @@ -39,7 +39,7 @@ function judgeCase(c) { status = STATUS.STATUS_RUNTIME_ERROR; if (code < 32) message = signals[code]; else message = `您的程序返回了 ${code}.`; - } else[status, score, message] = resInteractor.files.stderr.split('\n'); + } else [status, score, message] = resInteractor.files.stderr.split('\n'); ctxSubtask.score = Score[ctxSubtask.subtask.type](ctxSubtask.score, score); ctxSubtask.status = Math.max(ctxSubtask.status, status); ctx.total_time_usage_ms += time_usage_ms; diff --git a/packages/hydrooj/TODO b/packages/hydrooj/TODO index e3efbb589..b9148f6ce 100644 --- a/packages/hydrooj/TODO +++ b/packages/hydrooj/TODO @@ -3,4 +3,9 @@ SETTINGS_PRIVACY.allowRegisteredUsers model.setting.ui.name pdoc.secretConfig? -message.markAsRead \ No newline at end of file +message.markAsRead +Handle OAuth Map !important +基于document的model难以lint,建议拆分 +写test! !important +每日签到 +rp.delta \ No newline at end of file diff --git a/packages/hydrooj/locales/zh_CN.yaml b/packages/hydrooj/locales/zh_CN.yaml index 49c69bbed..bea37663a 100644 --- a/packages/hydrooj/locales/zh_CN.yaml +++ b/packages/hydrooj/locales/zh_CN.yaml @@ -138,6 +138,7 @@ Content: 内容 Contest scoreboard is not visible.: 当前比赛成绩表隐藏,暂不可显示。 Contest Scoreboard: 比赛成绩表 contest_create: 创建比赛 +contest_detail: 比赛详情 contest_detail_problem_submit: 递交比赛题目 contest_edit: 编辑比赛 contest_main: 比赛 @@ -398,8 +399,6 @@ Login to Attend Contest: 登录后参加比赛 Login to Claim Homework: 登录后认领作业 Login to Create a Discussion: 登录后创建讨论 Login to Submit: 登录后递交 -Login with Github: 使用 Github 登录 -Login with Google: 使用 Google 登录 Login: 登录 Logout All Sessions: 注销所有会话 Logout This Session: 注销该会话 diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 2be9bf42a..9d400f700 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.12.9", + "version": "2.12.10", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 4fc132a78..5882c1415 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -23,7 +23,7 @@ import * as bus from '../service/bus'; const ContestHandler = contest.ContestHandlerMixin(Handler); class ContestListHandler extends ContestHandler { - @param('rule', Types.String, true) + @param('rule', Types.Range(contest.RULES), true) @param('page', Types.PositiveInt, true) async get(domainId: string, rule = '', page = 1) { this.response.template = 'contest_main.html'; @@ -34,7 +34,6 @@ class ContestListHandler extends ContestHandler { tdocs = contest.getMulti(domainId).sort({ beginAt: -1 }); qs = ''; } else { - if (!contest.RULES[rule]) throw new ValidationError('rule'); tdocs = contest.getMulti(domainId, { rule }).sort({ beginAt: -1 }); qs = `rule=${rule}`; } @@ -196,7 +195,7 @@ class ContestEditHandler extends ContestHandler { @param('duration', Types.Float) @param('title', Types.String, isTitle) @param('content', Types.String, isContent) - @param('rule', Types.String) + @param('rule', Types.Range(contest.RULES)) @param('pids', Types.String) @param('rated', Types.Boolean) async post( diff --git a/packages/hydrooj/src/handler/domain.ts b/packages/hydrooj/src/handler/domain.ts index d45220c10..6a9e1700b 100644 --- a/packages/hydrooj/src/handler/domain.ts +++ b/packages/hydrooj/src/handler/domain.ts @@ -207,7 +207,7 @@ class DomainJoinApplicationsHandler extends ManageHandler { this.response.template = 'domain_join_applications.html'; } - @param('method', Types.UnsignedInt) + @param('method', Types.Range(domain.JOIN_METHOD_RANGE)) @param('role', Types.String, true) @param('expire', Types.UnsignedInt, true) @param('invitationCode', Types.String, true) @@ -215,7 +215,6 @@ class DomainJoinApplicationsHandler extends ManageHandler { const r = await domain.getRoles(this.domain); const roles = r.map((rl) => rl._id); const current = domain.getJoinSettings(this.domain, roles); - if (!domain.JOIN_METHOD_RANGE[method]) throw new ValidationError('method'); let joinSettings; if (method === domain.JOIN_METHOD_NONE) joinSettings = null; else { @@ -245,7 +244,6 @@ class DomainJoinHandler extends Handler { if (this.user.role !== 'default') throw new DomainJoinAlreadyMemberError(this.domain._id, this.user._id); } - // @base.require_priv(builtin.PRIV_USER_PROFILE) @param('code', Types.String, true) async get(domainId: string, code: string) { this.response.template = 'domain_join.html'; diff --git a/packages/hydrooj/src/script/difficulty.ts b/packages/hydrooj/src/script/difficulty.ts index c44d03e69..4d509f9d0 100644 --- a/packages/hydrooj/src/script/difficulty.ts +++ b/packages/hydrooj/src/script/difficulty.ts @@ -1,7 +1,7 @@ import { Pdoc } from '../interface'; import * as problem from '../model/problem'; -export const description = 'Create a new user'; +export const description = 'Caculate the difficulty of a problem'; const _CACHE_INFO = { last_s: 0.0, diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 72c261469..2589dbb4c 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -46,21 +46,34 @@ interface ParamOption { validate?: Validator, } -// eslint-disable-next-line no-shadow -export enum Types { String, Int, UnsignedInt, PositiveInt, Float, ObjectID, Boolean, Date, Time } +type Type = [Converter, Validator, boolean?]; -const Tools: Array<[Converter, Validator, boolean?]> = [ - [(v) => v.toString(), null], - [(v) => parseInt(v, 10), (v) => isSafeInteger(parseInt(v, 10))], - [(v) => parseInt(v, 10), (v) => parseInt(v, 10) >= 0], - [(v) => parseInt(v, 10), (v) => parseInt(v, 10) > 0], - [(v) => parseFloat(v), (v) => { +export interface Types { + String: Type, + Int: Type, + UnsignedInt: Type, + PositiveInt: Type, + Float: Type, + ObjectID: Type, + Boolean: Type, + Date: Type, + Time: Type, + Range: (range: Array | Dictionary) => Type, +} + +export const Types: Types = { + String: [(v) => v.toString(), null], + Int: [(v) => parseInt(v, 10), (v) => isSafeInteger(parseInt(v, 10))], + UnsignedInt: [(v) => parseInt(v, 10), (v) => parseInt(v, 10) >= 0], + PositiveInt: [(v) => parseInt(v, 10), (v) => parseInt(v, 10) > 0], + Float: [(v) => parseFloat(v), (v) => { const t = parseFloat(v); return t && !Number.isNaN(t) && Number.isFinite(t); }], - [(v) => new ObjectID(v), ObjectID.isValid], - [(v) => !!v, null, true], - [ + // eslint-disable-next-line no-shadow + ObjectID: [(v) => new ObjectID(v), ObjectID.isValid], + Boolean: [(v) => !!v, null, true], + Date: [ (v) => { const d = v.split('-'); assert(d.length === 3); @@ -71,8 +84,9 @@ const Tools: Array<[Converter, Validator, boolean?]> = [ assert(d.length === 3); const st = `${d[0]}-${d[1].length === 1 ? '0' : ''}${d[1]}-${d[2].length === 1 ? '0' : ''}${d[2]}`; return moment(st).isValid(); - }], - [ + }, + ], + Time: [ (v) => { const t = v.split(':'); assert(t.length === 2); @@ -84,34 +98,51 @@ const Tools: Array<[Converter, Validator, boolean?]> = [ return moment(`2020-01-01 ${(t[0].length === 1 ? '0' : '') + t[0]}:${t[1].length === 1 ? '0' : ''}${t[1]}`).isValid(); }, ], -]; + Range: (range) => [ + null, + (v) => { + if (range instanceof Array) { + for (const item of range) { + if (typeof item === 'string') { + if (item === v) return true; + } else if (typeof item === 'number') { + if (item === parseInt(v, 10)) return true; + } + } + } else { + for (const key in range) { + if (key === v) return true; + } + } + return false; + }, + ], +}; -export function param(name: string, type: Types, validate: Validator): MethodDecorator; -export function param(name: string, type?: Types, isOptional?: boolean): MethodDecorator; +export function param(name: string, type: Type, validate: Validator): MethodDecorator; +export function param(name: string, type?: Type, isOptional?: boolean): MethodDecorator; export function param( - name: string, type: Types, validate: null, convert: Converter + name: string, type: Type, validate: null, convert: Converter ): MethodDecorator; export function param( - name: string, type: Types, validate?: Validator, convert?: Converter, + name: string, type: Type, validate?: Validator, convert?: Converter, ): MethodDecorator; export function param( - name: string, type: Types, isOptional?: boolean, validate?: Validator, convert?: Converter, + name: string, type: Type, isOptional?: boolean, validate?: Validator, convert?: Converter, ): MethodDecorator; export function param( - name: string, ...args: Array + name: string, ...args: Array ): MethodDecorator; export function param(name: string, ...args: any): MethodDecorator { let cursor = 0; const v: ParamOption = { name }; let isValidate = true; while (cursor < args.length) { - if (typeof args[cursor] === 'number') { + if (args[cursor] instanceof Array) { const type = args[cursor]; - if (Tools[type]) { - if (Tools[type][0]) v.convert = Tools[type][0]; - if (Tools[type][1]) v.validate = Tools[type][1]; - if (Tools[type][2]) v.isOptional = Tools[type][2]; - } + if (type[0]) v.convert = type[0]; + if (type[1]) v.validate = type[1]; + if (type[2]) v.isOptional = type[2]; } else if (typeof args[cursor] === 'boolean') v.isOptional = args[cursor]; else if (isValidate) { if (args[cursor] !== null) v.validate = args[cursor]; diff --git a/packages/login-with-github/locales/zh_CN.yaml b/packages/login-with-github/locales/zh_CN.yaml new file mode 100644 index 000000000..d12c4f7d6 --- /dev/null +++ b/packages/login-with-github/locales/zh_CN.yaml @@ -0,0 +1 @@ +Login With Github: 使用 Github 登录 \ No newline at end of file diff --git a/packages/login-with-github/package.json b/packages/login-with-github/package.json index 89e4cc012..534e2c1e7 100644 --- a/packages/login-with-github/package.json +++ b/packages/login-with-github/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-github", - "version": "0.0.3", + "version": "0.0.4", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/login-with-google/locales/zh_CN.yaml b/packages/login-with-google/locales/zh_CN.yaml new file mode 100644 index 000000000..c56e260e7 --- /dev/null +++ b/packages/login-with-google/locales/zh_CN.yaml @@ -0,0 +1 @@ +Login With Google: 使用 Google 登录 \ No newline at end of file diff --git a/packages/login-with-google/package.json b/packages/login-with-google/package.json index 62d4bd63e..058cf300f 100644 --- a/packages/login-with-google/package.json +++ b/packages/login-with-google/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-google", - "version": "0.0.2", + "version": "0.0.3", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/login-with-osu/locales/zh_CN.yaml b/packages/login-with-osu/locales/zh_CN.yaml new file mode 100644 index 000000000..c95573fba --- /dev/null +++ b/packages/login-with-osu/locales/zh_CN.yaml @@ -0,0 +1 @@ +Login With Osu: 使用 Osu 登录 \ No newline at end of file diff --git a/packages/login-with-osu/package.json b/packages/login-with-osu/package.json index 8806b0058..cfa556d8c 100644 --- a/packages/login-with-osu/package.json +++ b/packages/login-with-osu/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-osu", - "version": "0.0.2", + "version": "0.0.3", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/migrate-vijos/lib.ts b/packages/migrate-vijos/lib.ts index f865ddab7..b0eac4509 100644 --- a/packages/migrate-vijos/lib.ts +++ b/packages/migrate-vijos/lib.ts @@ -1,4 +1,4 @@ -import 'hydrooj'; +import { } from 'hydrooj'; const { md5, sha1 } = global.Hydro.lib; diff --git a/packages/migrate-vijos/package.json b/packages/migrate-vijos/package.json index 925e1f24c..f5da499c4 100644 --- a/packages/migrate-vijos/package.json +++ b/packages/migrate-vijos/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/migrate-vijos", - "version": "1.3.4", + "version": "1.3.5", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/migrate-vijos/script.ts b/packages/migrate-vijos/script.ts index 7676e1c5a..da66c9c57 100644 --- a/packages/migrate-vijos/script.ts +++ b/packages/migrate-vijos/script.ts @@ -205,6 +205,7 @@ const tasks = { display_name: 'displayName', rp: null, rank: null, + userfile_usage: null, }, record: async (doc) => { const testCases: TestCase[] = []; @@ -417,6 +418,24 @@ async function removeInvalidPid(src: Db, report: Function) { } } +async function userfileUsage(src: Db, report: Function) { + const count = await src.collection('domain.user').find().count(); + const bulk = dst.collection('user').initializeUnorderedBulkOp(); + await report({ progress: 1, message: `userfileUsage: ${count}` }); + const total = Math.floor(count / 50); + for (let i = 0; i <= total; i++) { + const docs = await src.collection('userfileUsage') + .find().skip(i * 50).limit(50) + .toArray(); + for (const doc of docs) { + if (doc.userfile_usage) { + bulk.find({ _id: doc.uid }).updateOne({ $set: { usage: doc.userfile_usage } }); + } + } + await bulk.execute(); + } +} + async function task(name: string, src: Db, report: Function) { const count = await cursor[name](src).count(); await report({ progress: 1, message: `${name}: ${count}` }); @@ -532,6 +551,7 @@ export async function run({ await fixProblem(report); await discussionNode(src, report); await message(src, report); + await userfileUsage(src, report); await removeInvalidPid(src, report); return true; } diff --git a/tsconfig.json b/tsconfig.json index 15342665a..7cb762c78 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ { "path": "packages/geoip" }, { "path": "packages/login-with-github" }, { "path": "packages/login-with-google" }, + { "path": "packages/login-with-osu" }, { "path": "packages/migrate-vijos" }, { "path": "tsconfig.build.json" }, ],