服务状态(/status)

This commit is contained in:
masnn committed 2020-05-31 20:07:52 +08:00
1 parent b2989cb9ea
commit 216a4a91e4
19 files changed
+322 -136

No files matched your search

-95
View File
@@ -1,95 +0,0 @@
module.exports = {
TEXT: 'Assignment',
check() {},
stat(tdoc, journal) {
const effective = {};
const detail = [];
let score = 0;
let time = 0;
for (const j in journal) {
if (tdoc.pids.includes(j.pid)
&& !(effective.includes(j.pid) && effective[j.pid].accept)) {
effective[j.pid] = j;
}
}
const _time = (jdoc) => jdoc.rid.generationTime - Math.floor(tdoc.beginAt / 1000);
for (const j in effective) {
detail.push({
...effective[j],
time: _time(effective[j]),
});
}
for (const d of detail) {
score += d.score;
time += d.time;
}
return {
score, time, detail,
};
},
scoreboard(isExport, _, tdoc, rankedTsdocs, udict, pdict) {
const columns = [
{ type: 'rank', value: _('Rank') },
{ type: 'user', value: _('User') },
{ type: 'display_name', value: _('Display Name') },
{ type: 'total_score', value: _('Score') },
];
if (isExport) {
columns.push(
{ type: 'total_original_score', value: _('Original Score') },
{ type: 'total_time', value: _('Total Time (Seconds)') },
);
}
columns.push({ type: 'total_time_str', value: _('Total Time') });
for (const i in tdoc.pids) {
if (isExport) {
columns.push(
{ type: 'problem_score', value: '#{0} {1}'.format(i + 1, pdict[tdoc.pids[i]].title) },
{ type: 'problem_original_score', value: '#{0} {1}'.format(i + 1, _('Original Score')) },
{ type: 'problem_time', value: '#{0} {1}'.format(i + 1, _('Time (Seconds)')) },
{ type: 'problem_time_str', value: '#{0} {1}'.format(i + 1, _('Time')) },
);
} else columns.push({ type: 'problem_detail', value: '#{0}'.format(i + 1), raw: pdict[tdoc.pids[i]] });
}
const rows = [columns];
for (const [rank, tsdoc] in rankedTsdocs) {
const tsddict = {};
if (tsdoc.detail) { for (const item of tsdoc.detail) tsddict[item.pid] = item; }
const row = [
{ type: 'string', value: rank },
{ type: 'user', value: udict[tsdoc.uid].uname, raw: udict[tsdoc.uid] },
{ type: 'string', value: tsdoc.penalty_score || 0 },
];
if (isExport) {
row.push(
{ type: 'string', value: tsdoc.score || 0 },
{ type: 'string', value: tsdoc.time || 0.0 },
);
}
row.push({ type: 'string', value: tsdoc.time || 0 });
for (const pid of tdoc.pids) {
const rdoc = (tsddict[pid] || {}).rid || null;
const colScore = (tsddict[pid] || {}).penalty_score || '-';
const colOriginalScore = (tsddict[pid] || {}).score || '-';
const colTime = (tsddict[pid] || {}).time || '-';
const colTimeStr = colTime !== '-' ? colTime : '-';
if (isExport) {
row.push(
{ type: 'string', value: colScore },
{ type: 'string', value: colOriginalScore },
{ type: 'string', value: colTime },
{ type: 'string', value: colTimeStr },
);
} else {
row.push({
type: 'record',
value: '{0} / {1}\n{2}'.format(colScore, colOriginalScore, colTimeStr),
raw: rdoc,
});
}
}
rows.push(row);
}
return rows;
},
};
-4
View File
@@ -1,4 +0,0 @@
{
"id": "contest-rule-homework",
"version": "1.0.0"
}
-3
View File
@@ -1,3 +0,0 @@
const homework = require('./homework');
global.Hydro.model.contest.RULES.homework = homework;
+16 -2
View File
@@ -56,6 +56,7 @@ const tasks = {
reply: 'reply',
parent_doc_id: 'parentId',
parent_doc_type: 'parentType',
num_replies: 'nReply',
views: 'views',
highlight: 'highlight',
ip: 'ip',
@@ -244,8 +245,21 @@ async function task(name, src, report) {
for (let i = 0; i <= total; i++) {
const docs = await cursor[name](src).skip(i * 50).limit(50).toArray();
const res = [];
for (const doc of docs) res.push(tasks[name](doc));
if (res.length) await dst.collection(name).insertMany(await Promise.all(res));
for (const doc of docs) {
const d = await tasks[name](doc);
if (d) {
if (d.docId && d.docType) {
res.push(dst.collection(name).updateOne({
docId: d.docId, docType: d.docType,
}, { $set: d }, { upsert: true }));
} else if (d._id) {
res.push(dst.collection(name).updateOne({
_id: d._id,
}, { $set: d }, { upsert: true }));
} else res.push(dst.collection(name).insertOne(d));
}
}
await Promise.all(res);
await report({ progress: Math.round(100 * ((i + 1) / (total + 1))) });
}
await fixPid(report);