Commit 4b7b4d27 authored by nanahira's avatar nanahira

Merge branch 'mc'

parents 8051ef3e d5af6dcb
...@@ -11,6 +11,7 @@ var http = require('http'); ...@@ -11,6 +11,7 @@ var http = require('http');
var https = require('https'); var https = require('https');
var sqlite3 = require('sqlite3').verbose(); var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var exec = require('child_process').exec;
var execSync = require('child_process').execSync; var execSync = require('child_process').execSync;
var spawn = require('child_process').spawn; var spawn = require('child_process').spawn;
var url = require('url'); var url = require('url');
...@@ -32,6 +33,7 @@ var cardHTMLs=[]; ...@@ -32,6 +33,7 @@ var cardHTMLs=[];
var responder; var responder;
//URL里的更新时间戳 //URL里的更新时间戳
var dataver = moment().format("YYYYMMDDHHmmss"); var dataver = moment().format("YYYYMMDDHHmmss");
const _async = require("async");
//输出反馈信息,如有http长连接则输出到http,否则输出到控制台 //输出反馈信息,如有http长连接则输出到http,否则输出到控制台
var sendResponse = function(text) { var sendResponse = function(text) {
...@@ -46,7 +48,7 @@ var sendResponse = function(text) { ...@@ -46,7 +48,7 @@ var sendResponse = function(text) {
} }
//读取数据库内内容到cardHTMLs,异步 //读取数据库内内容到cardHTMLs,异步
var loadDb = function(db_file) { var loadDb = function(db_file, callback) {
var db = new sqlite3.Database(db_file); var db = new sqlite3.Database(db_file);
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) { db.each("select * from datas,texts where datas.id=texts.id", function (err,result) {
...@@ -196,11 +198,12 @@ var loadDb = function(db_file) { ...@@ -196,11 +198,12 @@ var loadDb = function(db_file) {
dataver = moment().format("YYYYMMDDHHmmss"); dataver = moment().format("YYYYMMDDHHmmss");
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。"); sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
} }
callback(err, num);
}); });
} }
//将cardHTMLs中内容更新到指定列表页,同步 //将cardHTMLs中内容更新到指定列表页,同步
var writeToFile = function(message) { var writeToFile = function(message, callback) {
var fileContent=fs.readFileSync(config.html_path+config.html_filename, {"encoding":"utf-8"}); var fileContent=fs.readFileSync(config.html_path+config.html_filename, {"encoding":"utf-8"});
var newContent=cardHTMLs.join("\n"); var newContent=cardHTMLs.join("\n");
fileContent=fileContent.replace(/<tbody class="auto-generated">[\w\W]*<\/tbody>/,'<tbody class="auto-generated">\n'+newContent+'\n</tbody>'); fileContent=fileContent.replace(/<tbody class="auto-generated">[\w\W]*<\/tbody>/,'<tbody class="auto-generated">\n'+newContent+'\n</tbody>');
...@@ -210,25 +213,39 @@ var writeToFile = function(message) { ...@@ -210,25 +213,39 @@ var writeToFile = function(message) {
message="<li>"+moment().format('L HH:mm')+"<ul><li>"+message.split("!换行符!").join("</li><li>")+"</li></ul></li>"; message="<li>"+moment().format('L HH:mm')+"<ul><li>"+message.split("!换行符!").join("</li><li>")+"</li></ul></li>";
fileContent=fileContent.replace(/<ul class="auto-generated">/,'<ul class="auto-generated">\n'+message); fileContent=fileContent.replace(/<ul class="auto-generated">/,'<ul class="auto-generated">\n'+message);
} }
fs.writeFileSync(config.html_path+config.html_filename, fileContent); fs.writeFile(config.html_path + config.html_filename, fileContent, (err) => {
sendResponse("列表更新完成。"); if (!err) {
/* sendResponse("列表更新完成。");
if (!config.cdn.enabled) { }
callback(err);
});
/*if (!config.cdn.enabled) {
copyImages(); copyImages();
} }*/
*/
} }
//读取指定文件夹里所有数据库,异步 //读取指定文件夹里所有数据库,异步
var loadAllDbs = function() { var loadAllDbs = function(callback) {
cardHTMLs=[]; cardHTMLs=[];
var files = fs.readdirSync(config.db_path+"expansions/"); _async.auto({
for (var i in files) { files: (done) => {
var filename = files[i]; fs.readdir(config.db_path + "expansions/", done);
if (filename.slice(-4) === ".cdb" && (!config.only_show_dbs || config.only_show_dbs.length==0 || config.only_show_dbs[filename])) { },
loadDb(config.db_path+"expansions/"+filename); loadDbs: ["files", (results, done) => {
} _async.each(results.files.filter((filename) => {
} return filename.slice(-4) === ".cdb" && (!config.only_show_dbs || config.only_show_dbs.length == 0 || config.only_show_dbs[filename])
} ), loadDb, done);
}]
}, callback);
}
function execCommands(commands, callback) {
_async.eachSeries(commands, (command, done) => {
exec(command, (err) => {
done(err);
});
}, callback);
} }
//从远程更新数据库,异步 //从远程更新数据库,异步
...@@ -260,18 +277,27 @@ var fetchDatas = function() { ...@@ -260,18 +277,27 @@ var fetchDatas = function() {
} }
//更新本地网页到服务器,异步 //更新本地网页到服务器,异步
var pushDatas = function() { var pushDatas = function(callback) {
if (config.cdn.enabled) { if (config.cdn.enabled) {
uploadCDN(config.cdn.local, config.cdn.remote + "/" + dataver, function () { _async.auto({
uploadCDN(config.db_path + "pics", config.cdn.pics_remote + "pics", function () { local: (done) => {
uploadCDN(config.cdn.local, config.cdn.remote + "/" + dataver, done);
},
pics: (done) => {
uploadCDN(config.db_path + "pics", config.cdn.pics_remote + "pics", done);
},
push: ["local", "pics", (results, done) => {
sendResponse("CDN上传全部完成。"); sendResponse("CDN上传全部完成。");
}); pushHTMLs(done);
}); }]
}, callback);
} else {
pushHTMLs(callback);
} }
pushHTMLs();
} }
var pushHTMLs = function() { var pushHTMLs = function(callback) {
sendResponse("开始上传到网页。"); sendResponse("开始上传到网页。");
try { try {
execSync('git add --all .', { cwd: config.git_html_path, env: process.env }); execSync('git add --all .', { cwd: config.git_html_path, env: process.env });
...@@ -297,6 +323,7 @@ var pushHTMLs = function() { ...@@ -297,6 +323,7 @@ var pushHTMLs = function() {
proc.on('close', (function(git) { proc.on('close', (function(git) {
return function(code) { return function(code) {
sendResponse(git.name + "上传完成。"); sendResponse(git.name + "上传完成。");
callback();
} }
})(git)); })(git));
} }
...@@ -327,39 +354,44 @@ var uploadCDN = function(local, remote, callback) { ...@@ -327,39 +354,44 @@ var uploadCDN = function(local, remote, callback) {
}); });
} }
//将数据库文件夹里卡图复制到列表页对应文件夹里,同步 //将数据库文件夹里卡图复制到列表页对应文件夹里,异步
var copyImages = function() { var copyImages = function (callback) {
execSync('rm -rf "' + config.html_path+config.html_img_rel_path +'"'); const commands = [
execSync('cp -r "' + config.db_path + 'pics' + '" "' + config.html_path + config.html_img_rel_path + '"'); 'rm -rf "' + config.html_path + config.html_img_rel_path + '"',
execSync('rm -rf "' + config.html_path+config.html_img_rel_path +'field"'); 'cp -r "' + config.db_path + 'pics' + '" "' + config.html_path + config.html_img_rel_path + '"',
sendResponse("卡图复制完成。"); 'rm -rf "' + config.html_path+config.html_img_rel_path +'field"',
]
execCommands(commands, (err) => {
if (err) {
sendResponse("卡图复制失败: " + err.toString());
} else {
sendResponse("卡图复制完成。");
}
callback(err);
});
} }
//将数据库文件夹复制到YGOPRO文件夹里,同步 //将数据库文件夹复制到YGOPRO文件夹里,同步
var copyToYGOPRO = function() { var copyToYGOPRO = function(callback) {
execSync('rm -rf ' + config.ygopro_path + 'expansions/*' + ''); const commands = [
execSync('cp -rf "' + config.db_path + 'expansions' + '" "' + config.ygopro_path + '"'); 'rm -rf ' + config.ygopro_path + 'expansions/*' + '',
execSync('cp -rf "' + config.db_path + 'script' + '" "' + config.ygopro_path + 'expansions"'); 'cp -rf "' + config.db_path + 'expansions' + '" "' + config.ygopro_path + '"',
try { 'cp -rf "' + config.db_path + 'script' + '" "' + config.ygopro_path + 'expansions"',
execSync('cp -rf "' + config.db_path + 'lflist.conf' + '" "' + config.ygopro_path + '"'); 'cp -rf "' + config.db_path + 'lflist.conf' + '" "' + config.ygopro_path + '" || true'
} ]
catch (e) {} execCommands(commands, (err) => {
sendResponse("更新完成。"); if (err) {
sendResponse("更新失败: " + err.toString());
} else {
sendResponse("更新完成。");
}
callback(err);
});
} }
//生成更新包,异步 function run7z(params, callback) {
var packDatas = function () { let proc = spawn(settings.modules.tournament_mode.replay_archive_tool, params, { cwd: config.db_path, env: process.env });
file_path = config.html_path;
if (config.cdn.enabled) {
file_path = config.cdn.local;
}
execSync('cp -r "' + config.db_path +'expansions" "'+ config.db_path +'cdb"');
execSync('cp -r "' + config.db_path +'script" "'+ config.db_path +'expansions/script"');
execSync('cp -r "' + config.db_path +'field" "'+ config.db_path +'pics/field"');
execSync('cp -r "' + config.db_path +'pics" "'+ config.db_path +'expansions/pics"');
execSync('cp -r "' + config.db_path +'picn" "'+ config.db_path +'picture/card"');
execSync('cp -r "' + config.db_path +'field" "'+ config.db_path +'picture/field"');
var proc = spawn("7za", ["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!mobile.cdb", "-x!cdb", "-x!picn", "-x!field", "-x!script", "-x!pics", "-x!expansions/pics/thumbnail", "-x!picture", "ygosrv233-pre.zip", "*"], { cwd: config.db_path, env: process.env });
proc.stdout.setEncoding('utf8'); proc.stdout.setEncoding('utf8');
proc.stdout.on('data', function(data) { proc.stdout.on('data', function(data) {
//sendResponse("7z: "+data); //sendResponse("7z: "+data);
...@@ -369,41 +401,74 @@ var packDatas = function () { ...@@ -369,41 +401,74 @@ var packDatas = function () {
sendResponse("7z error: "+data); sendResponse("7z error: "+data);
}); });
proc.on('close', function (code) { proc.on('close', function (code) {
execSync('mv -f "' + config.db_path + 'ygosrv233-pre.zip" "' + file_path + '"'); callback(code === 0 ? null : "exit " + code);
execSync('rm -rf "' + config.db_path +'expansions/script"'); }
execSync('rm -rf "' + config.db_path +'expansions/pics"'); }
sendResponse("电脑更新包打包完成。");
}); //生成更新包,异步
var proc2 = spawn("7za", ["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!expansions/pics", "-x!expansions/script", "-x!cdb", "-x!picn", "-x!field", "-x!pics/thumbnail", "-x!picture", "ygosrv233-pre-mobile.zip", "*"], { cwd: config.db_path, env: process.env }); var packDatas = function (callback) {
proc2.stdout.setEncoding('utf8'); file_path = config.html_path;
proc2.stdout.on('data', function(data) { if (config.cdn.enabled) {
//sendResponse("7z: "+data); file_path = config.cdn.local;
}); }
proc2.stderr.setEncoding('utf8');
proc2.stderr.on('data', function(data) { _async.auto({
sendResponse("7z error: "+data); preCommands: (done) => {
}); execCommands([
proc2.on('close', function (code) { 'cp -r "' + config.db_path + 'expansions" "' + config.db_path + 'cdb"',
execSync('mv -f "' + config.db_path +'ygosrv233-pre-mobile.zip" "'+ file_path +'"'); 'cp -r "' + config.db_path + 'script" "' + config.db_path + 'expansions/script"',
execSync('rm -rf "' + config.db_path +'pics/field"'); 'cp -r "' + config.db_path + 'field" "' + config.db_path + 'pics/field"',
sendResponse("手机更新包打包完成。"); 'cp -r "' + config.db_path + 'pics" "' + config.db_path + 'expansions/pics"',
}); 'cp -r "' + config.db_path + 'picn" "' + config.db_path + 'picture/card"',
var proc3 = spawn("7za", ["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!expansions", "-x!pics", "-x!picn", "-x!field", "ygosrv233-pre-2.zip", "*"], { cwd: config.db_path, env: process.env }); 'cp -r "' + config.db_path + 'field" "' + config.db_path + 'picture/field"'
proc3.stdout.setEncoding('utf8'); ], done);
proc3.stdout.on('data', function(data) { },
//sendResponse("7z: "+data); run7zPC: ["preCommands", (results, done) => {
}); run7z(["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!mobile.cdb", "-x!cdb", "-x!picn", "-x!field", "-x!script", "-x!pics", "-x!expansions/pics/thumbnail", "-x!picture", "ygosrv233-pre.zip", "*"], done);
proc3.stderr.setEncoding('utf8'); }],
proc3.stderr.on('data', function(data) { run7zMobile: ["preCommands", (results, done) => {
sendResponse("7z error: "+data); run7z(["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!mobile.cdb", "-x!cdb", "-x!picn", "-x!field", "-x!script", "-x!pics", "-x!expansions/pics/thumbnail", "-x!picture", "ygosrv233-pre.zip", "*"], done);
}); }],
proc3.on('close', function (code) { run7zPro2: ["preCommands", (results, done) => {
execSync('mv -f "' + config.db_path + 'ygosrv233-pre-2.zip" "' + file_path + '"'); run7z(["a", "-x!*.zip", "-x!.git", "-x!LICENSE", "-x!README.md", "-x!mobile.cdb", "-x!cdb", "-x!picn", "-x!field", "-x!script", "-x!pics", "-x!expansions/pics/thumbnail", "-x!picture", "ygosrv233-pre.zip", "*"], done);
execSync('rm -rf "' + config.db_path +'cdb"'); }],
execSync('rm -rf "' + config.db_path +'picture/card"'); commandsAfterPC: ["run7zPC", (results, done) => {
execSync('rm -rf "' + config.db_path +'picture/field"'); execCommands([
sendResponse("PRO2更新包打包完成。"); 'mv -f "' + config.db_path + 'ygosrv233-pre.zip" "' + file_path + '"',
}); 'rm -rf "' + config.db_path +'expansions/script"',
'rm -rf "' + config.db_path +'expansions/pics"'
], (err) => {
if (!err) {
sendResponse("电脑更新包打包完成。");
}
done(err);
});
}],
commandsAfterMobile: ["run7zMobile", (results, done) => {
execCommands([
'mv -f "' + config.db_path +'ygosrv233-pre-mobile.zip" "'+ file_path +'"',
'rm -rf "' + config.db_path +'pics/field"'
], (err) => {
if (!err) {
sendResponse("手机更新包打包完成。");
}
done(err);
});
}],
commandsAfterPro2: ["run7zPro2", (results, done) => {
execCommands([
'mv -f "' + config.db_path + 'ygosrv233-pre-2.zip" "' + file_path + '"',
'rm -rf "' + config.db_path +'cdb"',
'rm -rf "' + config.db_path +'picture/card"',
'rm -rf "' + config.db_path +'picture/field"'
], (err) => {
if (!err) {
sendResponse("Pro2更新包打包完成。");
}
done(err);
});
}]
}, callback);
} }
//建立一个http服务器,接收API操作 //建立一个http服务器,接收API操作
...@@ -435,7 +500,7 @@ function requestListener(req, res) { ...@@ -435,7 +500,7 @@ function requestListener(req, res) {
else if (u.pathname === '/api/load_db') { else if (u.pathname === '/api/load_db') {
res.writeHead(200); res.writeHead(200);
res.end(u.query.callback+'({"message":"开始加载数据库。"});'); res.end(u.query.callback+'({"message":"开始加载数据库。"});');
loadAllDbs(); loadAllDbs(() => { });
} }
else if (u.pathname === '/api/fetch_datas') { else if (u.pathname === '/api/fetch_datas') {
res.writeHead(200); res.writeHead(200);
...@@ -445,22 +510,22 @@ function requestListener(req, res) { ...@@ -445,22 +510,22 @@ function requestListener(req, res) {
else if (u.pathname === '/api/push_datas') { else if (u.pathname === '/api/push_datas') {
res.writeHead(200); res.writeHead(200);
res.end(u.query.callback+'({"message":"开始上传数据。"});'); res.end(u.query.callback+'({"message":"开始上传数据。"});');
pushDatas(); pushDatas(() => { });
} }
else if (u.pathname === '/api/write_to_file') { else if (u.pathname === '/api/write_to_file') {
res.writeHead(200); res.writeHead(200);
res.end(u.query.callback+'({"message":"开始写列表页。"});'); res.end(u.query.callback+'({"message":"开始写列表页。"});');
writeToFile(u.query.message); writeToFile(u.query.message, () => { });
} }
else if (u.pathname === '/api/copy_to_ygopro') { else if (u.pathname === '/api/copy_to_ygopro') {
res.writeHead(200); res.writeHead(200);
res.end(u.query.callback+'({"message":"开始更新到服务器。"});'); res.end(u.query.callback+'({"message":"开始更新到服务器。"});');
copyToYGOPRO(); copyToYGOPRO(() => { });
} }
else if (u.pathname === '/api/pack_data') { else if (u.pathname === '/api/pack_data') {
res.writeHead(200); res.writeHead(200);
res.end(u.query.callback+'({"message":"开始生成更新包。"});'); res.end(u.query.callback+'({"message":"开始生成更新包。"});');
packDatas(); packDatas(() => { });
} }
else { else {
res.writeHead(400); res.writeHead(400);
......
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