Commit a094c5af authored by nanahira's avatar nanahira

Merge branch 'master' of ../srvpro

parents d5126aac 94a0677b
Pipeline #42898 passed with stages
in 8 minutes and 18 seconds
This diff is collapsed.
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
读取指定文件夹里所有卡组,得出卡片使用量,生成csv 读取指定文件夹里所有卡组,得出卡片使用量,生成csv
*/ */
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
var loadJSON = require('load-json-file').sync; var loadJSON = require('load-json-file').sync;
var config = loadJSON('./config/deckstats.json'); //{ "deckpath": "../decks", "dbfile": "cards.cdb" } var config = loadJSON('./config/deckstats.json'); //{ "deckpath": "../decks", "dbfile": "cards.cdb" }
var constants = loadJSON('./data/constants.json'); var constants = loadJSON('./data/constants.json');
...@@ -16,6 +16,23 @@ var ALL_MAIN_CARDS={}; ...@@ -16,6 +16,23 @@ var ALL_MAIN_CARDS={};
var ALL_SIDE_CARDS={}; var ALL_SIDE_CARDS={};
var ALL_CARD_DATAS={}; var ALL_CARD_DATAS={};
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
function add_to_deck(deck,id) { function add_to_deck(deck,id) {
if (deck[id]) { if (deck[id]) {
deck[id]=deck[id]+1; deck[id]=deck[id]+1;
...@@ -70,15 +87,14 @@ function read_deck_file(filename) { ...@@ -70,15 +87,14 @@ function read_deck_file(filename) {
} }
function load_database(callback) { function load_database(callback) {
var db=new sqlite3.Database(config.dbfile); ensureSqlJs().then(function() {
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) { var dbBuffer = fs.readFileSync(config.dbfile);
if (err) { var db = new SQL.Database(dbBuffer);
console.log(config.dbfile + ":" + err); var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
if (result.type & constants.TYPES.TYPE_TOKEN) { if (result.type & constants.TYPES.TYPE_TOKEN) {
return; continue;
} }
var card={}; var card={};
...@@ -140,7 +156,17 @@ function load_database(callback) { ...@@ -140,7 +156,17 @@ function load_database(callback) {
ALL_CARD_DATAS[result.id]=card; ALL_CARD_DATAS[result.id]=card;
} }
}, callback); stmt.free();
db.close();
if (callback) {
callback();
}
}).catch(function(err) {
console.log(config.dbfile + ":" + err);
if (callback) {
callback(err);
}
});
} }
function read_decks() { function read_decks() {
...@@ -190,5 +216,8 @@ function output_csv(list,filename) { ...@@ -190,5 +216,8 @@ function output_csv(list,filename) {
} }
} }
load_database(read_decks); ensureSqlJs().then(function() {
load_database(read_decks);
}).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
*/ */
var http = require('http'); var http = require('http');
var https = require('https'); var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
var exec = require('child_process').exec; 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;
...@@ -36,6 +36,23 @@ var responder; ...@@ -36,6 +36,23 @@ var responder;
var dataver = moment().format("YYYYMMDDHHmmss"); var dataver = moment().format("YYYYMMDDHHmmss");
const _async = require("async"); const _async = require("async");
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
//输出反馈信息,如有http长连接则输出到http,否则输出到控制台 //输出反馈信息,如有http长连接则输出到http,否则输出到控制台
var sendResponse = function(text) { var sendResponse = function(text) {
text=""+text; text=""+text;
...@@ -50,16 +67,15 @@ var sendResponse = function(text) { ...@@ -50,16 +67,15 @@ var sendResponse = function(text) {
//读取数据库内内容到cardHTMLs,异步 //读取数据库内内容到cardHTMLs,异步
var loadDb = function(db_file, callback) { var loadDb = function(db_file, callback) {
var db = new sqlite3.Database(db_file); ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) { var db = new SQL.Database(dbBuffer);
if (err) { var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
sendResponse(db_file + ":" + err); var num = 0;
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
if (result.type & constants.TYPES.TYPE_TOKEN) { if (result.type & constants.TYPES.TYPE_TOKEN) {
return; continue;
} }
var cardHTML="<tr>"; var cardHTML="<tr>";
...@@ -191,16 +207,16 @@ var loadDb = function(db_file, callback) { ...@@ -191,16 +207,16 @@ var loadDb = function(db_file, callback) {
cardHTML+='</tr>'; cardHTML+='</tr>';
cardHTMLs.push(cardHTML); cardHTMLs.push(cardHTML);
num++;
} }
}, function(err, num) { stmt.free();
if(err) { db.close();
sendResponse(db_file + ":" + err);
}
else {
dataver = moment().format("YYYYMMDDHHmmss"); dataver = moment().format("YYYYMMDDHHmmss");
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。"); sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
} callback(null, num);
callback(err, num); }).catch(function(err) {
sendResponse(db_file + ":" + err);
callback(err);
}); });
} }
...@@ -579,7 +595,8 @@ async function requestListener(req, res) { ...@@ -579,7 +595,8 @@ async function requestListener(req, res) {
} }
if (ssl_config.enabled) { function startServer() {
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert); const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key); const ssl_key = fs.readFileSync(ssl_config.key);
const options = { const options = {
...@@ -587,6 +604,11 @@ if (ssl_config.enabled) { ...@@ -587,6 +604,11 @@ if (ssl_config.enabled) {
key: ssl_key key: ssl_key
} }
https.createServer(options, requestListener).listen(config.port); https.createServer(options, requestListener).listen(config.port);
} else { } else {
http.createServer(requestListener).listen(config.port); http.createServer(requestListener).listen(config.port);
}
} }
ensureSqlJs().then(startServer).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
...@@ -1408,6 +1408,28 @@ SOCKET_flush_data = global.SOCKET_flush_data = (sk, datas) -> ...@@ -1408,6 +1408,28 @@ SOCKET_flush_data = global.SOCKET_flush_data = (sk, datas) ->
await ygopro.helper.send(sk, buffer) await ygopro.helper.send(sk, buffer)
return true return true
global.rawSpawn = (param) ->
spawn(
path.resolve(settings.modules.ygopro_path, settings.modules.ygopro_exec_path),
param,
{
cwd: path.resolve(settings.modules.ygopro_path),
env: {
...process.env,
YGOPRO_EXPANSIONS: settings.modules.expansions_path
.map((s) ->
path.resolve(settings.modules.ygopro_path, s)
)
.join(',')
YGOPRO_EXTRA_SCRIPT: settings.modules.extra_script_path
.map((s) ->
path.resolve(settings.modules.ygopro_path, s)
)
.join(',')
}
}
)
class Room class Room
constructor: (name, @hostinfo) -> constructor: (name, @hostinfo) ->
@name = name @name = name
...@@ -1643,26 +1665,7 @@ class Room ...@@ -1643,26 +1665,7 @@ class Room
param.push(firstSeedBuf.toString('base64')) param.push(firstSeedBuf.toString('base64'))
try try
@process = spawn( @process = global.rawSpawn.call this, param
path.resolve(settings.modules.ygopro_path, settings.modules.ygopro_exec_path),
param,
{
cwd: path.resolve(settings.modules.ygopro_path),
env: {
...process.env,
YGOPRO_EXPANSIONS: settings.modules.expansions_path
.map((s) ->
path.resolve(settings.modules.ygopro_path, s)
)
.join(',')
YGOPRO_EXTRA_SCRIPT: settings.modules.extra_script_path
.map((s) ->
path.resolve(settings.modules.ygopro_path, s)
)
.join(',')
}
}
)
@process_pid = @process.pid @process_pid = @process.pid
@process.on 'error', (err)=> @process.on 'error', (err)=>
log.warn 'CREATE ROOM ERROR', err log.warn 'CREATE ROOM ERROR', err
...@@ -1714,6 +1717,8 @@ class Room ...@@ -1714,6 +1717,8 @@ class Room
score_form = { name: name, score: score, deck: null, name_vpass: name_vpass } score_form = { name: name, score: score, deck: null, name_vpass: name_vpass }
if @decks[name] if @decks[name]
score_form.deck = @decks[name] score_form.deck = @decks[name]
if @deck_history[name]
score_form.deck_history = @deck_history[name]
score_array.push score_form score_array.push score_form
if settings.modules.random_duel.record_match_scores and @random_type == 'M' if settings.modules.random_duel.record_match_scores and @random_type == 'M'
if score_array.length == 2 if score_array.length == 2
...@@ -1751,6 +1756,8 @@ class Room ...@@ -1751,6 +1756,8 @@ class Room
form_data.append 'userscoreB', score_array[1].score form_data.append 'userscoreB', score_array[1].score
form_data.append 'userdeckA', score_array[0].deck form_data.append 'userdeckA', score_array[0].deck
form_data.append 'userdeckB', score_array[1].deck form_data.append 'userdeckB', score_array[1].deck
form_data.append 'userdeckAHistory', score_array[0].deck_history
form_data.append 'userdeckBHistory', score_array[1].deck_history
form_data.append 'first', JSON.stringify @first_list form_data.append 'first', JSON.stringify @first_list
form_data.append 'replays', JSON.stringify formatted_replays form_data.append 'replays', JSON.stringify formatted_replays
form_data.append 'start', @start_time form_data.append 'start', @start_time
...@@ -3469,7 +3476,10 @@ ygopro.stoc_follow 'DUEL_START', true, (buffer, info, client, server, datas)-> ...@@ -3469,7 +3476,10 @@ ygopro.stoc_follow 'DUEL_START', true, (buffer, info, client, server, datas)->
deck_text = null deck_text = null
if client.main and client.main.length if client.main and client.main.length
deck_text = '#ygopro-server deck log\n#main\n' + client.main.join('\n') + '\n!side\n' + client.side.join('\n') + '\n' deck_text = '#ygopro-server deck log\n#main\n' + client.main.join('\n') + '\n!side\n' + client.side.join('\n') + '\n'
room.decks[client.name] = deck_text room.decks[client.name] = deck_text unless room.decks[client.name]
room.deck_history = {} unless room.deck_history
room.deck_history[client.name] = [] if !room.deck_history[client.name]
room.deck_history[client.name].push deck_text
if settings.modules.deck_log.enabled and deck_text and not client.deck_saved and not room.windbot if settings.modules.deck_log.enabled and deck_text and not client.deck_saved and not room.windbot
deck_arena = settings.modules.deck_log.arena + '-' deck_arena = settings.modules.deck_log.arena + '-'
if room.arena if room.arena
......
...@@ -1851,6 +1851,21 @@ ...@@ -1851,6 +1851,21 @@
return true; return true;
}; };
global.rawSpawn = function(param) {
return spawn(path.resolve(settings.modules.ygopro_path, settings.modules.ygopro_exec_path), param, {
cwd: path.resolve(settings.modules.ygopro_path),
env: {
...process.env,
YGOPRO_EXPANSIONS: settings.modules.expansions_path.map(function(s) {
return path.resolve(settings.modules.ygopro_path, s);
}).join(','),
YGOPRO_EXTRA_SCRIPT: settings.modules.extra_script_path.map(function(s) {
return path.resolve(settings.modules.ygopro_path, s);
}).join(',')
}
});
};
Room = class Room { Room = class Room {
constructor(name, hostinfo) { constructor(name, hostinfo) {
var death_time, draw_count, duel_rule, extra_mode_func, lflist, param, rule, start_hand, start_lp, time_limit; var death_time, draw_count, duel_rule, extra_mode_func, lflist, param, rule, start_hand, start_lp, time_limit;
...@@ -2120,18 +2135,7 @@ ...@@ -2120,18 +2135,7 @@
param.push(firstSeedBuf.toString('base64')); param.push(firstSeedBuf.toString('base64'));
} }
try { try {
this.process = spawn(path.resolve(settings.modules.ygopro_path, settings.modules.ygopro_exec_path), param, { this.process = global.rawSpawn.call(this, param);
cwd: path.resolve(settings.modules.ygopro_path),
env: {
...process.env,
YGOPRO_EXPANSIONS: settings.modules.expansions_path.map(function(s) {
return path.resolve(settings.modules.ygopro_path, s);
}).join(','),
YGOPRO_EXTRA_SCRIPT: settings.modules.extra_script_path.map(function(s) {
return path.resolve(settings.modules.ygopro_path, s);
}).join(',')
}
});
this.process_pid = this.process.pid; this.process_pid = this.process.pid;
this.process.on('error', (err) => { this.process.on('error', (err) => {
log.warn('CREATE ROOM ERROR', err); log.warn('CREATE ROOM ERROR', err);
...@@ -2210,6 +2214,9 @@ ...@@ -2210,6 +2214,9 @@
if (this.decks[name]) { if (this.decks[name]) {
score_form.deck = this.decks[name]; score_form.deck = this.decks[name];
} }
if (this.deck_history[name]) {
score_form.deck_history = this.deck_history[name];
}
score_array.push(score_form); score_array.push(score_form);
} }
if (settings.modules.random_duel.record_match_scores && this.random_type === 'M') { if (settings.modules.random_duel.record_match_scores && this.random_type === 'M') {
...@@ -2270,6 +2277,8 @@ ...@@ -2270,6 +2277,8 @@
form_data.append('userscoreB', score_array[1].score); form_data.append('userscoreB', score_array[1].score);
form_data.append('userdeckA', score_array[0].deck); form_data.append('userdeckA', score_array[0].deck);
form_data.append('userdeckB', score_array[1].deck); form_data.append('userdeckB', score_array[1].deck);
form_data.append('userdeckAHistory', score_array[0].deck_history);
form_data.append('userdeckBHistory', score_array[1].deck_history);
form_data.append('first', JSON.stringify(this.first_list)); form_data.append('first', JSON.stringify(this.first_list));
form_data.append('replays', JSON.stringify(formatted_replays)); form_data.append('replays', JSON.stringify(formatted_replays));
form_data.append('start', this.start_time); form_data.append('start', this.start_time);
...@@ -4613,8 +4622,17 @@ ...@@ -4613,8 +4622,17 @@
deck_text = null; deck_text = null;
if (client.main && client.main.length) { if (client.main && client.main.length) {
deck_text = '#ygopro-server deck log\n#main\n' + client.main.join('\n') + '\n!side\n' + client.side.join('\n') + '\n'; deck_text = '#ygopro-server deck log\n#main\n' + client.main.join('\n') + '\n!side\n' + client.side.join('\n') + '\n';
if (!room.decks[client.name]) {
room.decks[client.name] = deck_text; room.decks[client.name] = deck_text;
} }
if (!room.deck_history) {
room.deck_history = {};
}
if (!room.deck_history[client.name]) {
room.deck_history[client.name] = [];
}
room.deck_history[client.name].push(deck_text);
}
if (settings.modules.deck_log.enabled && deck_text && !client.deck_saved && !room.windbot) { if (settings.modules.deck_log.enabled && deck_text && !client.deck_saved && !room.windbot) {
deck_arena = settings.modules.deck_log.arena + '-'; deck_arena = settings.modules.deck_log.arena + '-';
if (room.arena) { if (room.arena) {
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
*/ */
var http = require('http'); var http = require('http');
var https = require('https'); var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
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 spawnSync = require('child_process').spawnSync; var spawnSync = require('child_process').spawnSync;
...@@ -34,6 +34,23 @@ var changelog=[]; ...@@ -34,6 +34,23 @@ var changelog=[];
//http长连接 //http长连接
var responder; var responder;
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
//输出反馈信息,如有http长连接则输出到http,否则输出到控制台 //输出反馈信息,如有http长连接则输出到http,否则输出到控制台
var sendResponse = function(text) { var sendResponse = function(text) {
text=""+text; text=""+text;
...@@ -48,23 +65,21 @@ var sendResponse = function(text) { ...@@ -48,23 +65,21 @@ var sendResponse = function(text) {
//读取数据库内内容到cardNames,异步 //读取数据库内内容到cardNames,异步
var loadDb = function(db_file) { var loadDb = function(db_file) {
var db = new sqlite3.Database(db_file); ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
db.each("select id,name from texts", function (err,result) { var db = new SQL.Database(dbBuffer);
if (err) { var stmt = db.prepare("select id,name from texts");
sendResponse(db_file + ":" + err); var num = 0;
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
cardNames[result.id] = result.name; cardNames[result.id] = result.name;
num++;
} }
}, function(err, num) { stmt.free();
if(err) { db.close();
sendResponse(db_file + ":" + err);
}
else {
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。"); sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
} }).catch(function(err) {
sendResponse(db_file + ":" + err);
}); });
} }
...@@ -298,7 +313,8 @@ async function requestListener(req, res) { ...@@ -298,7 +313,8 @@ async function requestListener(req, res) {
} }
if (ssl_config.enabled) { function startServer() {
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert); const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key); const ssl_key = fs.readFileSync(ssl_config.key);
const options = { const options = {
...@@ -306,6 +322,11 @@ if (ssl_config.enabled) { ...@@ -306,6 +322,11 @@ if (ssl_config.enabled) {
key: ssl_key key: ssl_key
} }
https.createServer(options, requestListener).listen(config.port); https.createServer(options, requestListener).listen(config.port);
} else { } else {
http.createServer(requestListener).listen(config.port); http.createServer(requestListener).listen(config.port);
}
} }
ensureSqlJs().then(startServer).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
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