diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 0cd8146b..5b297a39 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.39.25", + "version": "2.39.26", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index ca83abfa..4692e6ea 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -200,6 +200,7 @@ SystemSetting( Setting('setting_basic', 'default.priv', builtin.PRIV.PRIV_DEFAULT, 'number', 'default.priv', 'Default Privilege', FLAG_PRO), Setting('setting_basic', 'discussion.nodes', builtin.DEFAULT_NODES, 'yaml', 'discussion.nodes', 'Discussion Nodes'), Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'problem.categories', 'Problem Categories'), + Setting('setting_basic', 'rank.uidIgnore', '', 'text', 'rank.uidIgnore', 'Ignored uids for ranking'), Setting('setting_basic', 'pagination.problem', 100, 'number', 'pagination.problem', 'Problems per page'), Setting('setting_basic', 'pagination.contest', 20, 'number', 'pagination.contest', 'Contests per page'), Setting('setting_basic', 'pagination.discussion', 50, 'number', 'pagination.discussion', 'Discussions per page'), diff --git a/packages/hydrooj/src/script/rating.ts b/packages/hydrooj/src/script/rating.ts index 451c611e..bf328a94 100644 --- a/packages/hydrooj/src/script/rating.ts +++ b/packages/hydrooj/src/script/rating.ts @@ -8,6 +8,7 @@ import * as contest from '../model/contest'; import domain from '../model/domain'; import problem from '../model/problem'; import record from '../model/record'; +import * as system from '../model/system'; import UserModel from '../model/user'; import db from '../service/db'; @@ -24,7 +25,17 @@ async function runProblem(...arg: any[]) { const udict: ND = (typeof arg[0] === 'string') ? arg[2] : arg[1]; const nPages = Math.floor( (await problem.getMultiStatus( - pdoc.domainId, { docId: pdoc.docId, rid: { $ne: null }, uid: { $ne: pdoc.owner } }, + pdoc.domainId, + { + docId: pdoc.docId, + rid: { $ne: null }, + uid: { + $nin: [ + pdoc.owner, + system.get('rank.uidIgnore').split(',').map((i) => +i).filter((i) => i), + ], + }, + }, ).count() + 99) / 100, ); const p = (pdoc.difficulty || 5) / (Math.sqrt(Math.sqrt(pdoc.nAccept)) + 1) / 10; @@ -54,8 +65,11 @@ async function runContest(...arg: any[]) { : arg[0]; const udict: ND = (typeof arg[0] === 'string') ? arg[2] : arg[1]; const report = (typeof arg[0] === 'string') ? arg[3] : arg[2]; - const cursor = contest.getMultiStatus(tdoc.domainId, { docId: tdoc.docId, journal: { $ne: null } }) - .sort(contest.RULES[tdoc.rule].statusSort); + const cursor = contest.getMultiStatus(tdoc.domainId, { + docId: tdoc.docId, + journal: { $ne: null }, + uid: { $nin: system.get('rank.uidIgnore').split(',').map((i) => +i).filter((i) => i) }, + }).sort(contest.RULES[tdoc.rule].statusSort); if (!await cursor.count()) return; const [rankedTsdocs] = await contest.RULES[tdoc.rule].ranked(tdoc, cursor); const users = []; @@ -79,6 +93,7 @@ async function runContest(...arg: any[]) { export async function calcLevel(domainId: string, report: Function) { const filter = { rp: { $ne: 1500, $exists: true } }; const ducnt = await domain.getMultiUserInDomain(domainId, filter).count(); + await domain.setMultiUserInDomain(domainId, {}, { level: 0, rank: null }); if (!ducnt) return; let last = { rp: null }; let rank = 0;