core: add RecordDetailHandler.postCancel

judge: allow judge without config
This commit is contained in:
undefined committed 2020-10-29 22:07:54 +08:00
1 parent e3266ca9e6
commit ee62870e70
8 files changed
+31 -13

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@hydrooj/hydrojudge", "name": "@hydrooj/hydrojudge",
"bin": "bin/hydrojudge.js", "bin": "bin/hydrojudge.js",
"version": "2.1.8", "version": "2.1.9",
"main": "package.json", "main": "package.json",
"author": "masnn", "author": "masnn",
"dependencies": { "dependencies": {
+1 -1
View File
@@ -281,7 +281,7 @@ function convertIniConfig(ini: string) {
return res; return res;
} }
export default async function readCases(folder: string, cfg: Record<string, any>, args) { export default async function readCases(folder: string, cfg: Record<string, any> = {}, args) {
const iniConfig = path.resolve(folder, 'config.ini'); const iniConfig = path.resolve(folder, 'config.ini');
const yamlConfig = path.resolve(folder, 'config.yaml'); const yamlConfig = path.resolve(folder, 'config.yaml');
let config; let config;
+1 -1
View File
@@ -39,7 +39,7 @@ function judgeCase(c) {
status = STATUS.STATUS_RUNTIME_ERROR; status = STATUS.STATUS_RUNTIME_ERROR;
if (code < 32) message = signals[code]; if (code < 32) message = signals[code];
else message = `您的程序返回了 ${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.score = Score[ctxSubtask.subtask.type](ctxSubtask.score, score);
ctxSubtask.status = Math.max(ctxSubtask.status, status); ctxSubtask.status = Math.max(ctxSubtask.status, status);
ctx.total_time_usage_ms += time_usage_ms; ctx.total_time_usage_ms += time_usage_ms;
+1 -1
View File
@@ -16,7 +16,7 @@ declare module 'hydrooj/dist/interface' {
async function postInit() { async function postInit() {
// Only start a single daemon // Only start a single daemon
if (!cluster.isFirstWorker) return; if (!global.Hydro.isFirstWorker) return;
const { compilerText } = require('./utils'); const { compilerText } = require('./utils');
const tmpfs = require('./tmpfs'); const tmpfs = require('./tmpfs');
const { FormatError, CompileError, SystemError } = require('./error'); const { FormatError, CompileError, SystemError } = require('./error');
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hydrooj", "name": "hydrooj",
"version": "2.13.27", "version": "2.13.28",
"bin": "bin/hydrooj.js", "bin": "bin/hydrooj.js",
"main": "dist/loader.js", "main": "dist/loader.js",
"typings": "dist/loader.d.ts", "typings": "dist/loader.d.ts",
+23 -2
View File
@@ -1,6 +1,6 @@
import { ObjectID } from 'mongodb'; import { ObjectID } from 'mongodb';
import { PermissionError, RecordNotFoundError } from '../error'; import { PermissionError, RecordNotFoundError } from '../error';
import { PERM, CONSTANT } from '../model/builtin'; import { PERM, CONSTANT, STATUS } from '../model/builtin';
import * as problem from '../model/problem'; import * as problem from '../model/problem';
import * as file from '../model/file'; import * as file from '../model/file';
import * as record from '../model/record'; import * as record from '../model/record';
@@ -97,6 +97,27 @@ class RecordDetailHandler extends RecordHandler {
} }
this.back(); this.back();
} }
@param('rid', Types.ObjectID)
async postCancel(domainId: string, rid: ObjectID) {
const rdoc = await record.get(domainId, rid);
if (rdoc) {
const $set = {
status: STATUS.STATUS_CANCELED,
score: 0,
time: 0,
memory: 0,
testCases: [{
status: 9, score: 0, time: 0, memory: 0, message: 'score canceled',
}],
};
await Promise.all([
record.update(domainId, rid, $set),
bus.emit('record/change', rdoc, $set),
]);
}
this.back();
}
} }
class RecordHackHandler extends Handler { class RecordHackHandler extends Handler {
@@ -130,11 +151,11 @@ class RecordHackHandler extends Handler {
/** /**
* @deprecated * @deprecated
* use RecordDetailHandler.postRejudge instead.
*/ */
class RecordRejudgeHandler extends Handler { class RecordRejudgeHandler extends Handler {
@param('rid', Types.ObjectID) @param('rid', Types.ObjectID)
async post(domainId: string, rid: ObjectID) { async post(domainId: string, rid: ObjectID) {
this.checkPerm(PERM.PERM_REJUDGE);
const rdoc = await record.get(domainId, rid); const rdoc = await record.get(domainId, rid);
if (rdoc) { if (rdoc) {
await record.reset(domainId, rid, true); await record.reset(domainId, rid, true);
+1 -4
View File
@@ -569,12 +569,9 @@ declare global {
error: typeof import('./error'), error: typeof import('./error'),
Logger: typeof import('./logger'), Logger: typeof import('./logger'),
locales: Dict<Dict<string>>, locales: Dict<Dict<string>>,
isFirstWorker: boolean,
}, },
addons: string[], addons: string[],
} }
} }
} }
declare module 'cluster' {
let isFirstWorker: boolean;
}
+2 -2
View File
@@ -228,8 +228,8 @@ export async function load() {
await entry({ entry: argv.entry as string }); await entry({ entry: argv.entry as string });
logger.success(`Worker ${process.pid} Started as ${argv.entry}`); logger.success(`Worker ${process.pid} Started as ${argv.entry}`);
} else { } else {
if (argv.firstWorker) cluster.isFirstWorker = true; if (argv.firstWorker) global.Hydro.isFirstWorker = true;
else cluster.isFirstWorker = false; else global.Hydro.isFirstWorker = false;
logger.info(`Worker ${process.pid} Starting`); logger.info(`Worker ${process.pid} Starting`);
await entry({ entry: 'worker' }); await entry({ entry: 'worker' });
logger.success(`Worker ${process.pid} Started`); logger.success(`Worker ${process.pid} Started`);