From 54ae5505860a4900209f21c36d28f429eba8f1ba Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 13 Oct 2026 11:03:31 +0000 Subject: [PATCH] core: drop system/setting-loaded event --- packages/hydrooj/src/model/setting.ts | 70 +++++++++++++---------- packages/hydrooj/src/service/bus.ts | 1 - packages/ui-default/backendlib/builder.ts | 2 +- packages/ui-next/index.ts | 3 +- packages/vjudge/src/index.ts | 2 +- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 2b94ab8fe..93bd3a35f 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -8,7 +8,7 @@ import moment from 'moment-timezone'; import Schema from 'schemastery'; import { LangConfig, parseLang } from '@hydrooj/common'; import { findFileSync, randomstring } from '@hydrooj/utils'; -import { Context } from '../context'; +import { Context, Service } from '../context'; import { Setting as _Setting } from '../interface'; import { Logger } from '../logger'; import * as builtin from './builtin'; @@ -378,42 +378,54 @@ SystemSetting( export const langs: Record = {}; -export const inject = ['db']; -export async function apply(ctx: Context) { - logger.info('Ensuring settings'); - for (const lang in global.Hydro.locales) { - if (!global.Hydro.locales[lang].__interface) continue; - langRange[lang] = global.Hydro.locales[lang].__langname; +export class SettingModelService extends Service { + static inject = ['db', 'model:system']; + + constructor(ctx: Context) { + super(ctx, 'model:setting'); } - const system = global.Hydro.model.system; - for (const setting of SYSTEM_SETTINGS) { - if (!setting.value) continue; - const current = await ctx.db.collection('system').findOne({ _id: setting.key }); - if (!current || current.value == null || current.value === '') { - await system.set(setting.key, setting.value); + + async [Service.init]() { + logger.info('Ensuring settings'); + for (const lang in global.Hydro.locales) { + if (!global.Hydro.locales[lang].__interface) continue; + langRange[lang] = global.Hydro.locales[lang].__langname; } + const system = this.ctx['model:system']; + for (const setting of SYSTEM_SETTINGS) { + if (!setting.value) continue; + const current = await this.ctx.db.collection('system').findOne({ _id: setting.key }); + if (!current || current.value == null || current.value === '') { + await system.set(setting.key, setting.value); + } + } + try { + Object.assign(langs, parseLang(system.get('hydrooj.langs'))); + const range = {}; + for (const key in langs) range[key] = langs[key].display; + LangSettingNode.range = range; + ServerLangSettingNode.range = range; + } catch (e) { /* Ignore */ } + return this.ctx.on('system/setting', (args) => { + if (!args.hydrooj?.langs) return; + Object.assign(langs, parseLang(args.hydrooj.langs)); + const range = {}; + for (const key in langs) range[key] = langs[key].display; + LangSettingNode.range = range; + ServerLangSettingNode.range = range; + }); } - try { - Object.assign(langs, parseLang(system.get('hydrooj.langs'))); - const range = {}; - for (const key in langs) range[key] = langs[key].display; - LangSettingNode.range = range; - ServerLangSettingNode.range = range; - } catch (e) { /* Ignore */ } - ctx.on('system/setting', (args) => { - if (!args.hydrooj?.langs) return; - Object.assign(langs, parseLang(args.hydrooj.langs)); - const range = {}; - for (const key in langs) range[key] = langs[key].display; - LangSettingNode.range = range; - ServerLangSettingNode.range = range; - }); - ctx.emit('system/setting-loaded'); +} + +export const inject = ['db']; +export function apply(ctx: Context) { + ctx.plugin(SettingModelService); } global.Hydro.model.setting = { apply, inject, + SettingModelService, Setting, PreferenceSetting, diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index c2d1f0a24..d9da8f5b7 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -35,7 +35,6 @@ export interface EventMap { 'database/config': () => VoidReturn; 'system/setting': (args: Record) => VoidReturn; - 'system/setting-loaded': () => VoidReturn; 'bus/broadcast': (event: keyof EventMap, payload: any, trace?: string) => VoidReturn; 'monitor/update': (type: 'server' | 'judge', $set: any) => VoidReturn; 'monitor/collect': (info: any) => VoidReturn; diff --git a/packages/ui-default/backendlib/builder.ts b/packages/ui-default/backendlib/builder.ts index 8226c5efd..dc1b8368b 100644 --- a/packages/ui-default/backendlib/builder.ts +++ b/packages/ui-default/backendlib/builder.ts @@ -174,7 +174,7 @@ export async function apply(ctx: Context) { debouncedBuildUI(); }; ctx.on('system/setting', () => triggerHotUpdate()); - ctx.on('system/setting-loaded', () => triggerHotUpdate()); + ctx.inject(['model:setting'], () => triggerHotUpdate()); ctx.on('app/watch/change', triggerHotUpdate); ctx.on('app/watch/unlink', triggerHotUpdate); ctx.on('app/i18n/update', debouncedBuildUI); diff --git a/packages/ui-next/index.ts b/packages/ui-next/index.ts index 40bfc7279..fe821c8eb 100644 --- a/packages/ui-next/index.ts +++ b/packages/ui-next/index.ts @@ -286,7 +286,6 @@ export async function apply(ctx: Context) { await buildVersions(); }); ctx.on('app/i18n/update', buildI18n); - ctx.on('system/setting-loaded', buildCodeLangs); ctx.on('system/setting', buildCodeLangs); const vite = await createServer({ @@ -394,8 +393,8 @@ export async function apply(ctx: Context) { }; ctx.on('app/watch/change', triggerHotUpdate); ctx.on('app/watch/unlink', triggerHotUpdate); - ctx.on('system/setting-loaded', buildCodeLangs); ctx.on('system/setting', debouncedBuild); ctx.on('app/i18n/update', debouncedBuild); } + ctx.inject(['model:setting'], buildCodeLangs); } diff --git a/packages/vjudge/src/index.ts b/packages/vjudge/src/index.ts index 4e18cb520..ca2af0d92 100644 --- a/packages/vjudge/src/index.ts +++ b/packages/vjudge/src/index.ts @@ -297,7 +297,7 @@ export async function apply(ctx: Context) { }, ]); }); - ctx.inject(['vjudge'], async (c) => { + ctx.inject(['vjudge', 'model:setting'], async (c) => { for (const [k, v] of Object.entries(providers)) { if (!SystemModel.get(`vjudge.builtin-${k}-disable`)) c.vjudge.addProvider(k, v); }