2.0.0(preview)

This commit is contained in:
masnn committed 2020-06-08 13:41:43 +08:00
1 parent d5929d78b1
commit 1c8b62a6d9
33 files changed
+307 -241

No files matched your search

+6
View File
@@ -67,8 +67,14 @@ async function build(type) {
} }
} }
const f = fs.readFileSync(root('.build/development.js')).toString(); const f = fs.readFileSync(root('.build/development.js')).toString();
const installer = fs.readFileSync(root('tool/install.js')).toString();
const file = `global._hydroModule=${JSON.stringify(j)};${f}`; const file = `global._hydroModule=${JSON.stringify(j)};${f}`;
fs.writeFileSync(root('.build/full.js'), file); fs.writeFileSync(root('.build/full.js'), file);
const hydro = {};
hydro.app = Buffer.from(f).toString('base64');
hydro.modules = j;
const d = zlib.gzipSync(Buffer.from(JSON.stringify(hydro)), { level: -1 }).toString('base64');
fs.writeFileSync(root('.build/install.js'), `global.Hydro="${d}"; ${installer}`);
} }
module.exports = build; module.exports = build;
+9 -19
View File
@@ -302,24 +302,14 @@ class ContestCreateHandler extends ContestHandler {
} }
async function apply() { async function apply() {
Route('/c', module.exports.ContestListHandler); Route('/c', ContestListHandler);
Route('/c/:tid', module.exports.ContestDetailHandler); Route('/c/:tid', ContestDetailHandler);
Route('/c/:tid/edit', module.exports.ContestEditHandler); Route('/c/:tid/edit', ContestEditHandler);
Route('/c/:tid/scoreboard', module.exports.ContestScoreboardHandler); Route('/c/:tid/scoreboard', ContestScoreboardHandler);
Route('/c/:tid/export/:ext', module.exports.ContestScoreboardDownloadHandler); Route('/c/:tid/export/:ext', ContestScoreboardDownloadHandler);
Route('/c/:tid/p/:pid', module.exports.ContestProblemHandler); Route('/c/:tid/p/:pid', ContestProblemHandler);
Route('/c/:tid/p/:pid/submit', module.exports.ContestProblemSubmitHandler); Route('/c/:tid/p/:pid/submit', ContestProblemSubmitHandler);
Route('/contest/create', module.exports.ContestCreateHandler, PERM_CREATE_CONTEST); Route('/contest/create', ContestCreateHandler, PERM_CREATE_CONTEST);
} }
global.Hydro.handler.contest = module.exports = { global.Hydro.handler.contest = module.exports = apply;
ContestListHandler,
ContestDetailHandler,
ContestEditHandler,
ContestScoreboardHandler,
ContestScoreboardDownloadHandler,
ContestProblemHandler,
ContestProblemSubmitHandler,
ContestCreateHandler,
apply,
};
+9 -19
View File
@@ -283,24 +283,14 @@ class DiscussionEditHandler extends DiscussionHandler {
} }
async function apply() { async function apply() {
Route('/discuss', module.exports.DiscussionMainHandler); Route('/discuss', DiscussionMainHandler);
Route('/discuss/:did', module.exports.DiscussionDetailHandler); Route('/discuss/:did', DiscussionDetailHandler);
Route('/discuss/:did/edit', module.exports.DiscussionEditHandler); Route('/discuss/:did/edit', DiscussionEditHandler);
Route('/discuss/:did/raw', module.exports.DiscussionDetailRawHandler); Route('/discuss/:did/raw', DiscussionDetailRawHandler);
Route('/discuss/:did/:drid/raw', module.exports.DiscussionReplyRawHandler); Route('/discuss/:did/:drid/raw', DiscussionReplyRawHandler);
Route('/discuss/:did/:drid/:drrid/raw', module.exports.DiscussionTailReplyRawHandler); Route('/discuss/:did/:drid/:drrid/raw', DiscussionTailReplyRawHandler);
Route('/discuss/:type/:name', module.exports.DiscussionNodeHandler); Route('/discuss/:type/:name', DiscussionNodeHandler);
Route('/discuss/:type/:name/create', module.exports.DiscussionCreateHandler); Route('/discuss/:type/:name/create', DiscussionCreateHandler);
} }
global.Hydro.handler.discussion = module.exports = { global.Hydro.handler.discussion = module.exports = apply;
DiscussionMainHandler,
DiscussionDetailHandler,
DiscussionEditHandler,
DiscussionDetailRawHandler,
DiscussionReplyRawHandler,
DiscussionTailReplyRawHandler,
DiscussionNodeHandler,
DiscussionCreateHandler,
apply,
};
+1 -3
View File
@@ -192,6 +192,4 @@ async function apply() {
Route('/domain/role', DomainRoleHandler); Route('/domain/role', DomainRoleHandler);
} }
global.Hydro.handler.domain = module.exports = { global.Hydro.handler.domain = module.exports = apply;
apply,
};
+7 -15
View File
@@ -285,23 +285,15 @@ class HomeMessagesConnectionHandler extends ConnectionHandler {
} }
async function apply() { async function apply() {
Route('/', module.exports.HomeHandler); Route('/', HomeHandler);
Route('/home/security', module.exports.HomeSecurityHandler); Route('/home/security', HomeSecurityHandler);
Route('/home/changeMail/:code', module.exports.UserChangemailWithCodeHandler); Route('/home/changeMail/:code', UserChangemailWithCodeHandler);
Route('/home/settings/:category', module.exports.HomeSettingsHandler); Route('/home/settings/:category', HomeSettingsHandler);
Route('/home/messages', module.exports.HomeMessagesHandler); Route('/home/messages', HomeMessagesHandler);
Connection('/home/messages-conn', module.exports.HomeMessagesConnectionHandler); Connection('/home/messages-conn', HomeMessagesConnectionHandler);
} }
global.Hydro.handler.home = module.exports = { global.Hydro.handler.home = module.exports = apply;
HomeHandler,
HomeSecurityHandler,
HomeSettingsHandler,
UserChangemailWithCodeHandler,
HomeMessagesHandler,
HomeMessagesConnectionHandler,
apply,
};
/* /*
@app.route('/home/file', 'home_file', global_route=True) @app.route('/home/file', 'home_file', global_route=True)
+1 -9
View File
@@ -452,15 +452,7 @@ async function apply() {
Route('/homework/:tid/edit', HomeworkEditHandler); Route('/homework/:tid/edit', HomeworkEditHandler);
} }
global.Hydro.handler.homework = { global.Hydro.handler.homework = module.exports = apply;
HomeworkMainHandler,
HomeworkCreateHandler,
HomeworkDetailHandler,
HomeworkDetailProblemHandler,
HomeworkDetailProblemSubmitHandler,
HomeworkEditHandler,
apply,
};
/* /*
+2 -4
View File
@@ -36,9 +36,7 @@ class ProblemImportHandler extends Handler {
} }
async function apply() { async function apply() {
Route('/problem/import', module.exports.ProblemImportHandler); Route('/problem/import', ProblemImportHandler);
} }
global.Hydro.handler.import = module.exports = { global.Hydro.handler.import = module.exports = apply;
ProblemImportHandler, apply,
};
+6 -5
View File
@@ -133,10 +133,11 @@ class JudgeConnectionHandler extends ConnectionHandler {
} }
async function apply() { async function apply() {
Route('/judge', module.exports.JudgeHandler); Route('/judge', JudgeHandler);
Connection('/judge/conn', module.exports.JudgeConnectionHandler); Connection('/judge/conn', JudgeConnectionHandler);
} }
global.Hydro.handler.judge = module.exports = { apply.next = next;
JudgeHandler, JudgeConnectionHandler, apply, next, end, apply.end = end;
};
global.Hydro.handler.judge = module.exports = apply;
+40 -43
View File
@@ -1,57 +1,45 @@
const domain = require('../model/domain');
const setting = require('../model/setting'); const setting = require('../model/setting');
const system = require('../model/system'); const system = require('../model/system');
const { Route, Handler } = require('../service/server'); const { Route, Handler } = require('../service/server');
const { PERM_MANAGE } = require('../permission');
const hpm = require('../lib/hpm'); const hpm = require('../lib/hpm');
const loader = require('../loader'); const loader = require('../loader');
const { PermissionError } = require('../error'); const { PermissionError } = require('../error');
class ManageHandler extends Handler { class SystemHandler extends Handler {
async prepare({ domainId }) { async prepare() {
this.checkPerm(PERM_MANAGE); if (!this.user.priv) throw new PermissionError('???');
this.domain = await domain.get(domainId); this.body = {
path: [
['Hydro', '/'],
['manage_main', '/manage'],
],
};
} }
} }
class ManageMainHandler extends ManageHandler { class SystemMainHandler extends SystemHandler {
async get() { async get() {
this.response.redirect = '/manage/dashboard'; this.response.redirect = '/manage/dashboard';
} }
} }
class ManageDashboardHandler extends ManageHandler { class SystemDashboardHandler extends SystemHandler {
async get() { async get() {
const path = [
['Hydro', '/'],
['manage', '/manage'],
['manage_dashboard', null],
];
this.response.template = 'manage_dashboard.html'; this.response.template = 'manage_dashboard.html';
this.response.body = { domain: this.domain, path }; this.response.body.path.push(['manage_dashboard', null]);
}
}
class SystemHandler extends Handler {
async prepare() {
if (!this.user.priv) throw new PermissionError('???');
} }
} }
class SystemModuleHandler extends SystemHandler { class SystemModuleHandler extends SystemHandler {
async get() { async get() {
const installed = await hpm.getInstalled(); this.response.body.path.push(['manage_module', null]);
const path = [ this.response.body.installed = await hpm.getInstalled();
['Hydro', '/'], this.response.active = loader.active;
['manage', '/manage'],
['manage_module', null],
];
this.response.body = { installed, active: loader.active, path };
this.response.template = 'manage_module.html'; this.response.template = 'manage_module.html';
} }
async postInstall({ url, id }) { async postInstall({ url }) {
await hpm.install(url, id); await hpm.install(url);
this.back(); this.back();
} }
@@ -61,15 +49,29 @@ class SystemModuleHandler extends SystemHandler {
} }
} }
class SystemScriptHandler extends SystemHandler {
async get() {
this.response.template = 'manage_script.html';
this.response.body.scripts = global.Hydro.script;
this.response.body.path.push(['manage_script', null]);
}
async post({ id, args }) {
// TODO Do not use console.log
await global.Hydro.script[id].run(args, console.log);
this.back();
}
}
class SystemSettingHandler extends SystemHandler { class SystemSettingHandler extends SystemHandler {
async get() { async get() {
this.response.template = 'manage_settings.html'; this.response.template = 'manage_settings.html';
const current = {}; this.response.body.path.push(['manage_settings', null]);
const settings = setting.SYSTEM_SETTINGS; this.response.body.current = {};
for (const s of settings) { this.response.body.settings = setting.SYSTEM_SETTINGS;
current[s.key] = await system.get(s.key); for (const s of this.response.body.settings) {
this.response.body.current[s.key] = await system.get(s.key);
} }
this.response.body = { current, settings };
} }
async post(args) { async post(args) {
@@ -99,16 +101,11 @@ class SystemSettingHandler extends SystemHandler {
} }
async function apply() { async function apply() {
Route('/manage', module.exports.ManageMainHandler); Route('/manage', SystemMainHandler);
Route('/manage/dashboard', module.exports.ManageDashboardHandler); Route('/manage/dashboard', SystemDashboardHandler);
Route('/manage/script', SystemScriptHandler);
Route('/manage/module', SystemModuleHandler); Route('/manage/module', SystemModuleHandler);
Route('/manage/setting', SystemSettingHandler); Route('/manage/setting', SystemSettingHandler);
} }
global.Hydro.handler.manage = module.exports = { global.Hydro.handler.manage = module.exports = apply;
ManageMainHandler,
ManageDashboardHandler,
SystemModuleHandler,
SystemSettingHandler,
apply,
};
+20 -7
View File
@@ -24,7 +24,11 @@ class StatusHandler extends Handler {
desc = desc || 'Online'; desc = desc || 'Online';
stats[i].status = desc; stats[i].status = desc;
} }
this.response.body = { stats }; console.log(stats);
const path = [
['Hydro', '/'],
];
this.response.body = { stats, path };
this.response.template = 'status.html'; this.response.template = 'status.html';
} }
} }
@@ -32,7 +36,12 @@ class StatusHandler extends Handler {
class StatusUpdateHandler extends Handler { class StatusUpdateHandler extends Handler {
async post(args) { async post(args) {
this.checkPerm(PERM_JUDGE); this.checkPerm(PERM_JUDGE);
await coll.updateOne({ _id: args._id }, { $set: { ...args, type: 'judger' } }, { upsert: true }); args.type = 'judger';
return coll.updateOne(
{ mid: args.mid, type: 'judger' },
{ $set: args },
{ upsert: true },
);
} }
} }
@@ -50,9 +59,13 @@ async function apply() {
Route('/language/:lang', SwitchLanguageHandler); Route('/language/:lang', SwitchLanguageHandler);
} }
global.Hydro.handler.misc = module.exports = { apply.updateStatus = function updateStatus(args) {
FileDownloadHandler, args.type = 'judger';
StatusHandler, return coll.updateOne(
StatusUpdateHandler, { mid: args.mid, type: 'judger' },
apply, { $set: args },
{ upsert: true },
);
}; };
global.Hydro.handler.misc = module.exports = apply;
+7 -7
View File
@@ -8,12 +8,12 @@ class NotFoundHandler extends Handler {
} }
async function apply() { async function apply() {
Route('/:param1', module.exports.NotFoundHandler); Route('/:param1', NotFoundHandler);
Route('/:param1/:param2', module.exports.NotFoundHandler); Route('/:param1/:param2', NotFoundHandler);
Route('/:param1/:param2/:param3', module.exports.NotFoundHandler); Route('/:param1/:param2/:param3', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4', module.exports.NotFoundHandler); Route('/:param1/:param2/:param3/:param4', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4/:param5', NotFoundHandler);
Route('/:param1/:param2/:param3/:param4/:param5/:param6', NotFoundHandler);
} }
global.Hydro.handler.notfound = module.exports = { global.Hydro.handler.notfound = module.exports = apply;
NotFoundHandler, apply,
};
+17 -35
View File
@@ -443,40 +443,22 @@ class ProblemCreateHandler extends Handler {
} }
async function apply() { async function apply() {
Route('/p', module.exports.ProblemHandler); Route('/p', ProblemHandler);
Route('/p/category/:category', module.exports.ProblemCategoryHandler); Route('/p/category/:category', ProblemCategoryHandler);
Route('/problem/random', module.exports.ProblemRandomHandler); Route('/problem/random', ProblemRandomHandler);
Route('/p/:pid', module.exports.ProblemDetailHandler); Route('/p/:pid', ProblemDetailHandler);
Route('/p/:pid/submit', module.exports.ProblemSubmitHandler); Route('/p/:pid/submit', ProblemSubmitHandler);
Route('/p/:pid/pretest', module.exports.ProblemPretestHandler); Route('/p/:pid/pretest', ProblemPretestHandler);
Route('/p/:pid/settings', module.exports.ProblemSettingsHandler); Route('/p/:pid/settings', ProblemSettingsHandler);
Route('/p/:pid/statistics', module.exports.ProblemStatisticsHandler); Route('/p/:pid/statistics', ProblemStatisticsHandler);
Route('/p/:pid/edit', module.exports.ProblemEditHandler); Route('/p/:pid/edit', ProblemEditHandler);
Route('/p/:pid/upload', module.exports.ProblemDataUploadHandler); Route('/p/:pid/upload', ProblemDataUploadHandler);
Route('/p/:pid/data', module.exports.ProblemDataDownloadHandler); Route('/p/:pid/data', ProblemDataDownloadHandler);
Route('/p/:pid/solution', module.exports.ProblemSolutionHandler); Route('/p/:pid/solution', ProblemSolutionHandler);
Route('/p/:pid/solution/:psid/raw', module.exports.ProblemSolutionRawHandler); Route('/p/:pid/solution/:psid/raw', ProblemSolutionRawHandler);
Route('/p/:pid/solution/:psid/:psrid/raw', module.exports.ProblemSolutionReplyRawHandler); Route('/p/:pid/solution/:psid/:psrid/raw', ProblemSolutionReplyRawHandler);
Route('/problem/create', module.exports.ProblemCreateHandler); Route('/problem/create', ProblemCreateHandler);
Connection('/p/:pid/pretest-conn', module.exports.ProblemPretestConnectionHandler); Connection('/p/:pid/pretest-conn', ProblemPretestConnectionHandler);
} }
global.Hydro.handler.problem = module.exports = { global.Hydro.handler.problem = module.exports = apply;
ProblemHandler,
ProblemCategoryHandler,
ProblemRandomHandler,
ProblemDetailHandler,
ProblemSubmitHandler,
ProblemPretestHandler,
ProblemSettingsHandler,
ProblemStatisticsHandler,
ProblemEditHandler,
ProblemDataUploadHandler,
ProblemDataDownloadHandler,
ProblemSolutionHandler,
ProblemSolutionRawHandler,
ProblemSolutionReplyRawHandler,
ProblemCreateHandler,
ProblemPretestConnectionHandler,
apply,
};
+1 -8
View File
@@ -160,11 +160,4 @@ async function apply() {
Connection('/record-detail-conn', RecordDetailConnectionHandler); Connection('/record-detail-conn', RecordDetailConnectionHandler);
} }
global.Hydro.handler.record = module.exports = { global.Hydro.handler.record = module.exports = apply;
RecordListHandler,
RecordDetailHandler,
RecordRejudgeHandler,
RecordMainConnectionHandler,
RecordDetailConnectionHandler,
apply,
};
+4 -9
View File
@@ -78,14 +78,9 @@ class SystemSettingHandler extends SystemHandler {
} }
async function apply() { async function apply() {
Route('/system', module.exports.SystemDashboardHandler); Route('/system', SystemDashboardHandler);
Route('/system/module', module.exports.SystemModuleHandler); Route('/system/module', SystemModuleHandler);
Route('/system/setting', module.exports.SystemSettingHandler); Route('/system/setting', SystemSettingHandler);
} }
global.Hydro.handler.manage = module.exports = { global.Hydro.handler.manage = module.exports = apply;
SystemDashboardHandler,
SystemModuleHandler,
SystemSettingHandler,
apply,
};
+5 -11
View File
@@ -249,16 +249,10 @@ class TrainingEditHandler extends TrainingHandler {
} }
async function apply() { async function apply() {
Route('/t', module.exports.TrainingMainHandler); Route('/t', TrainingMainHandler);
Route('/t/:tid', module.exports.TrainingDetailHandler); Route('/t/:tid', TrainingDetailHandler);
Route('/t/:tid/edit', module.exports.TrainingEditHandler); Route('/t/:tid/edit', TrainingEditHandler);
Route('/training/create', module.exports.TrainingCreateHandler); Route('/training/create', TrainingCreateHandler);
} }
global.Hydro.handler.training = module.exports = { global.Hydro.handler.training = module.exports = apply;
TrainingMainHandler,
TrainingDetailHandler,
TrainingEditHandler,
TrainingCreateHandler,
apply,
};
+9 -19
View File
@@ -168,24 +168,14 @@ class UserSearchHandler extends Handler {
} }
async function apply() { async function apply() {
Route('/login', module.exports.UserLoginHandler); Route('/login', UserLoginHandler);
Route('/register', module.exports.UserRegisterHandler); Route('/register', UserRegisterHandler);
Route('/register/:code', module.exports.UserRegisterWithCodeHandler); Route('/register/:code', UserRegisterWithCodeHandler);
Route('/logout', module.exports.UserLogoutHandler, PERM_LOGGEDIN); Route('/logout', UserLogoutHandler, PERM_LOGGEDIN);
Route('/lostpass', module.exports.UserLostPassHandler); Route('/lostpass', UserLostPassHandler);
Route('/lostpass/:code', module.exports.UserLostPassWithCodeHandler); Route('/lostpass/:code', UserLostPassWithCodeHandler);
Route('/user/search', module.exports.UserSearchHandler); Route('/user/search', UserSearchHandler);
Route('/user/:uid', module.exports.UserDetailHandler); Route('/user/:uid', UserDetailHandler);
} }
global.Hydro.handler.user = module.exports = { global.Hydro.handler.user = module.exports = apply;
UserLoginHandler,
UserRegisterHandler,
UserRegisterWithCodeHandler,
UserLogoutHandler,
UserLostPassHandler,
UserLostPassWithCodeHandler,
UserSearchHandler,
UserDetailHandler,
apply,
};
+2 -1
View File
@@ -3,7 +3,6 @@ const permission = require('../permission');
global.Hydro.ui.nav = []; global.Hydro.ui.nav = [];
const trueChecker = () => true; const trueChecker = () => true;
const Item = (path, name, prefix, perm, checker) => { const Item = (path, name, prefix, perm, checker) => {
if (perm && checker) { if (perm && checker) {
checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker); checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker);
@@ -21,6 +20,8 @@ Item('/t', 'training_main', 'training', permission.PERM_VIEW_TRAINING);
Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK); Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK);
Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION); Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION);
Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST); Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST);
Item('/record', 'record_main', 'record');
Item('/ranking', 'domain_rank', 'domain_rank');
Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE); Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE);
Item('/manage/dashboard', 'manage', 'manage', null, (handler) => handler.user.priv === 1); Item('/manage/dashboard', 'manage', 'manage', null, (handler) => handler.user.priv === 1);
+6 -6
View File
@@ -21,13 +21,13 @@ async function get() {
let battery; let battery;
if (!Battery.hasbattery) battery = 'No battery'; if (!Battery.hasbattery) battery = 'No battery';
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`; else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
const _id = OsInfo.serial; const mid = OsInfo.serial;
cache.cpu = cpu; cache.cpu = cpu;
cache.osinfo = osinfo; cache.osinfo = osinfo;
cache.flags = flags; cache.flags = flags;
cache._id = _id; cache.mid = mid;
return { return {
_id, cpu, memory, osinfo, load, flags, CpuTemp, battery, mid, cpu, memory, osinfo, load, flags, CpuTemp, battery,
}; };
} }
@@ -39,7 +39,7 @@ async function update() {
systeminformation.battery(), systeminformation.battery(),
]); ]);
const { const {
_id, cpu, osinfo, flags, mid, cpu, osinfo, flags,
} = cache; } = cache;
const memory = `${size(Memory.active)}/${size(Memory.total)}`; const memory = `${size(Memory.active)}/${size(Memory.total)}`;
const load = `${CurrentLoad.avgload}`; const load = `${CurrentLoad.avgload}`;
@@ -47,12 +47,12 @@ async function update() {
if (!Battery.hasbattery) battery = 'No battery'; if (!Battery.hasbattery) battery = 'No battery';
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`; else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
return [ return [
_id, mid,
{ {
memory, load, battery, CpuTemp, memory, load, battery, CpuTemp,
}, },
{ {
_id, cpu, memory, osinfo, load, flags, battery, CpuTemp, mid, cpu, memory, osinfo, load, flags, battery, CpuTemp,
}, },
]; ];
} }
+2 -2
View File
@@ -258,10 +258,10 @@ async function load() {
await model(); await model();
await handler(); await handler();
for (const i in global.Hydro.handler) { for (const i in global.Hydro.handler) {
await global.Hydro.handler[i].apply(); await global.Hydro.handler[i]();
} }
const notfound = require('./handler/notfound'); const notfound = require('./handler/notfound');
await notfound.apply(); await notfound();
for (const i in global.Hydro.service) { for (const i in global.Hydro.service) {
if (global.Hydro.service[i].postInit) { if (global.Hydro.service[i].postInit) {
try { try {
+8
View File
@@ -190,6 +190,13 @@ async function setStatus(domainId, docType, docId, uid, args) {
return res.value; return res.value;
} }
function setMultiStatus(domainId, docType, query, args) {
return collStatus.updateMany(
{ domainId, docType, ...query },
{ $set: args },
);
}
async function setIfNotStatus(domainId, docType, docId, uid, key, value, ifNot, args) { async function setIfNotStatus(domainId, docType, docId, uid, key, value, ifNot, args) {
const res = await collStatus.findOneAndUpdate( const res = await collStatus.findOneAndUpdate(
{ {
@@ -351,6 +358,7 @@ global.Hydro.model.document = module.exports = {
set, set,
setIfNotStatus, setIfNotStatus,
setStatus, setStatus,
setMultiStatus,
setSub, setSub,
TYPE_DOMAIN_USER, TYPE_DOMAIN_USER,
+7 -1
View File
@@ -44,7 +44,8 @@ class USER {
} }
async function getInDomain(domainId, udoc) { async function getInDomain(domainId, udoc) {
const dudoc = await document.getStatus(domainId, document.TYPE_DOMAIN_USER, 0, udoc._id); let dudoc = await document.getStatus(domainId, document.TYPE_DOMAIN_USER, 0, udoc._id);
dudoc = dudoc || {};
if (udoc._id === 1) dudoc.role = 'guest'; if (udoc._id === 1) dudoc.role = 'guest';
if (udoc.priv === 1) dudoc.role = 'admin'; if (udoc.priv === 1) dudoc.role = 'admin';
const p = await document.get(domainId, document.TYPE_DOMAIN_USER, dudoc.role || 'default'); const p = await document.get(domainId, document.TYPE_DOMAIN_USER, dudoc.role || 'default');
@@ -154,6 +155,10 @@ function setInDomain(domainId, uid, params) {
return document.setStatus(domainId, document.TYPE_DOMAIN_USER, 0, uid, params); return document.setStatus(domainId, document.TYPE_DOMAIN_USER, 0, uid, params);
} }
function setMultiInDomain(domainId, query, params) {
return document.setMultiStatus(domainId, document.TYPE_DOMAIN_USER, query, params);
}
async function getPrefixList(prefix, limit = 50) { async function getPrefixList(prefix, limit = 50) {
prefix = prefix.toLowerCase(); prefix = prefix.toLowerCase();
const $regex = new RegExp(`\\A\\Q${prefix.replace(/\\E/gmi, /\\E\\E\\Q/gmi)}\\E`, 'gmi'); const $regex = new RegExp(`\\A\\Q${prefix.replace(/\\E/gmi, /\\E\\E\\Q/gmi)}\\E`, 'gmi');
@@ -222,6 +227,7 @@ global.Hydro.model.user = module.exports = {
setEmail, setEmail,
setPassword, setPassword,
setInDomain, setInDomain,
setMultiInDomain,
getMultiInDomain, getMultiInDomain,
getPrefixList, getPrefixList,
setRole, setRole,
+15 -2
View File
@@ -1,11 +1,22 @@
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
const domain = require('../model/domain');
const contest = require('../model/contest'); const contest = require('../model/contest');
const user = require('../model/user'); const user = require('../model/user');
const rating = require('../lib/rating'); const rating = require('../lib/rating');
async function run({ domainId }, report) { async function run({ domainId, isSub = false }, report) {
if (!domainId) {
const domains = await domain.getMulti().toArray();
await report({ total: domains.length });
for (const i in domains) {
await run({ domainId: domains[i]._id, isSub: true }, report);
await report({ current: parseInt(i) + 1 });
}
return true;
}
const contests = await contest.getMulti(domainId).sort('endAt', -1).toArray(); const contests = await contest.getMulti(domainId).sort('endAt', -1).toArray();
await report({ total: contests.length }); await report({ total: contests.length });
await user.setMultiInDomain(domainId, {}, { rating: 1500 });
for (const i in contests) { for (const i in contests) {
const tdoc = contests[i]; const tdoc = contests[i];
const tsdocs = await contest.getMultiStatus(domainId, { docId: tdoc.docId }) const tsdocs = await contest.getMultiStatus(domainId, { docId: tdoc.docId })
@@ -22,8 +33,10 @@ async function run({ domainId }, report) {
tasks.push(user.setInDomain(domainId, udoc.uid, { rating: udoc.new })); tasks.push(user.setInDomain(domainId, udoc.uid, { rating: udoc.new }));
} }
await Promise.all(tasks); await Promise.all(tasks);
await report({ current: i + 1 }); if (isSub) await report({ subProgress: (i + 1) / contests.length });
else await report({ current: parseInt(i) + 1 });
} }
return true;
} }
global.Hydro.script.recalcRating = module.exports = { run }; global.Hydro.script.recalcRating = module.exports = { run };
+3 -3
View File
@@ -4,9 +4,9 @@ const sysinfo = require('../lib/sysinfo');
const coll = db.collection('status'); const coll = db.collection('status');
async function update() { async function update() {
const [_id, $set] = await sysinfo.update(); const [mid, $set] = await sysinfo.update();
await coll.updateOne( await coll.updateOne(
{ _id }, { mid, type: 'server' },
{ $set: { ...$set, updateAt: new Date() } }, { $set: { ...$set, updateAt: new Date() } },
{ upsert: true }, { upsert: true },
); );
@@ -15,7 +15,7 @@ async function update() {
async function postInit() { async function postInit() {
const info = await sysinfo.get(); const info = await sysinfo.get();
await coll.updateOne( await coll.updateOne(
{ _id: info._id }, { mid: info.mid, type: 'server' },
{ $set: { ...info, updateAt: new Date(), type: 'server' } }, { $set: { ...info, updateAt: new Date(), type: 'server' } },
{ upsert: true }, { upsert: true },
); );
+1 -3
View File
@@ -47,6 +47,4 @@ async function apply() {
nav('/paste/create', 'pastebin', 'pastebin', PERM_LOGGEDIN); nav('/paste/create', 'pastebin', 'pastebin', PERM_LOGGEDIN);
} }
global.Hydro.handler.pastebin = module.exports = { global.Hydro.handler.pastebin = module.exports = apply;
PasteCreateHandler, PasteShowHandler, apply,
};
+1 -3
View File
@@ -23,6 +23,4 @@ async function apply() {
Route('/wiki/:name', module.exports.WikiHandler); Route('/wiki/:name', module.exports.WikiHandler);
} }
global.Hydro.handler.wiki = module.exports = { global.Hydro.handler.wiki = module.exports = apply;
WikiHandler, apply,
};
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hydro", "name": "hydro",
"version": "1.0.0", "version": "2.0.0",
"main": "hydro/development.js", "main": "hydro/development.js",
"repository": "https://github.com/hydro-dev/Hydro.git", "repository": "https://github.com/hydro-dev/Hydro.git",
"author": "masnn", "author": "masnn",
+1 -1
View File
@@ -7,7 +7,7 @@
<div class="section"> <div class="section">
<div class="section__body no-padding"> <div class="section__body no-padding">
<div data-fragment-id="ranking"> <div data-fragment-id="ranking">
{% if not udocs %} {% if not udocs.length %}
{{ nothing.render('Sorry, there is no user in this domain.') }} {{ nothing.render('Sorry, there is no user in this domain.') }}
{% else %} {% else %}
<table class="data-table"> <table class="data-table">
+1
View File
@@ -13,6 +13,7 @@
</div> </div>
<ol class="menu collapsed"> <ol class="menu collapsed">
{{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }} {{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }}
{{ sidemenu.render_item(null, 'manage_script', '/manage/script') }}
{{ sidemenu.render_item(null, 'manage_module', '/manage/module') }} {{ sidemenu.render_item(null, 'manage_module', '/manage/module') }}
{{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }} {{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }}
</ol> </ol>
+56
View File
@@ -0,0 +1,56 @@
{% extends "manage_base.html" %}
{% block manage_content %}
<div style="display: none" class="dialog__body--run-script">
<div>
<div class="row"><div class="columns">
<h1>{{ _('Run script') }}</h1>
</div></div>
<div class="row">
<div class="medium-12 columns">
<label>
{{ _('Params') }}
<input name="args" type="text" class="textbox" autocomplete="off" data-autofocus>
</label>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Scripts') }}</h1>
<div class="section__tools">
<a class="tool-button" href="/wiki/help#script"><span class="icon icon-help"></span> {{ _("What's script?") }}</a>
</div>
</div>
<div class="section__body no-padding">
{{ noscript_note.render() }}
<table class="data-table">
<colgroup>
<col class="col--id">
<col class="col--desc">
<col class="col--action">
</colgroup>
<thead>
<tr>
<th class="col--id">{{ _('ID') }}</th>
<th class="col--desc">{{ _('Description') }}</th>
<th class="col--action">{{ _('Action') }}</th>
</tr>
</thead>
<tbody>
{% for id, script in scripts %}
{% if not script.hidden %}
<tr>
<td class="col--id">{{ id }}</td>
<td class="col--desc">{{ _(script.description|default(_('None'))) }}</td>
<td class="col--action">
<a class="typo-a" href="javascript: window.runScript('{{ id }}')">{{ _('Run') }}</a>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
+2 -2
View File
@@ -25,11 +25,11 @@
<tbody> <tbody>
{% for doc in stats %} {% for doc in stats %}
<tr> <tr>
<td class="col--id">{{ doc._id|truncate(6, True, '') }}</td> <td class="col--id">{{ doc._id }}</td>
<td class="col--status">{{ doc.status }}</td> <td class="col--status">{{ doc.status }}</td>
<td class="col--os">{{ doc.osinfo }}</td> <td class="col--os">{{ doc.osinfo }}</td>
<td class="col--cpu" data-tooltip="{{ doc.flags }}">{{ doc.cpu }}</td> <td class="col--cpu" data-tooltip="{{ doc.flags }}">{{ doc.cpu }}</td>
<td class="col--memory">{{ doc.memory }}</td> <td class="col--memory"{% if doc.stack %} data-tooltip="Stack size: {{ doc.stack }}MB"{% endif %}>{{ doc.memory }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
+17
View File
@@ -0,0 +1,17 @@
const zlib = require('zlib');
const fs = require('fs');
async function install() {
if (!global.Hydro) throw new Error('Data missing');
if (!fs.existsSync('hydro')) fs.mkdirSync('hydro');
const hydro = JSON.parse(zlib.gunzipSync(global.Hydro).toString());
fs.writeFileSync('development.js', hydro.app);
for (const i in hydro.modules) {
fs.writeFileSync(`${i}.hydro`, Buffer.from(hydro.modules[i], 'base64'));
}
}
install().catch((e) => {
console.error(e);
process.exit(1);
});
-3
View File
@@ -18,7 +18,6 @@ const page = new NamedPage('manage_module', () => {
}); });
addModuleDialog.clear = function () { addModuleDialog.clear = function () {
this.$dom.find('[name="url"]').val(''); this.$dom.find('[name="url"]').val('');
this.$dom.find('[name="id"]').val('');
return this; return this;
}; };
@@ -26,12 +25,10 @@ const page = new NamedPage('manage_module', () => {
const action = await addModuleDialog.clear().open(); const action = await addModuleDialog.clear().open();
if (action !== 'ok') return; if (action !== 'ok') return;
const url = addModuleDialog.$dom.find('[name="url"]').val(); const url = addModuleDialog.$dom.find('[name="url"]').val();
const id = addModuleDialog.$dom.find('[name="id"]').val();
try { try {
await request.post('', { await request.post('', {
operation: 'install', operation: 'install',
url, url,
id,
}); });
window.location.reload(); window.location.reload();
} catch (error) { } catch (error) {
+40
View File
@@ -0,0 +1,40 @@
import { NamedPage } from 'vj/misc/PageLoader';
import Notification from 'vj/components/notification';
import { ActionDialog } from 'vj/components/dialog';
import request from 'vj/utils/request';
const page = new NamedPage('manage_script', () => {
const runScriptDialog = new ActionDialog({
$body: $('.dialog__body--run-script > div'),
onDispatch(action) {
const $args = runScriptDialog.$dom.find('[name="args"]');
if (action === 'ok' && $args.val() === '') {
$args.focus();
return false;
}
return true;
},
});
runScriptDialog.clear = function () {
this.$dom.find('[name="args"]').val('');
return this;
};
window.runScript = async function (id) {
const action = await runScriptDialog.clear().open();
if (action !== 'ok') return;
const args = runScriptDialog.$dom.find('[name="args"]').val();
try {
await request.post('', {
args,
id,
});
window.location.reload();
} catch (error) {
Notification.error(error.message);
}
};
});
export default page;