Commit 53fda750 authored by nanahira's avatar nanahira

remake ygopro-tournament to ts

parent 02528579
...@@ -80,12 +80,12 @@ class Challonge { ...@@ -80,12 +80,12 @@ class Challonge {
return false; return false;
} }
} }
// POST /v1/tournaments/${tournament_id}/participants/bulk_add.json { api_key: string, participants: { name: string }[] } returns ANY // POST /v1/tournaments/${tournament_id}/participants/bulk_add.json { api_key: string, participants: { name: string, deckbuf?: string }[] } returns ANY
async uploadParticipants(participantNames) { async uploadParticipants(participants) {
try { try {
await axios_1.default.post(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/bulk_add.json`, { await axios_1.default.post(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/bulk_add.json`, {
api_key: this.config.api_key, api_key: this.config.api_key,
participants: participantNames.map(name => ({ name })), participants,
}); });
return true; return true;
} }
......
...@@ -37,11 +37,13 @@ ...@@ -37,11 +37,13 @@
"ygopro-deck-encode": "^1.0.14" "ygopro-deck-encode": "^1.0.14"
}, },
"devDependencies": { "devDependencies": {
"@types/async": "^3.2.25",
"@types/bunyan": "^1.8.8", "@types/bunyan": "^1.8.8",
"@types/formidable": "^3.4.6",
"@types/ip6addr": "^0.2.3", "@types/ip6addr": "^0.2.3",
"@types/lzma": "^2.3.0", "@types/lzma": "^2.3.0",
"@types/node": "^16.18.126", "@types/node": "^16.18.126",
"@types/underscore": "^1.11.4", "@types/underscore": "^1.13.0",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"coffeescript": "^2.7.0", "coffeescript": "^2.7.0",
"typescript": "^5.8.3" "typescript": "^5.8.3"
...@@ -93,6 +95,13 @@ ...@@ -93,6 +95,13 @@
"resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz", "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz",
"integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q==" "integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q=="
}, },
"node_modules/@types/async": {
"version": "3.2.25",
"resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz",
"integrity": "sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/bunyan": { "node_modules/@types/bunyan": {
"version": "1.8.8", "version": "1.8.8",
"resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz",
...@@ -102,6 +111,16 @@ ...@@ -102,6 +111,16 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/formidable": {
"version": "3.4.6",
"resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-3.4.6.tgz",
"integrity": "sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/ip6addr": { "node_modules/@types/ip6addr": {
"version": "0.2.3", "version": "0.2.3",
"resolved": "https://registry.npmjs.org/@types/ip6addr/-/ip6addr-0.2.3.tgz", "resolved": "https://registry.npmjs.org/@types/ip6addr/-/ip6addr-0.2.3.tgz",
...@@ -126,10 +145,11 @@ ...@@ -126,10 +145,11 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/underscore": { "node_modules/@types/underscore": {
"version": "1.11.4", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.13.0.tgz",
"integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==", "integrity": "sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/@types/ws": { "node_modules/@types/ws": {
"version": "8.5.3", "version": "8.5.3",
...@@ -1557,6 +1577,7 @@ ...@@ -1557,6 +1577,7 @@
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz",
"integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@ioredis/commands": "^1.1.1", "@ioredis/commands": "^1.1.1",
"cluster-key-slot": "^1.1.0", "cluster-key-slot": "^1.1.0",
...@@ -3733,6 +3754,12 @@ ...@@ -3733,6 +3754,12 @@
"resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz", "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz",
"integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q==" "integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q=="
}, },
"@types/async": {
"version": "3.2.25",
"resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz",
"integrity": "sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==",
"dev": true
},
"@types/bunyan": { "@types/bunyan": {
"version": "1.8.8", "version": "1.8.8",
"resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz",
...@@ -3742,6 +3769,15 @@ ...@@ -3742,6 +3769,15 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/formidable": {
"version": "3.4.6",
"resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-3.4.6.tgz",
"integrity": "sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/ip6addr": { "@types/ip6addr": {
"version": "0.2.3", "version": "0.2.3",
"resolved": "https://registry.npmjs.org/@types/ip6addr/-/ip6addr-0.2.3.tgz", "resolved": "https://registry.npmjs.org/@types/ip6addr/-/ip6addr-0.2.3.tgz",
...@@ -3764,9 +3800,9 @@ ...@@ -3764,9 +3800,9 @@
"dev": true "dev": true
}, },
"@types/underscore": { "@types/underscore": {
"version": "1.11.4", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.13.0.tgz",
"integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==", "integrity": "sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==",
"dev": true "dev": true
}, },
"@types/ws": { "@types/ws": {
...@@ -4809,6 +4845,7 @@ ...@@ -4809,6 +4845,7 @@
"version": "5.6.1", "version": "5.6.1",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz",
"integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==",
"peer": true,
"requires": { "requires": {
"@ioredis/commands": "^1.1.1", "@ioredis/commands": "^1.1.1",
"cluster-key-slot": "^1.1.0", "cluster-key-slot": "^1.1.0",
......
...@@ -48,11 +48,13 @@ ...@@ -48,11 +48,13 @@
"webhook": "node ygopro-webhook.js" "webhook": "node ygopro-webhook.js"
}, },
"devDependencies": { "devDependencies": {
"@types/async": "^3.2.25",
"@types/bunyan": "^1.8.8", "@types/bunyan": "^1.8.8",
"@types/formidable": "^3.4.6",
"@types/ip6addr": "^0.2.3", "@types/ip6addr": "^0.2.3",
"@types/lzma": "^2.3.0", "@types/lzma": "^2.3.0",
"@types/node": "^16.18.126", "@types/node": "^16.18.126",
"@types/underscore": "^1.11.4", "@types/underscore": "^1.13.0",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"coffeescript": "^2.7.0", "coffeescript": "^2.7.0",
"typescript": "^5.8.3" "typescript": "^5.8.3"
......
###
Main script of new dashboard account system.
The account list file is stored at `./config/admin_user.json`. The users are stored at `users`.
The key is the username. The `permissions` field could be a string, using a permission set from the example, or an object, to define a specific set of permissions.
eg. An account for a judge could be as follows, to use the default permission of judges,
"username": {
"password": "123456",
"enabled": true,
"permissions": "judge"
},
or as follows, to use a specific set of permissions.
"username": {
"password": "123456",
"enabled": true,
"permissions": {
"get_rooms": true,
"duel_log": true,
"download_replay": true,
"deck_dashboard_read": true,
"deck_dashboard_write": true,
"shout": true,
"kick_user": true,
"start_death": true
}
},
###
fs = require 'fs'
loadJSON = require('load-json-file').sync
loadJSONPromise = require('load-json-file')
moment = require 'moment'
moment.updateLocale('zh-cn', {
relativeTime: {
future: '%s内',
past: '%s前',
s: '%d秒',
m: '1分钟',
mm: '%d分钟',
h: '1小时',
hh: '%d小时',
d: '1天',
dd: '%d天',
M: '1个月',
MM: '%d个月',
y: '1年',
yy: '%d年'
}
})
bunyan = require 'bunyan'
log = bunyan.createLogger name: "auth"
util = require 'util'
if not fs.existsSync('./logs')
fs.mkdirSync('./logs')
add_log = (message) ->
mt = moment()
log.info(message)
text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n"
res = false
try
await fs.promises.appendFile("./logs/"+mt.format('YYYY-MM-DD')+".log", text)
res = true
catch
res = false
return res
default_data = loadJSON('./data/default_data.json')
setting_save = (settings) ->
try
await fs.promises.writeFile(settings.file, JSON.stringify(settings, null, 2))
catch e
add_log("save fail");
return
default_data = loadJSON('./data/default_data.json')
try
users = loadJSON('./config/admin_user.json')
catch
users = default_data.users
setting_save(users)
save = () ->
return await setting_save(users)
reload = () ->
user_backup = users
try
users = await loadJSONPromise('./config/admin_user.json')
catch
users = user_backup
await add_log("Invalid user data JSON")
return
check_permission = (user, permission_required) ->
_permission = user.permissions
permission = _permission
if typeof(permission) != 'object'
permission = users.permission_examples[_permission]
if !permission
await add_log("Permision not set:"+_permission)
return false
return permission[permission_required]
@auth = (name, pass, permission_required, action = 'unknown', no_log) ->
await reload()
user = users.users[name]
if !user
await add_log("Unknown user login. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return false
if user.password != pass
await add_log("Unauthorized user login. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return false
if !user.enabled
await add_log("Disabled user login. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return false
if !await check_permission(user, permission_required)
await add_log("Permission denied. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return false
if !no_log
await add_log("Operation success. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return true
@add_user = (name, pass, enabled, permissions) ->
await reload()
if users.users[name]
return false
users.users[name] = {
"password": pass,
"enabled": enabled,
"permissions": permissions
}
await save()
return true
@delete_user = (name) ->
await reload()
if !users.users[name]
return false
delete users.users[name]
await save()
return
@update_user = (name, key, value) ->
await reload()
if !users.users[name]
return false
users.users[name][key] = value
await save()
return
// Generated by CoffeeScript 2.7.0 "use strict";
(function() { var __importDefault = (this && this.__importDefault) || function (mod) {
/* return (mod && mod.__esModule) ? mod : { "default": mod };
Main script of new dashboard account system. };
The account list file is stored at `./config/admin_user.json`. The users are stored at `users`. Object.defineProperty(exports, "__esModule", { value: true });
The key is the username. The `permissions` field could be a string, using a permission set from the example, or an object, to define a specific set of permissions. exports.update_user = exports.delete_user = exports.add_user = exports.auth = void 0;
eg. An account for a judge could be as follows, to use the default permission of judges, /*
Main script of new dashboard account system.
The account list file is stored at `./config/admin_user.json`. The users are stored at `users`.
The key is the username. The `permissions` field could be a string, using a permission set from the example, or an object, to define a specific set of permissions.
eg. An account for a judge could be as follows, to use the default permission of judges,
"username": { "username": {
"password": "123456", "password": "123456",
"enabled": true, "enabled": true,
"permissions": "judge" "permissions": "judge"
}, },
or as follows, to use a specific set of permissions. or as follows, to use a specific set of permissions.
"username": { "username": {
"password": "123456", "password": "123456",
"enabled": true, "enabled": true,
...@@ -25,168 +29,171 @@ ...@@ -25,168 +29,171 @@
"start_death": true "start_death": true
} }
}, },
*/ */
var add_log, bunyan, check_permission, default_data, fs, loadJSON, loadJSONPromise, log, moment, reload, save, setting_save, users, util; const fs_1 = __importDefault(require("fs"));
const load_json_file_1 = require("load-json-file");
fs = require('fs'); const load_json_file_2 = __importDefault(require("load-json-file"));
const moment_1 = __importDefault(require("moment"));
loadJSON = require('load-json-file').sync; const bunyan_1 = __importDefault(require("bunyan"));
moment_1.default.updateLocale("zh-cn", {
loadJSONPromise = require('load-json-file');
moment = require('moment');
moment.updateLocale('zh-cn', {
relativeTime: { relativeTime: {
future: '%s内', future: "%s内",
past: '%s前', past: "%s前",
s: '%d秒', s: "%d秒",
m: '1分钟', m: "1分钟",
mm: '%d分钟', mm: "%d分钟",
h: '1小时', h: "1小时",
hh: '%d小时', hh: "%d小时",
d: '1天', d: "1天",
dd: '%d天', dd: "%d天",
M: '1个月', M: "1个月",
MM: '%d个月', MM: "%d个月",
y: '1年', y: "1年",
yy: '%d年' yy: "%d年",
} },
}); });
const log = bunyan_1.default.createLogger({ name: "auth" });
bunyan = require('bunyan'); if (!fs_1.default.existsSync("./logs")) {
fs_1.default.mkdirSync("./logs");
log = bunyan.createLogger({ }
name: "auth" const add_log = async function (message) {
}); const mt = (0, moment_1.default)();
util = require('util');
if (!fs.existsSync('./logs')) {
fs.mkdirSync('./logs');
}
add_log = async function(message) {
var mt, res, text;
mt = moment();
log.info(message); log.info(message);
text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n"; const text = mt.format("YYYY-MM-DD HH:mm:ss") + " --> " + message + "\n";
res = false; let res = false;
try { try {
await fs.promises.appendFile("./logs/" + mt.format('YYYY-MM-DD') + ".log", text); await fs_1.default.promises.appendFile(`./logs/${mt.format("YYYY-MM-DD")}.log`, text);
res = true; res = true;
} catch (error) { }
catch {
res = false; res = false;
} }
return res; return res;
}; };
const default_data = (0, load_json_file_1.sync)("./data/default_data.json");
default_data = loadJSON('./data/default_data.json'); const setting_save = async function (settings) {
setting_save = async function(settings) {
var e;
try { try {
await fs.promises.writeFile(settings.file, JSON.stringify(settings, null, 2)); await fs_1.default.promises.writeFile(settings.file, JSON.stringify(settings, null, 2));
} catch (error) { }
e = error; catch (e) {
add_log("save fail"); add_log("save fail");
} }
}; };
let users;
default_data = loadJSON('./data/default_data.json'); try {
users = (0, load_json_file_1.sync)("./config/admin_user.json");
try { }
users = loadJSON('./config/admin_user.json'); catch {
} catch (error) {
users = default_data.users; users = default_data.users;
setting_save(users); setting_save(users);
} }
const save = async function () {
save = async function() { await setting_save(users);
return (await setting_save(users)); };
}; const reload = async function () {
const user_backup = users;
reload = async function() {
var user_backup;
user_backup = users;
try { try {
users = (await loadJSONPromise('./config/admin_user.json')); users = (await (0, load_json_file_2.default)("./config/admin_user.json"));
} catch (error) { }
catch {
users = user_backup; users = user_backup;
await add_log("Invalid user data JSON"); await add_log("Invalid user data JSON");
} }
}; };
const check_permission = async function (user, permission_required) {
check_permission = async function(user, permission_required) { const _permission = user.permissions;
var _permission, permission; let permission;
_permission = user.permissions; if (typeof _permission !== "object") {
permission = _permission;
if (typeof permission !== 'object') {
permission = users.permission_examples[_permission]; permission = users.permission_examples[_permission];
} }
else {
permission = _permission;
}
if (!permission) { if (!permission) {
await add_log("Permision not set:" + _permission); await add_log("Permision not set:" + String(_permission));
return false; return false;
} }
return permission[permission_required]; return Boolean(permission[permission_required]);
}; };
const auth = async function (name, pass, permission_required, action = "unknown", no_log) {
this.auth = async function(name, pass, permission_required, action = 'unknown', no_log) {
var user;
await reload(); await reload();
user = users.users[name]; const user = users.users[name];
if (!user) { if (!user) {
await add_log("Unknown user login. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); await add_log("Unknown user login. User: " +
name +
", Permission needed: " +
permission_required +
", Action: " +
action);
return false; return false;
} }
if (user.password !== pass) { if (user.password !== pass) {
await add_log("Unauthorized user login. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); await add_log("Unauthorized user login. User: " +
name +
", Permission needed: " +
permission_required +
", Action: " +
action);
return false; return false;
} }
if (!user.enabled) { if (!user.enabled) {
await add_log("Disabled user login. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); await add_log("Disabled user login. User: " +
name +
", Permission needed: " +
permission_required +
", Action: " +
action);
return false; return false;
} }
if (!(await check_permission(user, permission_required))) { if (!(await check_permission(user, permission_required))) {
await add_log("Permission denied. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); await add_log("Permission denied. User: " +
name +
", Permission needed: " +
permission_required +
", Action: " +
action);
return false; return false;
} }
if (!no_log) { if (!no_log) {
await add_log("Operation success. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); await add_log("Operation success. User: " +
name +
", Permission needed: " +
permission_required +
", Action: " +
action);
} }
return true; return true;
}; };
exports.auth = auth;
this.add_user = async function(name, pass, enabled, permissions) { const add_user = async function (name, pass, enabled, permissions) {
await reload(); await reload();
if (users.users[name]) { if (users.users[name]) {
return false; return false;
} }
users.users[name] = { users.users[name] = {
"password": pass, password: pass,
"enabled": enabled, enabled: enabled,
"permissions": permissions permissions: permissions,
}; };
await save(); await save();
return true; return true;
}; };
exports.add_user = add_user;
this.delete_user = async function(name) { const delete_user = async function (name) {
await reload(); await reload();
if (!users.users[name]) { if (!users.users[name]) {
return false; return;
} }
delete users.users[name]; delete users.users[name];
await save(); await save();
}; };
exports.delete_user = delete_user;
this.update_user = async function(name, key, value) { const update_user = async function (name, key, value) {
await reload(); await reload();
if (!users.users[name]) { if (!users.users[name]) {
return false; return;
} }
users.users[name][key] = value; users.users[name][key] = value;
await save(); await save();
}; };
exports.update_user = update_user;
}).call(this);
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment