Commit fc8cdc7a authored by nanahira's avatar nanahira

async in deck dashboard

parent 77e2addb
...@@ -28,6 +28,9 @@ var challonge; ...@@ -28,6 +28,9 @@ var challonge;
if (challonge_config.enabled) { if (challonge_config.enabled) {
challonge = require('challonge').createClient(challonge_config.options); challonge = require('challonge').createClient(challonge_config.options);
} }
let _async = require("async");
const os = require("os");
const PROCESS_COUNT = os.cpus().length;
//http长连接 //http长连接
var responder; var responder;
...@@ -95,7 +98,7 @@ var readDeck = function(deck_name, deck_full_path) { ...@@ -95,7 +98,7 @@ var readDeck = function(deck_name, deck_full_path) {
} }
//读取指定文件夹中所有卡组 //读取指定文件夹中所有卡组
var getDecks = function() { var getDecks = function(callback) {
var decks=[]; var decks=[];
var decks_list = fs.readdirSync(config.deck_path); var decks_list = fs.readdirSync(config.deck_path);
for (var k in decks_list) { for (var k in decks_list) {
...@@ -105,34 +108,43 @@ var getDecks = function() { ...@@ -105,34 +108,43 @@ var getDecks = function() {
decks.push(deck); decks.push(deck);
} }
} }
return decks; _async.auto({
readDir: (done) => {
fs.readdir(config.deck_path, done);
},
handleDecks: ["readDir", (results, done) => {
const decks_list = results.readDir;
_async.each(decks_list, (deck_name, _done) => {
if (_.endsWith(deck_name, ".ydk")) {
var deck = readDeck(deck_name, config.deck_path + deck_name);
decks.push(deck);
}
}, done)
}]
}, callback);
} }
var delDeck = function(deck_name) { var delDeck = function (deck_name, callback) {
var result=0; if (deck_name.startsWith("../") || deck_name.contains("/../")) { //security issue
try { callback("Invalid deck");
fs.unlinkSync(config.deck_path+deck_name);
result="已删除"+deck_name+"";
}
catch(e) {
result=e.toString();
}
finally {
return result;
} }
fs.unlink(config.deck_path + deck_name, callback);
} }
var clearDecks = function() { var clearDecks = function (callback) {
var decks_list = fs.readdirSync(config.deck_path); _async.auto({
for (var k in decks_list) { deckList: (done) => {
var deck_name = decks_list[k]; fs.readdir(config.deck_path, done);
if (_.endsWith(deck_name, ".ydk")) { },
delDeck(deck_name); removeAll: ["deckList", (results, done) => {
} const decks_list = results.deckList;
} _async.each(decks_list, delDeck, done);
}]
}, callback);
} }
var UploadToChallonge = function() { var UploadToChallonge = function () {
if (!challonge) { if (!challonge) {
sendResponse("未开启Challonge模式。"); sendResponse("未开启Challonge模式。");
return false; return false;
...@@ -150,47 +162,41 @@ var UploadToChallonge = function() { ...@@ -150,47 +162,41 @@ var UploadToChallonge = function() {
sendResponse("玩家列表为空。"); sendResponse("玩家列表为空。");
return false; return false;
} }
sendResponse("读取玩家列表完毕,共有"+player_list.length+"名玩家。"); sendResponse("读取玩家列表完毕,共有" + player_list.length + "名玩家。");
sendResponse("开始上传玩家列表至Challonge。"); sendResponse("开始上传玩家列表至Challonge。");
var success_count = [0]; _async.each(player_list, (player_name, done) => {
for (var k in player_list) { sendResponse("正在上传玩家 " + player_name + " 至Challonge。");
var player_name = player_list[k];
sendResponse("正在上传玩家 "+player_name+" 至Challonge。");
challonge.participants.create({ challonge.participants.create({
id: challonge_config.tournament_id, id: challonge_config.tournament_id,
participant: { participant: {
name: player_name name: player_name
}, },
callback: (function(player_name, success_count) { callback: (err, data) => {
return function(err, data) { if (err) {
if (err) { sendResponse("玩家 "+player_name+" 上传失败:"+err.text);
sendResponse("玩家 "+player_name+" 上传失败:"+err.text); } else {
if (data.participant) {
sendResponse("玩家 "+player_name+" 上传完毕,其Challonge ID是 "+data.participant.id+"");
} else { } else {
if (data.participant) { sendResponse("玩家 "+player_name+" 上传完毕。");
sendResponse("玩家 "+player_name+" 上传完毕,其Challonge ID是 "+data.participant.id+"");
} else {
sendResponse("玩家 "+player_name+" 上传完毕。");
}
++success_count[0];
if (success_count[0] >= player_list.length) {
sendResponse("玩家列表上传完成。");
}
} }
}; }
})(player_name, success_count) done();
}
}); });
} }, (err) => {
sendResponse("玩家列表上传完成。");
});
return true; return true;
} }
var receiveDecks = function(files) { var receiveDecks = function(files, callback) {
var result=[]; var result = [];
for (var i in files) { _async.each(files, (file, done) => {
var file=files[i];
if (_.endsWith(file.name, ".ydk")) { if (_.endsWith(file.name, ".ydk")) {
var deck=readDeck(file.name, file.path); var deck = readDeck(file.name, file.path);
if (deck.main.length>=40) { if (deck.main.length >= 40) {
fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path+file.name)); fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path + file.name));
result.push({ result.push({
file: file.name, file: file.name,
status: "OK" status: "OK"
...@@ -209,8 +215,8 @@ var receiveDecks = function(files) { ...@@ -209,8 +215,8 @@ var receiveDecks = function(files) {
status: "不是卡组文件" status: "不是卡组文件"
}); });
} }
} done();
return result; }, callback);
} }
//建立一个http服务器,接收API操作 //建立一个http服务器,接收API操作
...@@ -231,13 +237,20 @@ function requestListener(req, res) { ...@@ -231,13 +237,20 @@ function requestListener(req, res) {
} }
var form = new formidable.IncomingForm(); var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) { form.parse(req, function(err, fields, files) {
res.writeHead(200, { receiveDecks(files, (err, result) => {
"Access-Control-Allow-origin": "*", if (err) {
'content-type': 'text/plain' res.writeHead(200, {
"Access-Control-Allow-origin": "*",
'content-type': 'text/plain'
});
res.end(err.toString());
}
res.writeHead(200, {
"Access-Control-Allow-origin": "*",
'content-type': 'text/plain'
});
res.end(JSON.stringify(result));
}); });
var result=receiveDecks(files);
//console.log(files);
res.end(JSON.stringify(result));
}); });
} }
else if (u.pathname === '/api/msg') { else if (u.pathname === '/api/msg') {
...@@ -276,9 +289,15 @@ function requestListener(req, res) { ...@@ -276,9 +289,15 @@ function requestListener(req, res) {
res.end("Auth Failed."); res.end("Auth Failed.");
return; return;
} }
res.writeHead(200); getDecks((err, decks) => {
var decklist=getDecks(); if (err) {
res.end(u.query.callback+'('+JSON.stringify(decklist)+');'); res.writeHead(500);
res.end(u.query.callback + '(' + err.toString() +');');
} else {
res.writeHead(200);
res.end(u.query.callback+'('+JSON.stringify(decks)+');');
}
})
} }
else if (u.pathname === '/api/del_deck') { else if (u.pathname === '/api/del_deck') {
if (!auth.auth(u.query.username, u.query.password, "deck_dashboard_write", "delete_deck")) { if (!auth.auth(u.query.username, u.query.password, "deck_dashboard_write", "delete_deck")) {
...@@ -287,8 +306,16 @@ function requestListener(req, res) { ...@@ -287,8 +306,16 @@ function requestListener(req, res) {
return; return;
} }
res.writeHead(200); res.writeHead(200);
var result=delDeck(u.query.msg); delDeck(u.query.msg, (err) => {
res.end(u.query.callback+'("'+result+'");'); let result;
if (err) {
result = "删除卡组 " + u.query.msg + "失败: " + err.toString();
} else {
result = "删除卡组 " + u.query.msg + "成功。";
}
res.writeHead(200);
res.end(u.query.callback+'("'+result+'");');
});
} }
else if (u.pathname === '/api/clear_decks') { else if (u.pathname === '/api/clear_decks') {
if (!auth.auth(u.query.username, u.query.password, "deck_dashboard_write", "clear_decks")) { if (!auth.auth(u.query.username, u.query.password, "deck_dashboard_write", "clear_decks")) {
...@@ -296,8 +323,17 @@ function requestListener(req, res) { ...@@ -296,8 +323,17 @@ function requestListener(req, res) {
res.end("Auth Failed."); res.end("Auth Failed.");
return; return;
} }
clearDecks((err) => {
let result;
if (err) {
result = "删除全部卡组失败。" + err.toString();
} else {
result = "删除全部卡组成功。";
}
res.writeHead(200);
res.end(u.query.callback+'("'+result+'");');
});
res.writeHead(200); res.writeHead(200);
clearDecks();
res.end(u.query.callback+'("已删除全部卡组。");'); res.end(u.query.callback+'("已删除全部卡组。");');
} }
else if (u.pathname === '/api/upload_to_challonge') { else if (u.pathname === '/api/upload_to_challonge') {
......
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