diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 83c2c9ffe..1ba5d3ca4 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.14.6", + "version": "2.14.7", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index eda2df1a3..41b764df5 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -404,7 +404,7 @@ export async function updateStatus( const tdoc = await get(domainId, tid, type); const tsdoc = await document.revPushStatus(domainId, type, tid, uid, 'journal', { rid, pid, accept, score, - }); + }, 'rid'); if (!tsdoc.attend) throw new ContestNotAttendedError(tid, uid); const journal = _getStatusJournal(tsdoc); const stats = RULES[tdoc.rule].stat(tdoc, journal); diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index e0eacf48b..55b4e07f0 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -331,13 +331,20 @@ export async function incStatus( export async function revPushStatus( domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, - key: ArrayKeys, value: any, + key: ArrayKeys, value: any, id = '_id', ): Promise { - const res = await collStatus.findOneAndUpdate( - { domainId, docType, docId, uid }, - { $push: { [key]: value }, $inc: { rev: 1 } }, - { upsert: true, returnOriginal: false }, + let res = await collStatus.findOneAndUpdate( + { domainId, docType, docId, uid, [`${key}.${id}`]: value[id] }, + { $set: { [`${key}.$`]: value }, $inc: { rev: 1 } }, + { returnOriginal: false }, ); + if (!res.value) { + res = await collStatus.findOneAndUpdate( + { domainId, docType, docId, uid }, + { $push: { [key]: value }, $inc: { rev: 1 } }, + { upsert: true, returnOriginal: false }, + ); + } return res.value; } diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index a75dfcf24..bf8b992c2 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -614,8 +614,10 @@ export class Handler { async onerror(error: HydroError) { if (!error.msg) error.msg = () => error.message; - console.error(error.msg(), error.params); - console.error(error.stack); + if (!(error instanceof NotFoundError)) { + console.error(error.msg(), error.params); + console.error(error.stack); + } this.response.status = error instanceof UserFacingError ? error.code : 500; this.response.template = error instanceof UserFacingError ? 'error.html' : 'bsod.html'; this.response.body = { @@ -805,7 +807,7 @@ export class ConnectionHandler { async message(message: any) { } // eslint-disable-line onerror(err: HydroError) { - console.error(err); + if (!(err instanceof NotFoundError)) console.error(err); this.send({ error: { name: err.name,