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 @@
读取指定文件夹里所有卡组,得出卡片使用量,生成csv
*/
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs');
var initSqlJs = require('sql.js');
var loadJSON = require('load-json-file').sync;
var config = loadJSON('./config/deckstats.json'); //{ "deckpath": "../decks", "dbfile": "cards.cdb" }
var constants = loadJSON('./data/constants.json');
......@@ -16,6 +16,23 @@ var ALL_MAIN_CARDS={};
var ALL_SIDE_CARDS={};
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) {
if (deck[id]) {
deck[id]=deck[id]+1;
......@@ -70,15 +87,14 @@ function read_deck_file(filename) {
}
function load_database(callback) {
var db=new sqlite3.Database(config.dbfile);
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) {
if (err) {
console.log(config.dbfile + ":" + err);
return;
}
else {
ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(config.dbfile);
var db = new SQL.Database(dbBuffer);
var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
while (stmt.step()) {
var result = stmt.getAsObject();
if (result.type & constants.TYPES.TYPE_TOKEN) {
return;
continue;
}
var card={};
......@@ -140,7 +156,17 @@ function load_database(callback) {
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() {
......@@ -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 @@
*/
var http = require('http');
var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs');
var initSqlJs = require('sql.js');
var exec = require('child_process').exec;
var execSync = require('child_process').execSync;
var spawn = require('child_process').spawn;
......@@ -36,6 +36,23 @@ var responder;
var dataver = moment().format("YYYYMMDDHHmmss");
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,否则输出到控制台
var sendResponse = function(text) {
text=""+text;
......@@ -50,18 +67,17 @@ var sendResponse = function(text) {
//读取数据库内内容到cardHTMLs,异步
var loadDb = function(db_file, callback) {
var db = new sqlite3.Database(db_file);
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) {
if (err) {
sendResponse(db_file + ":" + err);
return;
}
else {
ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
var db = new SQL.Database(dbBuffer);
var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
var num = 0;
while (stmt.step()) {
var result = stmt.getAsObject();
if (result.type & constants.TYPES.TYPE_TOKEN) {
return;
continue;
}
var cardHTML="<tr>";
cardHTML+='<td><a href="'+ config.html_img_rel_path + result.id +'.jpg" target="_blank"><img data-original="'+config.html_img_rel_path+config.html_img_thumbnail+ result.id +'.jpg'+ config.html_img_thumbnail_suffix +'" alt="'+ result.name +'"></a></td>';
......@@ -191,16 +207,16 @@ var loadDb = function(db_file, callback) {
cardHTML+='</tr>';
cardHTMLs.push(cardHTML);
num++;
}
}, function(err, num) {
if(err) {
sendResponse(db_file + ":" + err);
}
else {
dataver = moment().format("YYYYMMDDHHmmss");
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
}
callback(err, num);
stmt.free();
db.close();
dataver = moment().format("YYYYMMDDHHmmss");
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
callback(null, num);
}).catch(function(err) {
sendResponse(db_file + ":" + err);
callback(err);
});
}
......@@ -579,14 +595,20 @@ async function requestListener(req, res) {
}
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key);
const options = {
cert: ssl_cert,
key: ssl_key
function startServer() {
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key);
const options = {
cert: ssl_cert,
key: ssl_key
}
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
}
https.createServer(options, requestListener).listen(config.port);
} else {
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) ->
await ygopro.helper.send(sk, buffer)
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
constructor: (name, @hostinfo) ->
@name = name
......@@ -1643,26 +1665,7 @@ class Room
param.push(firstSeedBuf.toString('base64'))
try
@process = 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(',')
}
}
)
@process = global.rawSpawn.call this, param
@process_pid = @process.pid
@process.on 'error', (err)=>
log.warn 'CREATE ROOM ERROR', err
......@@ -1714,6 +1717,8 @@ class Room
score_form = { name: name, score: score, deck: null, name_vpass: name_vpass }
if @decks[name]
score_form.deck = @decks[name]
if @deck_history[name]
score_form.deck_history = @deck_history[name]
score_array.push score_form
if settings.modules.random_duel.record_match_scores and @random_type == 'M'
if score_array.length == 2
......@@ -1751,6 +1756,8 @@ class Room
form_data.append 'userscoreB', score_array[1].score
form_data.append 'userdeckA', score_array[0].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 'replays', JSON.stringify formatted_replays
form_data.append 'start', @start_time
......@@ -3469,7 +3476,10 @@ ygopro.stoc_follow 'DUEL_START', true, (buffer, info, client, server, datas)->
deck_text = null
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'
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
deck_arena = settings.modules.deck_log.arena + '-'
if room.arena
......
......@@ -1851,6 +1851,21 @@
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 {
constructor(name, hostinfo) {
var death_time, draw_count, duel_rule, extra_mode_func, lflist, param, rule, start_hand, start_lp, time_limit;
......@@ -2120,18 +2135,7 @@
param.push(firstSeedBuf.toString('base64'));
}
try {
this.process = 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(',')
}
});
this.process = global.rawSpawn.call(this, param);
this.process_pid = this.process.pid;
this.process.on('error', (err) => {
log.warn('CREATE ROOM ERROR', err);
......@@ -2210,6 +2214,9 @@
if (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);
}
if (settings.modules.random_duel.record_match_scores && this.random_type === 'M') {
......@@ -2270,6 +2277,8 @@
form_data.append('userscoreB', score_array[1].score);
form_data.append('userdeckA', score_array[0].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('replays', JSON.stringify(formatted_replays));
form_data.append('start', this.start_time);
......@@ -4613,7 +4622,16 @@
deck_text = null;
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';
room.decks[client.name] = deck_text;
if (!room.decks[client.name]) {
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) {
deck_arena = settings.modules.deck_log.arena + '-';
......
......@@ -9,8 +9,8 @@
*/
var http = require('http');
var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs');
var initSqlJs = require('sql.js');
var execSync = require('child_process').execSync;
var spawn = require('child_process').spawn;
var spawnSync = require('child_process').spawnSync;
......@@ -34,6 +34,23 @@ var changelog=[];
//http长连接
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,否则输出到控制台
var sendResponse = function(text) {
text=""+text;
......@@ -48,23 +65,21 @@ var sendResponse = function(text) {
//读取数据库内内容到cardNames,异步
var loadDb = function(db_file) {
var db = new sqlite3.Database(db_file);
db.each("select id,name from texts", function (err,result) {
if (err) {
sendResponse(db_file + ":" + err);
return;
}
else {
ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
var db = new SQL.Database(dbBuffer);
var stmt = db.prepare("select id,name from texts");
var num = 0;
while (stmt.step()) {
var result = stmt.getAsObject();
cardNames[result.id] = result.name;
num++;
}
}, function(err, num) {
if(err) {
sendResponse(db_file + ":" + err);
}
else {
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
}
stmt.free();
db.close();
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
}).catch(function(err) {
sendResponse(db_file + ":" + err);
});
}
......@@ -298,14 +313,20 @@ async function requestListener(req, res) {
}
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key);
const options = {
cert: ssl_cert,
key: ssl_key
function startServer() {
if (ssl_config.enabled) {
const ssl_cert = fs.readFileSync(ssl_config.cert);
const ssl_key = fs.readFileSync(ssl_config.key);
const options = {
cert: ssl_cert,
key: ssl_key
}
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
}
https.createServer(options, requestListener).listen(config.port);
} else {
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