From d72bb2074de360aa1acf6f8f7cbf7e32f0a9a9a3 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 4 Mar 2025 10:18:22 +0800 Subject: [PATCH] core: build with plugins --- framework/framework/server.ts | 2 +- packages/hydrooj/src/handler/judge.ts | 2 +- packages/hydrooj/src/loader.ts | 2 +- packages/hydrooj/src/model/domain.ts | 41 ++++++++++++++------------- packages/hydrooj/src/model/user.ts | 36 ++++++++++++----------- packages/hydrooj/src/plugin-api.ts | 3 ++ packages/onsite-toolkit/index.ts | 1 - packages/scoreboard-xcpcio/index.ts | 1 - 8 files changed, 47 insertions(+), 41 deletions(-) diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 7b8181f3d..502ae4715 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -197,7 +197,7 @@ export class HandlerCommon { } } -export class Handler extends HandlerCommon { +export class Handler extends HandlerCommon { loginMethods: any; noCheckPermView = false; notUsage = false; diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index 967f374c1..f5141df6b 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -128,7 +128,7 @@ bus.on('record/judge', async (rdoc, updated, pdoc) => { await record.judge(rdoc.domainId, rdocs.map((r) => r._id), priority, {}, { hackRejudge: input }); } catch (e) { next({ - rid: rdoc._id, + rid: rdoc._id.toString(), domainId: rdoc.domainId, key: 'next', message: { message: 'Unable to apply hack: {0}', params: [e.message] }, diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index f8d31f0c0..d49fab14a 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -147,7 +147,7 @@ async function preload() { resolve(ctx); }); }); - }) + }); for (const a of [path.resolve(__dirname, '..'), ...getAddons()]) { try { // Is a npm package diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index a11f1afa4..a69265063 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -1,6 +1,7 @@ import { Dictionary, escapeRegExp } from 'lodash'; import { LRUCache } from 'lru-cache'; import { Filter } from 'mongodb'; +import { Context } from '../context'; import { DomainDoc } from '../interface'; import bus from '../service/bus'; import db from '../service/db'; @@ -284,24 +285,26 @@ class DomainModel { } } -bus.on('ready', () => Promise.all([ - db.ensureIndexes( - coll, - { key: { lower: 1 }, name: 'lower', unique: true }, - ), - db.ensureIndexes( - collUser, - { key: { domainId: 1, uid: 1 }, name: 'uid', unique: true }, - { key: { domainId: 1, rp: -1, uid: 1 }, name: 'rp', sparse: true }, - ), -])); -bus.on('domain/delete-cache', async (domainId: string) => { - const ddoc = await DomainModel.get(domainId); - if (!ddoc) return; - for (const host of ddoc.hosts || []) { - cache.delete(`host::${host}`); - } - cache.delete(`id::${domainId}`); -}); +export async function apply(ctx: Context) { + ctx.on('domain/delete-cache', async (domainId: string) => { + const ddoc = await DomainModel.get(domainId); + if (!ddoc) return; + for (const host of ddoc.hosts || []) { + cache.delete(`host::${host}`); + } + cache.delete(`id::${domainId}`); + }); + await Promise.all([ + db.ensureIndexes( + coll, + { key: { lower: 1 }, name: 'lower', unique: true }, + ), + db.ensureIndexes( + collUser, + { key: { domainId: 1, uid: 1 }, name: 'uid', unique: true }, + { key: { domainId: 1, rp: -1, uid: 1 }, name: 'rp', sparse: true }, + ), + ]); +} export default DomainModel; global.Hydro.model.domain = DomainModel; diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index 785ec31a6..d39531815 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -465,22 +465,24 @@ class UserModel { } } -bus.on('ready', () => Promise.all([ - db.ensureIndexes( - coll, - { key: { unameLower: 1 }, name: 'uname', unique: true }, - { key: { mailLower: 1 }, name: 'mail', unique: true }, - ), - db.ensureIndexes( - collV, - { key: { unameLower: 1 }, name: 'uname', unique: true }, - { key: { mailLower: 1 }, name: 'mail', unique: true }, - ), - db.ensureIndexes( - collGroup, - { key: { domainId: 1, name: 1 }, name: 'name', unique: true }, - { key: { domainId: 1, uids: 1 }, name: 'uid' }, - ), -])); +export async function apply() { + await Promise.all([ + db.ensureIndexes( + coll, + { key: { unameLower: 1 }, name: 'uname', unique: true }, + { key: { mailLower: 1 }, name: 'mail', unique: true }, + ), + db.ensureIndexes( + collV, + { key: { unameLower: 1 }, name: 'uname', unique: true }, + { key: { mailLower: 1 }, name: 'mail', unique: true }, + ), + db.ensureIndexes( + collGroup, + { key: { domainId: 1, name: 1 }, name: 'name', unique: true }, + { key: { domainId: 1, uids: 1 }, name: 'uid' }, + ), + ]); +} export default UserModel; global.Hydro.model.user = UserModel; diff --git a/packages/hydrooj/src/plugin-api.ts b/packages/hydrooj/src/plugin-api.ts index fafe3f107..ded62f55e 100644 --- a/packages/hydrooj/src/plugin-api.ts +++ b/packages/hydrooj/src/plugin-api.ts @@ -53,3 +53,6 @@ export * from '@hydrooj/framework/validator'; export * as StorageService from './service/storage'; export { EventMap } from './service/bus'; export { db, pwsh }; + +// to load ctx.scoreboard +export { } from './handler/contest'; diff --git a/packages/onsite-toolkit/index.ts b/packages/onsite-toolkit/index.ts index e0d09f653..44e298887 100644 --- a/packages/onsite-toolkit/index.ts +++ b/packages/onsite-toolkit/index.ts @@ -5,7 +5,6 @@ import { ForbiddenError, fs, ObjectId, parseTimeMS, PERM, ProblemConfig, ProblemModel, STATUS, STATUS_SHORT_TEXTS, STATUS_TEXTS, Time, UserModel, } from 'hydrooj'; -import type { } from 'hydrooj/src/handler/contest'; import { ResolverInput } from './interface'; interface IpLoginInfo { diff --git a/packages/scoreboard-xcpcio/index.ts b/packages/scoreboard-xcpcio/index.ts index 28db0f17b..a999af122 100644 --- a/packages/scoreboard-xcpcio/index.ts +++ b/packages/scoreboard-xcpcio/index.ts @@ -2,7 +2,6 @@ import path from 'path'; import { ContestModel, Context, fs, Handler, ObjectId, PERM, Schema, STATUS, Types, UserModel, } from 'hydrooj'; -import type { } from 'hydrooj/src/handler/contest'; const file = fs.readFileSync(path.join(__dirname, 'public/assets/board.html'), 'utf8'); const indexJs = file.match(/index-([A-Za-z0-9_-]+)\.js"/)?.[1];