Commit 4d6dc166 authored by nanahira's avatar nanahira

Merge branch 'master' into tcg_random

parents e6250b20 9625f8b3
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 2.5.1
(function() { (function() {
var WebSocketServer, _delete, broadcast, create, init, room_data, server, settings, start, update, url; var WebSocketServer, _delete, broadcast, create, init, room_data, server, settings, start, update, url;
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
} }
return results; return results;
})(), })(),
options: room.get_old_hostinfo(), options: room.get_old_hostinfo(), // Should be updated when MyCard client updates
arena: settings.modules.arena_mode.enabled && room.arena && settings.modules.arena_mode.mode arena: settings.modules.arena_mode.enabled && room.arena && settings.modules.arena_mode.mode
}; };
}; };
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
results = []; results = [];
for (i = 0, len = ROOM_all.length; i < len; i++) { for (i = 0, len = ROOM_all.length; i < len; i++) {
room = ROOM_all[i]; room = ROOM_all[i];
if (room && room.established && (connection.filter === 'started' || !room["private"]) && ((room.duel_stage !== 0) === (connection.filter === 'started'))) { if (room && room.established && (connection.filter === 'started' || !room.private) && ((room.duel_stage !== 0) === (connection.filter === 'started'))) {
results.push(room_data(room)); results.push(room_data(room));
} }
} }
...@@ -61,19 +61,19 @@ ...@@ -61,19 +61,19 @@
}; };
create = function(room) { create = function(room) {
if (!room["private"]) { if (!room.private) {
return broadcast('create', room_data(room), 'waiting'); return broadcast('create', room_data(room), 'waiting');
} }
}; };
update = function(room) { update = function(room) {
if (!room["private"]) { if (!room.private) {
return broadcast('update', room_data(room), 'waiting'); return broadcast('update', room_data(room), 'waiting');
} }
}; };
start = function(room) { start = function(room) {
if (!room["private"]) { if (!room.private) {
broadcast('delete', room.name, 'waiting'); broadcast('delete', room.name, 'waiting');
} }
return broadcast('create', room_data(room), 'started'); return broadcast('create', room_data(room), 'started');
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
if (room.duel_stage !== 0) { if (room.duel_stage !== 0) {
return broadcast('delete', room.name, 'started'); return broadcast('delete', room.name, 'started');
} else { } else {
if (!room["private"]) { if (!room.private) {
return broadcast('delete', room.name, 'waiting'); return broadcast('delete', room.name, 'waiting');
} }
} }
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
create: create, create: create,
update: update, update: update,
start: start, start: start,
"delete": _delete delete: _delete
}; };
}).call(this); }).call(this);
...@@ -26,6 +26,7 @@ or as follows, to use a specific set of permissions. ...@@ -26,6 +26,7 @@ or as follows, to use a specific set of permissions.
### ###
fs = require 'fs' fs = require 'fs'
loadJSON = require('load-json-file').sync loadJSON = require('load-json-file').sync
loadJSONPromise = require('load-json-file')
moment = require 'moment' moment = require 'moment'
moment.updateLocale('zh-cn', { moment.updateLocale('zh-cn', {
relativeTime: { relativeTime: {
...@@ -47,6 +48,7 @@ moment.updateLocale('zh-cn', { ...@@ -47,6 +48,7 @@ moment.updateLocale('zh-cn', {
bunyan = require 'bunyan' bunyan = require 'bunyan'
log = bunyan.createLogger name: "auth" log = bunyan.createLogger name: "auth"
util = require 'util'
if not fs.existsSync('./logs') if not fs.existsSync('./logs')
fs.mkdirSync('./logs') fs.mkdirSync('./logs')
...@@ -57,16 +59,19 @@ add_log = (message) -> ...@@ -57,16 +59,19 @@ add_log = (message) ->
text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n" text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n"
res = false res = false
try try
fs.appendFileSync("./logs/"+mt.format('YYYY-MM-DD')+".log", text) await util.promisify(fs.appendFile)("./logs/"+mt.format('YYYY-MM-DD')+".log", text)
res = true res = true
catch catch
res = false res = false
return return res
default_data = loadJSON('./data/default_data.json') default_data = loadJSON('./data/default_data.json')
setting_save = (settings) -> setting_save = (settings) ->
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)) try
await util.promisify(fs.writeFile)(settings.file, JSON.stringify(settings, null, 2))
catch e
add_log("save fail");
return return
default_data = loadJSON('./data/default_data.json') default_data = loadJSON('./data/default_data.json')
...@@ -78,16 +83,15 @@ catch ...@@ -78,16 +83,15 @@ catch
setting_save(users) setting_save(users)
save = () -> save = () ->
setting_save(users) return await setting_save(users)
return
reload = () -> reload = () ->
user_backup = users user_backup = users
try try
users = loadJSON('./config/admin_user.json') users = await loadJSONPromise('./config/admin_user.json')
catch catch
users = user_backup users = user_backup
add_log("Invalid user data JSON") await add_log("Invalid user data JSON")
return return
check_permission = (user, permission_required) -> check_permission = (user, permission_required) ->
...@@ -96,31 +100,31 @@ check_permission = (user, permission_required) -> ...@@ -96,31 +100,31 @@ check_permission = (user, permission_required) ->
if typeof(permission) != 'object' if typeof(permission) != 'object'
permission = users.permission_examples[_permission] permission = users.permission_examples[_permission]
if !permission if !permission
add_log("Permision not set:"+_permission) await add_log("Permision not set:"+_permission)
return false return false
return permission[permission_required] return permission[permission_required]
@auth = (name, pass, permission_required, action = 'unknown', no_log) -> @auth = (name, pass, permission_required, action = 'unknown', no_log) ->
reload() await reload()
user = users.users[name] user = users.users[name]
if !user if !user
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
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
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 !check_permission(user, permission_required) if !await check_permission(user, permission_required)
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
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
@add_user = (name, pass, enabled, permissions) -> @add_user = (name, pass, enabled, permissions) ->
reload() await reload()
if users.users[name] if users.users[name]
return false return false
users.users[name] = { users.users[name] = {
...@@ -128,21 +132,21 @@ check_permission = (user, permission_required) -> ...@@ -128,21 +132,21 @@ check_permission = (user, permission_required) ->
"enabled": enabled, "enabled": enabled,
"permissions": permissions "permissions": permissions
} }
save() await save()
return true return true
@delete_user = (name) -> @delete_user = (name) ->
reload() await reload()
if !users.users[name] if !users.users[name]
return false return false
delete users.users[name] delete users.users[name]
save() await save()
return true return
@update_user = (name, key, value) -> @update_user = (name, key, value) ->
reload() await reload()
if !users.users[name] if !users.users[name]
return false return false
users.users[name][key] = value users.users[name][key] = value
save() await save()
return true return
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 2.5.1
/*
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
}
},
*/
(function() { (function() {
var add_log, bunyan, check_permission, default_data, fs, loadJSON, log, moment, reload, save, setting_save, users; /*
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
}
},
*/
var add_log, bunyan, check_permission, default_data, fs, loadJSON, loadJSONPromise, log, moment, reload, save, setting_save, users, util;
fs = require('fs'); fs = require('fs');
loadJSON = require('load-json-file').sync; loadJSON = require('load-json-file').sync;
loadJSONPromise = require('load-json-file');
moment = require('moment'); moment = require('moment');
moment.updateLocale('zh-cn', { moment.updateLocale('zh-cn', {
...@@ -60,28 +60,37 @@ or as follows, to use a specific set of permissions. ...@@ -60,28 +60,37 @@ or as follows, to use a specific set of permissions.
name: "auth" name: "auth"
}); });
util = require('util');
if (!fs.existsSync('./logs')) { if (!fs.existsSync('./logs')) {
fs.mkdirSync('./logs'); fs.mkdirSync('./logs');
} }
add_log = function(message) { add_log = async function(message) {
var mt, res, text; var mt, res, text;
mt = moment(); mt = moment();
log.info(message); log.info(message);
text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n"; text = mt.format('YYYY-MM-DD HH:mm:ss') + " --> " + message + "\n";
res = false; res = false;
try { try {
fs.appendFileSync("./logs/" + mt.format('YYYY-MM-DD') + ".log", text); await util.promisify(fs.appendFile)("./logs/" + mt.format('YYYY-MM-DD') + ".log", text);
res = true; res = true;
} catch (error) { } catch (error) {
res = false; res = false;
} }
return res;
}; };
default_data = loadJSON('./data/default_data.json'); default_data = loadJSON('./data/default_data.json');
setting_save = function(settings) { setting_save = async function(settings) {
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)); var e;
try {
await util.promisify(fs.writeFile)(settings.file, JSON.stringify(settings, null, 2));
} catch (error) {
e = error;
add_log("save fail");
}
}; };
default_data = loadJSON('./data/default_data.json'); default_data = loadJSON('./data/default_data.json');
...@@ -93,22 +102,22 @@ or as follows, to use a specific set of permissions. ...@@ -93,22 +102,22 @@ or as follows, to use a specific set of permissions.
setting_save(users); setting_save(users);
} }
save = function() { save = async function() {
setting_save(users); return (await setting_save(users));
}; };
reload = function() { reload = async function() {
var user_backup; var user_backup;
user_backup = users; user_backup = users;
try { try {
users = loadJSON('./config/admin_user.json'); users = (await loadJSONPromise('./config/admin_user.json'));
} catch (error) { } catch (error) {
users = user_backup; users = user_backup;
add_log("Invalid user data JSON"); await add_log("Invalid user data JSON");
} }
}; };
check_permission = function(user, permission_required) { check_permission = async function(user, permission_required) {
var _permission, permission; var _permission, permission;
_permission = user.permissions; _permission = user.permissions;
permission = _permission; permission = _permission;
...@@ -116,43 +125,40 @@ or as follows, to use a specific set of permissions. ...@@ -116,43 +125,40 @@ or as follows, to use a specific set of permissions.
permission = users.permission_examples[_permission]; permission = users.permission_examples[_permission];
} }
if (!permission) { if (!permission) {
add_log("Permision not set:" + _permission); await add_log("Permision not set:" + _permission);
return false; return false;
} }
return permission[permission_required]; return permission[permission_required];
}; };
this.auth = function(name, pass, permission_required, action, no_log) { this.auth = async function(name, pass, permission_required, action = 'unknown', no_log) {
var user; var user;
if (action == null) { await reload();
action = 'unknown';
}
reload();
user = users.users[name]; user = users.users[name];
if (!user) { if (!user) {
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) {
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) {
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 (!check_permission(user, permission_required)) { if (!(await check_permission(user, permission_required))) {
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) {
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;
}; };
this.add_user = function(name, pass, enabled, permissions) { this.add_user = async function(name, pass, enabled, permissions) {
reload(); await reload();
if (users.users[name]) { if (users.users[name]) {
return false; return false;
} }
...@@ -161,28 +167,26 @@ or as follows, to use a specific set of permissions. ...@@ -161,28 +167,26 @@ or as follows, to use a specific set of permissions.
"enabled": enabled, "enabled": enabled,
"permissions": permissions "permissions": permissions
}; };
save(); await save();
return true; return true;
}; };
this.delete_user = function(name) { this.delete_user = async function(name) {
reload(); await reload();
if (!users.users[name]) { if (!users.users[name]) {
return false; return false;
} }
delete users.users[name]; delete users.users[name];
save(); await save();
return true;
}; };
this.update_user = function(name, key, value) { this.update_user = async function(name, key, value) {
reload(); await reload();
if (!users.users[name]) { if (!users.users[name]) {
return false; return false;
} }
users.users[name][key] = value; users.users[name][key] = value;
save(); await save();
return true;
}; };
}).call(this); }).call(this);
...@@ -483,7 +483,7 @@ var packDatas = function (callback) { ...@@ -483,7 +483,7 @@ var packDatas = function (callback) {
function requestListener(req, res) { function requestListener(req, res) {
var u = url.parse(req.url, true); var u = url.parse(req.url, true);
if (!auth.auth(u.query.username, u.query.password, "pre_dashboard", "pre_dashboard")) { if (!await auth.auth(u.query.username, u.query.password, "pre_dashboard", "pre_dashboard")) {
res.writeHead(403); res.writeHead(403);
res.end("Auth Failed."); res.end("Auth Failed.");
return; return;
...@@ -508,7 +508,7 @@ function requestListener(req, res) { ...@@ -508,7 +508,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(() => { }); await util.promisify(loadAllDbs)();
} }
else if (u.pathname === '/api/fetch_datas') { else if (u.pathname === '/api/fetch_datas') {
res.writeHead(200); res.writeHead(200);
...@@ -517,23 +517,23 @@ function requestListener(req, res) { ...@@ -517,23 +517,23 @@ 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(() => { }); await util.promisify(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, () => { }); await util.promisify(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(() => { }); await util.promisify(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(() => { }); await util.promisify(packDatas)();
} }
else { else {
res.writeHead(400); res.writeHead(400);
......
...@@ -81,6 +81,8 @@ merge = require 'deepmerge' ...@@ -81,6 +81,8 @@ merge = require 'deepmerge'
loadJSON = require('load-json-file').sync loadJSON = require('load-json-file').sync
util = require("util")
#heapdump = require 'heapdump' #heapdump = require 'heapdump'
# 配置 # 配置
...@@ -1919,6 +1921,7 @@ net.createServer (client) -> ...@@ -1919,6 +1921,7 @@ net.createServer (client) ->
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3) b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
info = null info = null
struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]] struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
if struct and !cancel if struct and !cancel
struct._setBuff(b) struct._setBuff(b)
info = _.clone(struct.fields) info = _.clone(struct.fields)
...@@ -3976,7 +3979,7 @@ if settings.modules.http ...@@ -3976,7 +3979,7 @@ if settings.modules.http
#console.log(u.query.username, u.query.pass) #console.log(u.query.username, u.query.pass)
if u.pathname == '/api/getrooms' if u.pathname == '/api/getrooms'
pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true) pass_validated = await auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true)
if !settings.modules.http.public_roomlist and !pass_validated if !settings.modules.http.public_roomlist and !pass_validated
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}')) response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}'))
...@@ -4012,7 +4015,7 @@ if settings.modules.http ...@@ -4012,7 +4015,7 @@ if settings.modules.http
else if u.pathname == '/api/duellog' and settings.modules.tournament_mode.enabled else if u.pathname == '/api/duellog' and settings.modules.tournament_mode.enabled
if !auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log") if !await auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "[{name:'密码错误'}]")) response.end(addCallback(u.query.callback, "[{name:'密码错误'}]"))
return return
...@@ -4038,7 +4041,7 @@ if settings.modules.http ...@@ -4038,7 +4041,7 @@ if settings.modules.http
response.end(addCallback(u.query.callback, ret_keys)) response.end(addCallback(u.query.callback, ret_keys))
else if u.pathname == '/api/archive.zip' and settings.modules.tournament_mode.enabled else if u.pathname == '/api/archive.zip' and settings.modules.tournament_mode.enabled
if !auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay_archive") if !await auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay_archive")
response.writeHead(403) response.writeHead(403)
response.end("Invalid password.") response.end("Invalid password.")
return return
...@@ -4081,7 +4084,7 @@ if settings.modules.http ...@@ -4081,7 +4084,7 @@ if settings.modules.http
response.end("Failed reading replays. " + error) response.end("Failed reading replays. " + error)
else if u.pathname == '/api/clearlog' and settings.modules.tournament_mode.enabled else if u.pathname == '/api/clearlog' and settings.modules.tournament_mode.enabled
if !auth.auth(u.query.username, u.query.pass, "clear_duel_log", "clear_duel_log") if !await auth.auth(u.query.username, u.query.pass, "clear_duel_log", "clear_duel_log")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "[{name:'密码错误'}]")) response.end(addCallback(u.query.callback, "[{name:'密码错误'}]"))
return return
...@@ -4097,7 +4100,7 @@ if settings.modules.http ...@@ -4097,7 +4100,7 @@ if settings.modules.http
response.end(addCallback(u.query.callback, "[{name:'Success'}]")) response.end(addCallback(u.query.callback, "[{name:'Success'}]"))
else if _.startsWith(u.pathname, '/api/replay') and settings.modules.tournament_mode.enabled else if _.startsWith(u.pathname, '/api/replay') and settings.modules.tournament_mode.enabled
if !auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay") if !await auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay")
response.writeHead(403) response.writeHead(403)
response.end("密码错误") response.end("密码错误")
return return
...@@ -4128,45 +4131,43 @@ if settings.modules.http ...@@ -4128,45 +4131,43 @@ if settings.modules.http
# return # return
if u.query.shout if u.query.shout
if !auth.auth(u.query.username, u.query.pass, "shout", "shout") if !await auth.auth(u.query.username, u.query.pass, "shout", "shout")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
for room in ROOM_all when room and room.established _async.each ROOM_all, (room)->
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW) if room and room.established
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW)
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['shout ok', '" + u.query.shout + "']")) response.end(addCallback(u.query.callback, "['shout ok', '" + u.query.shout + "']"))
else if u.query.stop else if u.query.stop
if !auth.auth(u.query.username, u.query.pass, "stop", "stop") if !await auth.auth(u.query.username, u.query.pass, "stop", "stop")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
if u.query.stop == 'false' if u.query.stop == 'false'
u.query.stop = false u.query.stop = false
setting_change(settings, 'modules:stop', u.query.stop, (err)-> response.writeHead(200)
response.writeHead(200) try
if(err) await util.promisify(setting_change)(settings, 'modules:stop', u.query.stop)
response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']")) response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']"))
else catch err
response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']")) response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']"))
)
else if u.query.welcome else if u.query.welcome
if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome") if !await auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
setting_change(settings, 'modules:welcome', (err)-> try
response.writeHead(200) await util.promisify(setting_change)(settings, 'modules:stop', u.query.welcome)
if(err) response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']"))
response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']")) catch err
else response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']"))
response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']"))
)
else if u.query.getwelcome else if u.query.getwelcome
if !auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome") if !await auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4174,7 +4175,7 @@ if settings.modules.http ...@@ -4174,7 +4175,7 @@ if settings.modules.http
response.end(addCallback(u.query.callback, "['get ok', '" + settings.modules.welcome + "']")) response.end(addCallback(u.query.callback, "['get ok', '" + settings.modules.welcome + "']"))
else if u.query.loadtips else if u.query.loadtips
if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_tips") if !await auth.auth(u.query.username, u.query.pass, "change_settings", "change_tips")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4192,7 +4193,7 @@ if settings.modules.http ...@@ -4192,7 +4193,7 @@ if settings.modules.http
) )
else if u.query.loaddialogues else if u.query.loaddialogues
if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues") if !await auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4210,7 +4211,7 @@ if settings.modules.http ...@@ -4210,7 +4211,7 @@ if settings.modules.http
) )
else if u.query.ban else if u.query.ban
if !auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user") if !await auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4223,7 +4224,7 @@ if settings.modules.http ...@@ -4223,7 +4224,7 @@ if settings.modules.http
) )
else if u.query.kick else if u.query.kick
if !auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user") if !await auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4239,7 +4240,7 @@ if settings.modules.http ...@@ -4239,7 +4240,7 @@ if settings.modules.http
else if u.query.death else if u.query.death
if !auth.auth(u.query.username, u.query.pass, "start_death", "start_death") if !await auth.auth(u.query.username, u.query.pass, "start_death", "start_death")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4261,7 +4262,7 @@ if settings.modules.http ...@@ -4261,7 +4262,7 @@ if settings.modules.http
) )
else if u.query.deathcancel else if u.query.deathcancel
if !auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death") if !await auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
...@@ -4282,7 +4283,7 @@ if settings.modules.http ...@@ -4282,7 +4283,7 @@ if settings.modules.http
) )
else if u.query.reboot else if u.query.reboot
if !auth.auth(u.query.username, u.query.pass, "stop", "reboot") if !await auth.auth(u.query.username, u.query.pass, "stop", "reboot")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 2.5.1
(function() { (function() {
var CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_vip_status, CLIENT_use_cdkey, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, m, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, real_windbot_server_ip, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib; // 标准库
var CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_vip_status, CLIENT_use_cdkey, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, m, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, real_windbot_server_ip, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -26,6 +27,7 @@ ...@@ -26,6 +27,7 @@
_async = require('async'); _async = require('async');
// 三方库
_ = global._ = require('underscore'); _ = global._ = require('underscore');
_.str = require('underscore.string'); _.str = require('underscore.string');
...@@ -66,6 +68,12 @@ ...@@ -66,6 +68,12 @@
loadJSON = require('load-json-file').sync; loadJSON = require('load-json-file').sync;
util = require("util");
//heapdump = require 'heapdump'
// 配置
// 导入旧配置
if (!fs.existsSync('./config')) { if (!fs.existsSync('./config')) {
fs.mkdirSync('./config'); fs.mkdirSync('./config');
} }
...@@ -128,6 +136,7 @@ ...@@ -128,6 +136,7 @@
delete oldconfig.ban.badword_level3; delete oldconfig.ban.badword_level3;
} }
if (!_.isEmpty(oldconfig)) { if (!_.isEmpty(oldconfig)) {
// log.info oldconfig
fs.writeFileSync('./config/config.json', JSON.stringify(oldconfig, null, 2)); fs.writeFileSync('./config/config.json', JSON.stringify(oldconfig, null, 2));
log.info('imported old config from config.user.json'); log.info('imported old config from config.user.json');
} }
...@@ -153,6 +162,7 @@ ...@@ -153,6 +162,7 @@
setting_change = global.setting_change = function(settings, path, val, callback) { setting_change = global.setting_change = function(settings, path, val, callback) {
var key, target; var key, target;
if (_.isString(val)) { if (_.isString(val)) {
// path should be like "modules:welcome"
log.info("setting changed", path, val); log.info("setting changed", path, val);
} }
path = path.split(':'); path = path.split(':');
...@@ -175,7 +185,7 @@ ...@@ -175,7 +185,7 @@
if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) { if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) {
return false; return false;
} }
for (i = j = 0, ref = count; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { for (i = j = 0, ref = count; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {
key = Math.floor(Math.random() * 10000000000000000).toString(); key = Math.floor(Math.random() * 10000000000000000).toString();
vip_info.cdkeys[key_type].push(key); vip_info.cdkeys[key_type].push(key);
} }
...@@ -193,6 +203,7 @@ ...@@ -193,6 +203,7 @@
ref = vip_info.cdkeys; ref = vip_info.cdkeys;
for (type in ref) { for (type in ref) {
keys = ref[type]; keys = ref[type];
// support web given format
for (j = 0, len = keys.length; j < len; j++) { for (j = 0, len = keys.length; j < len; j++) {
key = keys[j]; key = keys[j];
if (!(pkey === key || pkey === (type + "D" + settings.port + ":" + key))) { if (!(pkey === key || pkey === (type + "D" + settings.port + ":" + key))) {
...@@ -287,6 +298,7 @@ ...@@ -287,6 +298,7 @@
return res; return res;
}; };
// 读取配置
default_config = loadJSON('./data/default_config.json'); default_config = loadJSON('./data/default_config.json');
try { try {
...@@ -303,19 +315,23 @@ ...@@ -303,19 +315,23 @@
auth = global.auth = require('./ygopro-auth.js'); auth = global.auth = require('./ygopro-auth.js');
//import old configs
imported = false; imported = false;
//reset http.quick_death_rule from true to 1
if (settings.modules.http.quick_death_rule === true) { if (settings.modules.http.quick_death_rule === true) {
settings.modules.http.quick_death_rule = 1; settings.modules.http.quick_death_rule = 1;
imported = true; imported = true;
} }
//import the old redis port
if (settings.modules.cloud_replay.redis_port) { if (settings.modules.cloud_replay.redis_port) {
settings.modules.cloud_replay.redis.port = settings.modules.cloud_replay.redis_port; settings.modules.cloud_replay.redis.port = settings.modules.cloud_replay.redis_port;
delete settings.modules.cloud_replay.redis_port; delete settings.modules.cloud_replay.redis_port;
imported = true; imported = true;
} }
//import the old passwords to new admin user system
if (settings.modules.http.password) { if (settings.modules.http.password) {
auth.add_user("olduser", settings.modules.http.password, true, { auth.add_user("olduser", settings.modules.http.password, true, {
"get_rooms": true, "get_rooms": true,
...@@ -358,6 +374,7 @@ ...@@ -358,6 +374,7 @@
imported = true; imported = true;
} }
//import the old enable_priority hostinfo
if (settings.hostinfo.enable_priority || settings.hostinfo.enable_priority === false) { if (settings.hostinfo.enable_priority || settings.hostinfo.enable_priority === false) {
if (settings.hostinfo.enable_priority) { if (settings.hostinfo.enable_priority) {
settings.hostinfo.duel_rule = 3; settings.hostinfo.duel_rule = 3;
...@@ -368,16 +385,19 @@ ...@@ -368,16 +385,19 @@
imported = true; imported = true;
} }
//import the old Challonge api key option
if (settings.modules.challonge.api_key) { if (settings.modules.challonge.api_key) {
settings.modules.challonge.options.apiKey = settings.modules.challonge.api_key; settings.modules.challonge.options.apiKey = settings.modules.challonge.api_key;
delete settings.modules.challonge.api_key; delete settings.modules.challonge.api_key;
imported = true; imported = true;
} }
//finish
if (imported) { if (imported) {
setting_save(settings); setting_save(settings);
} }
// 读取数据
default_data = loadJSON('./data/default_data.json'); default_data = loadJSON('./data/default_data.json');
try { try {
...@@ -442,13 +462,16 @@ ...@@ -442,13 +462,16 @@
setting_change(settings, "version", cppversion); setting_change(settings, "version", cppversion);
log.info("ygopro version 0x" + settings.version.toString(16), "(from source code)"); log.info("ygopro version 0x" + settings.version.toString(16), "(from source code)");
} catch (error1) { } catch (error1) {
//settings.version = settings.version_default
log.info("ygopro version 0x" + settings.version.toString(16), "(from config)"); log.info("ygopro version 0x" + settings.version.toString(16), "(from config)");
} }
// load the lflist of current date
lflists = global.lflists = []; lflists = global.lflists = [];
try { try {
ref = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g); ref = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g);
// expansions/lflist
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
list = ref[j]; list = ref[j];
date = list.match(/!([\d\.]+)/); date = list.match(/!([\d\.]+)/);
...@@ -466,6 +489,7 @@ ...@@ -466,6 +489,7 @@
try { try {
ref1 = fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/!.*/g); ref1 = fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/!.*/g);
// lflist
for (l = 0, len1 = ref1.length; l < len1; l++) { for (l = 0, len1 = ref1.length; l < len1; l++) {
list = ref1[l]; list = ref1[l];
date = list.match(/!([\d\.]+)/); date = list.match(/!([\d\.]+)/);
...@@ -507,6 +531,7 @@ ...@@ -507,6 +531,7 @@
long_resolve_cards = global.long_resolve_cards = loadJSON('./data/long_resolve_cards.json'); long_resolve_cards = global.long_resolve_cards = loadJSON('./data/long_resolve_cards.json');
} }
// 组件
ygopro = global.ygopro = require('./ygopro.js'); ygopro = global.ygopro = require('./ygopro.js');
if (settings.modules.http.websocket_roomlist) { if (settings.modules.http.websocket_roomlist) {
...@@ -517,6 +542,7 @@ ...@@ -517,6 +542,7 @@
geoip = require('geoip-country-lite'); geoip = require('geoip-country-lite');
} }
// cache users of mycard login
users_cache = {}; users_cache = {};
if (settings.modules.mycard.enabled) { if (settings.modules.mycard.enabled) {
...@@ -530,6 +556,7 @@ ...@@ -530,6 +556,7 @@
log.warn("PostgreSQL Query ERROR: ", err); log.warn("PostgreSQL Query ERROR: ", err);
}); });
pg_query.on('row', function(row) { pg_query.on('row', function(row) {
//log.info "load user", row.username, row.id
users_cache[row.username] = row.id; users_cache[row.username] = row.id;
}); });
pg_query.on('end', function(result) { pg_query.on('end', function(result) {
...@@ -545,20 +572,20 @@ ...@@ -545,20 +572,20 @@
ak: settings.modules.arena_mode.init_post.accesskey, ak: settings.modules.arena_mode.init_post.accesskey,
arena: settings.modules.arena_mode.mode arena: settings.modules.arena_mode.mode
} }
}, (function(_this) { }, (error, response, body) => {
return function(error, response, body) { if (error) {
if (error) { log.warn('ARENA INIT POST ERROR', error);
log.warn('ARENA INIT POST ERROR', error); } else {
} else { if (response.statusCode >= 400) {
if (response.statusCode >= 400) { log.warn('ARENA INIT POST FAIL', response.statusCode, response.statusMessage, body);
log.warn('ARENA INIT POST FAIL', response.statusCode, response.statusMessage, body);
}
} }
}; }
})(this)); });
} }
} }
//else
// log.info 'ARENA INIT POST OK', response.statusCode, response.statusMessage
if (settings.modules.challonge.enabled) { if (settings.modules.challonge.enabled) {
challonge_module_name = 'challonge'; challonge_module_name = 'challonge';
if (settings.modules.challonge.use_custom_module) { if (settings.modules.challonge.use_custom_module) {
...@@ -634,6 +661,18 @@ ...@@ -634,6 +661,18 @@
} }
}; };
refresh_challonge_cache(); refresh_challonge_cache();
// challonge.participants._index({
// id: settings.modules.challonge.tournament_id,
// callback: (() ->
// challonge.matches._index({
// id: settings.modules.challonge.tournament_id,
// callback: (() ->
// return
// )
// })
// return
// )
// })
if (settings.modules.challonge.cache_ttl) { if (settings.modules.challonge.cache_ttl) {
setInterval(refresh_challonge_cache, settings.modules.challonge.cache_ttl); setInterval(refresh_challonge_cache, settings.modules.challonge.cache_ttl);
} }
...@@ -649,6 +688,7 @@ ...@@ -649,6 +688,7 @@
} }
} }
// 获取可用内存
memory_usage = global.memory_usage = 0; memory_usage = global.memory_usage = 0;
get_memory_usage = get_memory_usage = function() { get_memory_usage = get_memory_usage = function() {
...@@ -692,6 +732,7 @@ ...@@ -692,6 +732,7 @@
ROOM_bad_ip = global.ROOM_bad_ip = {}; ROOM_bad_ip = global.ROOM_bad_ip = {};
// ban a user manually and permanently
ban_user = global.ban_user = function(name, callback) { ban_user = global.ban_user = function(name, callback) {
var bad_ip; var bad_ip;
settings.ban.banned_user.push(name); settings.ban.banned_user.push(name);
...@@ -708,7 +749,7 @@ ...@@ -708,7 +749,7 @@
bad_ip.push(player.ip); bad_ip.push(player.ip);
ROOM_bad_ip[bad_ip] = 99; ROOM_bad_ip[bad_ip] = 99;
settings.ban.banned_ip.push(player.ip); settings.ban.banned_ip.push(player.ip);
ygopro.stoc_send_chat_to_room(room, player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_send_replays(player, room); CLIENT_send_replays(player, room);
CLIENT_kick(player); CLIENT_kick(player);
} }
...@@ -718,11 +759,9 @@ ...@@ -718,11 +759,9 @@
}, callback); }, callback);
}; };
ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd) { // automatically ban user to use random duel
ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd = 1) {
var bannedplayer, bantime; var bannedplayer, bantime;
if (countadd == null) {
countadd = 1;
}
if (settings.modules.test_mode.no_ban_player) { if (settings.modules.test_mode.no_ban_player) {
return; return;
} }
...@@ -751,6 +790,7 @@ ...@@ -751,6 +790,7 @@
} }
}; };
//log.info("banned", name, ip, reason, bannedplayer.count)
ROOM_kick = function(name, callback) { ROOM_kick = function(name, callback) {
var found; var found;
found = false; found = false;
...@@ -767,7 +807,7 @@ ...@@ -767,7 +807,7 @@
room.kicked = true; room.kicked = true;
room.send_replays(); room.send_replays();
room.process.kill(); room.process.kill();
room["delete"](); room.delete();
done(); done();
}, function(err) { }, function(err) {
callback(null, found); callback(null, found);
...@@ -818,16 +858,17 @@ ...@@ -818,16 +858,17 @@
name = player.name_vpass; name = player.name_vpass;
score = ROOM_players_scores[name]; score = ROOM_players_scores[name];
if (!score) { if (!score) {
return player.name + " ${random_score_blank}"; return `${player.name} \${random_score_blank}`;
} }
total = score.win + score.lose; total = score.win + score.lose;
if (score.win < 2 && total < 3) { if (score.win < 2 && total < 3) {
return player.name + " ${random_score_not_enough}"; return `${player.name} \${random_score_not_enough}`;
} }
if (score.combo >= 2) { if (score.combo >= 2) {
return "${random_score_part1}" + player.name + " ${random_score_part2} " + (Math.ceil(score.win / total * 100)) + "${random_score_part3} " + (Math.ceil(score.flee / total * 100)) + "${random_score_part4_combo}" + score.combo + "${random_score_part5_combo}"; return `\${random_score_part1}${player.name} \${random_score_part2} ${Math.ceil(score.win / total * 100)}\${random_score_part3} ${Math.ceil(score.flee / total * 100)}\${random_score_part4_combo}${score.combo}\${random_score_part5_combo}`;
} else { } else {
return "${random_score_part1}" + player.name + " ${random_score_part2} " + (Math.ceil(score.win / total * 100)) + "${random_score_part3} " + (Math.ceil(score.flee / total * 100)) + "${random_score_part4}"; //return player.name + " 的今日战绩:胜率" + Math.ceil(score.win/total*100) + "%,逃跑率" + Math.ceil(score.flee/total*100) + "%," + score.combo + "连胜中!"
return `\${random_score_part1}${player.name} \${random_score_part2} ${Math.ceil(score.win / total * 100)}\${random_score_part3} ${Math.ceil(score.flee / total * 100)}\${random_score_part4}`;
} }
}; };
...@@ -837,28 +878,29 @@ ...@@ -837,28 +878,29 @@
scores_pair = _.pairs(ROOM_players_scores); scores_pair = _.pairs(ROOM_players_scores);
scores_by_lose = _.sortBy(scores_pair, function(score) { scores_by_lose = _.sortBy(scores_pair, function(score) {
return score[1].lose; return score[1].lose;
}).reverse(); }).reverse(); // 败场由高到低
scores_by_win = _.sortBy(scores_by_lose, function(score) { scores_by_win = _.sortBy(scores_by_lose, function(score) {
return score[1].win; return score[1].win;
}).reverse(); }).reverse(); // 然后胜场由低到高,再逆转,就是先排胜场再排败场
scores = _.first(scores_by_win, 10); scores = _.first(scores_by_win, 10);
//log.info scores
request.post({ request.post({
url: settings.modules.random_duel.post_match_scores, url: settings.modules.random_duel.post_match_scores,
form: { form: {
accesskey: settings.modules.random_duel.post_match_accesskey, accesskey: settings.modules.random_duel.post_match_accesskey,
rank: JSON.stringify(scores) rank: JSON.stringify(scores)
} }
}, (function(_this) { }, (error, response, body) => {
return function(error, response, body) { if (error) {
if (error) { log.warn('RANDOM SCORE POST ERROR', error);
log.warn('RANDOM SCORE POST ERROR', error); } else {
} else { if (response.statusCode !== 204 && response.statusCode !== 200) {
if (response.statusCode !== 204 && response.statusCode !== 200) { log.warn('RANDOM SCORE POST FAIL', response.statusCode, response.statusMessage, body);
log.warn('RANDOM SCORE POST FAIL', response.statusCode, response.statusMessage, body);
}
} }
}; }
})(this)); });
//else
// log.info 'RANDOM SCORE POST OK', response.statusCode, response.statusMessage
}, 60000); }, 60000);
} }
...@@ -888,18 +930,18 @@ ...@@ -888,18 +930,18 @@
if (bannedplayer) { if (bannedplayer) {
if (bannedplayer.count > 6 && moment() < bannedplayer.time) { if (bannedplayer.count > 6 && moment() < bannedplayer.time) {
return { return {
"error": "${random_banned_part1}" + (bannedplayer.reasons.join('${random_ban_reason_separator}')) + "${random_banned_part2}" + (moment(bannedplayer.time).fromNow(true)) + "${random_banned_part3}" "error": `\${random_banned_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_banned_part2}${moment(bannedplayer.time).fromNow(true)}\${random_banned_part3}`
}; };
} }
if (bannedplayer.count > 3 && moment() < bannedplayer.time && bannedplayer.need_tip && type !== 'T') { if (bannedplayer.count > 3 && moment() < bannedplayer.time && bannedplayer.need_tip && type !== 'T') {
bannedplayer.need_tip = false; bannedplayer.need_tip = false;
return { return {
"error": "${random_deprecated_part1}" + (bannedplayer.reasons.join('${random_ban_reason_separator}')) + "${random_deprecated_part2}" + (moment(bannedplayer.time).fromNow(true)) + "${random_deprecated_part3}" "error": `\${random_deprecated_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_deprecated_part2}${moment(bannedplayer.time).fromNow(true)}\${random_deprecated_part3}`
}; };
} else if (bannedplayer.need_tip) { } else if (bannedplayer.need_tip) {
bannedplayer.need_tip = false; bannedplayer.need_tip = false;
return { return {
"error": "${random_warn_part1}" + (bannedplayer.reasons.join('${random_ban_reason_separator}')) + "${random_warn_part2}" "error": `\${random_warn_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_warn_part2}`
}; };
} else if (bannedplayer.count > 2) { } else if (bannedplayer.count > 2) {
bannedplayer.need_tip = true; bannedplayer.need_tip = true;
...@@ -912,6 +954,7 @@ ...@@ -912,6 +954,7 @@
}); });
if (result) { if (result) {
result.welcome = '${random_duel_enter_room_waiting}'; result.welcome = '${random_duel_enter_room_waiting}';
//log.info 'found room', player_name
} else if (memory_usage < 90) { } else if (memory_usage < 90) {
type = type ? type : 'S'; type = type ? type : 'S';
name = type + ',RANDOM#' + Math.floor(Math.random() * 100000); name = type + ',RANDOM#' + Math.floor(Math.random() * 100000);
...@@ -921,6 +964,7 @@ ...@@ -921,6 +964,7 @@
result.welcome = '${random_duel_enter_room_new}'; result.welcome = '${random_duel_enter_room_new}';
result.deprecated = playerbanned; result.deprecated = playerbanned;
} else { } else {
//log.info 'create room', player_name, name
return null; return null;
} }
if (result.random_type === 'M') { if (result.random_type === 'M') {
...@@ -964,7 +1008,7 @@ ...@@ -964,7 +1008,7 @@
} }
result = new Room(name); result = new Room(name);
result.windbot = windbot; result.windbot = windbot;
result["private"] = true; result.private = true;
return result; return result;
}; };
...@@ -1025,10 +1069,10 @@ ...@@ -1025,10 +1069,10 @@
for (m = 0, len2 = ref3.length; m < len2; m++) { for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[m]; player = ref3[m];
if (player && player === bad_player) { if (player && player === bad_player) {
ygopro.stoc_send_chat(player, "${unwelcome_warn_part1}" + reason + "${unwelcome_warn_part2}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(player, `\${unwelcome_warn_part1}${reason}\${unwelcome_warn_part2}`, ygopro.constants.COLORS.RED);
} else if (player && player.pos !== 7 && player !== bad_player) { } else if (player && player.pos !== 7 && player !== bad_player) {
player.flee_free = true; player.flee_free = true;
ygopro.stoc_send_chat(player, "${unwelcome_tip_part1}" + reason + "${unwelcome_tip_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(player, `\${unwelcome_tip_part1}${reason}\${unwelcome_tip_part2}`, ygopro.constants.COLORS.BABYBLUE);
} }
} }
}; };
...@@ -1107,6 +1151,9 @@ ...@@ -1107,6 +1151,9 @@
if (!settings.modules.reconnect.enabled || !room || client.system_kicked || client.flee_free || disconnect_list[CLIENT_get_authorize_key(client)] || client.is_post_watcher || !CLIENT_is_player(client, room) || room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || room.windbot || (settings.modules.reconnect.auto_surrender_after_disconnect && room.hostinfo.mode !== 1) || (room.random_type && room.get_disconnected_count() > 1)) { if (!settings.modules.reconnect.enabled || !room || client.system_kicked || client.flee_free || disconnect_list[CLIENT_get_authorize_key(client)] || client.is_post_watcher || !CLIENT_is_player(client, room) || room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || room.windbot || (settings.modules.reconnect.auto_surrender_after_disconnect && room.hostinfo.mode !== 1) || (room.random_type && room.get_disconnected_count() > 1)) {
return false; return false;
} }
// for player in room.players
// if player != client and CLIENT_get_authorize_key(player) == CLIENT_get_authorize_key(client)
// return false # some issues may occur in this case, so return false
dinfo = { dinfo = {
room_id: room_id, room_id: room_id,
old_client: client, old_client: client,
...@@ -1115,10 +1162,12 @@ ...@@ -1115,10 +1162,12 @@
}; };
tmot = setTimeout(function() { tmot = setTimeout(function() {
room.disconnect(client, error); room.disconnect(client, error);
//SERVER_kick(dinfo.old_server)
}, settings.modules.reconnect.wait_time); }, settings.modules.reconnect.wait_time);
dinfo.timeout = tmot; dinfo.timeout = tmot;
disconnect_list[CLIENT_get_authorize_key(client)] = dinfo; disconnect_list[CLIENT_get_authorize_key(client)] = dinfo;
ygopro.stoc_send_chat_to_room(room, (client.name + " ${disconnect_from_game}") + (error ? ": " + error : '')); //console.log("#{client.name} ${disconnect_from_game}")
ygopro.stoc_send_chat_to_room(room, `${client.name} \${disconnect_from_game}` + (error ? `: ${error}` : ''));
if (client.time_confirm_required) { if (client.time_confirm_required) {
client.time_confirm_required = false; client.time_confirm_required = false;
ygopro.ctos_send(client.server, 'TIME_CONFIRM'); ygopro.ctos_send(client.server, 'TIME_CONFIRM');
...@@ -1284,7 +1333,7 @@ ...@@ -1284,7 +1333,7 @@
break; break;
case ygopro.constants.DUEL_STAGE.FIRSTGO: case ygopro.constants.DUEL_STAGE.FIRSTGO:
ygopro.stoc_send(client, 'DUEL_START'); ygopro.stoc_send(client, 'DUEL_START');
if (client === room.selecting_tp) { if (client === room.selecting_tp) { // and !client.selected_preduel
ygopro.stoc_send(client, 'SELECT_TP'); ygopro.stoc_send(client, 'SELECT_TP');
} }
client.reconnecting = false; client.reconnecting = false;
...@@ -1343,7 +1392,8 @@ ...@@ -1343,7 +1392,8 @@
} }
CLIENT_import_data(client, dinfo.old_client, room); CLIENT_import_data(client, dinfo.old_client, room);
CLIENT_send_reconnect_info(client, client.server, room); CLIENT_send_reconnect_info(client, client.server, room);
ygopro.stoc_send_chat_to_room(room, client.name + " ${reconnect_to_game}"); //console.log("#{client.name} ${reconnect_to_game}")
ygopro.stoc_send_chat_to_room(room, `${client.name} \${reconnect_to_game}`);
CLIENT_reconnect_unregister(client, true); CLIENT_reconnect_unregister(client, true);
}; };
...@@ -1374,12 +1424,13 @@ ...@@ -1374,12 +1424,13 @@
} }
CLIENT_import_data(client, player, room); CLIENT_import_data(client, player, room);
CLIENT_send_reconnect_info(client, client.server, room); CLIENT_send_reconnect_info(client, client.server, room);
ygopro.stoc_send_chat_to_room(room, client.name + " ${reconnect_to_game}"); //console.log("#{client.name} ${reconnect_to_game}")
ygopro.stoc_send_chat_to_room(room, `${client.name} \${reconnect_to_game}`);
CLIENT_reconnect_unregister(client, true); CLIENT_reconnect_unregister(client, true);
}; };
if (settings.modules.reconnect.enabled) { if (settings.modules.reconnect.enabled) {
disconnect_list = {}; disconnect_list = {}; // {old_client, old_server, room_id, timeout, deckbuf}
} }
CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = function(client) { CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = function(client) {
...@@ -1388,6 +1439,7 @@ ...@@ -1388,6 +1439,7 @@
} }
clearTimeout(client.heartbeat_timeout); clearTimeout(client.heartbeat_timeout);
delete client.heartbeat_timeout; delete client.heartbeat_timeout;
//log.info(2, client.name)
return true; return true;
}; };
...@@ -1415,6 +1467,7 @@ ...@@ -1415,6 +1467,7 @@
client.destroy(); client.destroy();
} }
}, settings.modules.heartbeat_detection.wait_time); }, settings.modules.heartbeat_detection.wait_time);
//log.info(1, client.name)
return true; return true;
}; };
...@@ -1479,14 +1532,16 @@ ...@@ -1479,14 +1532,16 @@
return true; return true;
}; };
Room = (function() { Room = class Room {
function Room(name, hostinfo) { constructor(name, hostinfo) {
var death_time, draw_count, duel_rule, lflist, param, rule, start_hand, start_lp, time_limit; var death_time, draw_count, duel_rule, lflist, param, rule, start_hand, start_lp, time_limit;
this.hostinfo = hostinfo; this.hostinfo = hostinfo;
this.name = name; this.name = name;
//@alive = true
this.players = []; this.players = [];
this.player_datas = []; this.player_datas = [];
this.status = 'starting'; this.status = 'starting';
//@started = false
this.established = false; this.established = false;
this.watcher_buffers = []; this.watcher_buffers = [];
this.recorder_buffers = []; this.recorder_buffers = [];
...@@ -1655,7 +1710,7 @@ ...@@ -1655,7 +1710,7 @@
if (rule.match(/(^|,|,)(NOSHUFFLE|NS)(,|,|$)/)) { if (rule.match(/(^|,|,)(NOSHUFFLE|NS)(,|,|$)/)) {
this.hostinfo.no_shuffle_deck = true; this.hostinfo.no_shuffle_deck = true;
} }
if (rule.match(/(^|,|,)(IGPRIORITY|PR)(,|,|$)/)) { if (rule.match(/(^|,|,)(IGPRIORITY|PR)(,|,|$)/)) { // deprecated
this.hostinfo.duel_rule = 4; this.hostinfo.duel_rule = 4;
} }
if ((param = rule.match(/(^|,|,)(DUELRULE|MR)(\d+)(,|,|$)/))) { if ((param = rule.match(/(^|,|,)(DUELRULE|MR)(\d+)(,|,|$)/))) {
...@@ -1676,7 +1731,7 @@ ...@@ -1676,7 +1731,7 @@
} }
} }
} }
this.hostinfo.replay_mode = 0; this.hostinfo.replay_mode = 0; // 0x1: Save the replays in file. 0x2: Block the replays to observers.
if (settings.modules.tournament_mode.enabled) { if (settings.modules.tournament_mode.enabled) {
this.hostinfo.replay_mode |= 0x1; this.hostinfo.replay_mode |= 0x1;
} }
...@@ -1689,73 +1744,66 @@ ...@@ -1689,73 +1744,66 @@
cwd: 'ygopro' cwd: 'ygopro'
}); });
this.process_pid = this.process.pid; this.process_pid = this.process.pid;
this.process.on('error', (function(_this) { this.process.on('error', (err) => {
return function(err) { _.each(this.players, function(player) {
_.each(_this.players, function(player) { return ygopro.stoc_die(player, "${create_room_failed}");
return ygopro.stoc_die(player, "${create_room_failed}"); });
}); this.delete();
_this["delete"](); });
}; this.process.on('exit', (code) => {
})(this)); if (!this.disconnector) {
this.process.on('exit', (function(_this) { this.disconnector = 'server';
return function(code) { }
if (!_this.disconnector) { this.delete();
_this.disconnector = 'server'; });
}
_this["delete"]();
};
})(this));
this.process.stdout.setEncoding('utf8'); this.process.stdout.setEncoding('utf8');
this.process.stdout.once('data', (function(_this) { this.process.stdout.once('data', (data) => {
return function(data) { this.established = true;
_this.established = true; if (!this.windbot && settings.modules.http.websocket_roomlist) {
if (!_this.windbot && settings.modules.http.websocket_roomlist) { roomlist.create(this);
roomlist.create(_this); }
} this.port = parseInt(data);
_this.port = parseInt(data); _.each(this.players, (player) => {
_.each(_this.players, function(player) { player.server.connect(this.port, '127.0.0.1', function() {
player.server.connect(_this.port, '127.0.0.1', function() { var buffer, len2, m, ref3;
var buffer, len2, m, ref3; ref3 = player.pre_establish_buffers;
ref3 = player.pre_establish_buffers; for (m = 0, len2 = ref3.length; m < len2; m++) {
for (m = 0, len2 = ref3.length; m < len2; m++) { buffer = ref3[m];
buffer = ref3[m]; player.server.write(buffer);
player.server.write(buffer); }
} player.established = true;
player.established = true; player.pre_establish_buffers = [];
player.pre_establish_buffers = [];
});
}); });
if (_this.windbot) { });
setTimeout(function() { if (this.windbot) {
return _this.add_windbot(_this.windbot); setTimeout(() => {
}, 200); return this.add_windbot(this.windbot);
} }, 200);
}; }
})(this)); });
this.process.stderr.on('data', (function(_this) { this.process.stderr.on('data', (data) => {
return function(data) { data = "Debug: " + data;
data = "Debug: " + data; data = data.replace(/\n$/, "");
data = data.replace(/\n$/, ""); log.info("YGOPRO " + data);
log.info("YGOPRO " + data); ygopro.stoc_send_chat_to_room(this, data, ygopro.constants.COLORS.RED);
ygopro.stoc_send_chat_to_room(_this, data, ygopro.constants.COLORS.RED); this.has_ygopro_error = true;
_this.has_ygopro_error = true; this.ygopro_error_length = this.ygopro_error_length ? this.ygopro_error_length + data.length : data.length;
_this.ygopro_error_length = _this.ygopro_error_length ? _this.ygopro_error_length + data.length : data.length; if (this.ygopro_error_length > 10000) {
if (_this.ygopro_error_length > 10000) { this.send_replays();
_this.send_replays(); this.process.kill();
_this.process.kill(); }
} });
};
})(this));
} catch (error1) { } catch (error1) {
this.error = "${create_room_failed}"; this.error = "${create_room_failed}";
} }
} }
Room.prototype["delete"] = function() { delete() {
var end_time, formatted_replays, index, len2, log_rep_id, m, name, player_ips, player_names, recorder_buffer, ref3, ref4, repbuf, replay_id, room_name, score, score_array, score_form; var end_time, formatted_replays, index, len2, log_rep_id, m, name, player_ips, player_names, recorder_buffer, ref3, ref4, repbuf, replay_id, room_name, score, score_array, score_form;
if (this.deleted) { if (this.deleted) {
return; return;
} }
//log.info 'room-delete', this.name, ROOM_all.length
score_array = []; score_array = [];
ref3 = this.scores; ref3 = this.scores;
for (name in ref3) { for (name in ref3) {
...@@ -1783,12 +1831,14 @@ ...@@ -1783,12 +1831,14 @@
} }
} }
} }
if (score_array.length === 1) { if (score_array.length === 1) { // same name
//log.info score_array[0].name
ROOM_player_win(score_array[0].name_vpass); ROOM_player_win(score_array[0].name_vpass);
ROOM_player_lose(score_array[0].name_vpass); ROOM_player_lose(score_array[0].name_vpass);
} }
} }
if (settings.modules.arena_mode.enabled && this.arena) { if (settings.modules.arena_mode.enabled && this.arena) {
//log.info 'SCORE', score_array, @start_time
end_time = moment().format(); end_time = moment().format();
if (!this.start_time) { if (!this.start_time) {
this.start_time = end_time; this.start_time = end_time;
...@@ -1835,18 +1885,18 @@ ...@@ -1835,18 +1885,18 @@
end: end_time, end: end_time,
arena: this.arena arena: this.arena
} }
}, (function(_this) { }, (error, response, body) => {
return function(error, response, body) { if (error) {
if (error) { log.warn('SCORE POST ERROR', error);
log.warn('SCORE POST ERROR', error); } else {
} else { if (response.statusCode !== 204 && response.statusCode !== 200) {
if (response.statusCode !== 204 && response.statusCode !== 200) { log.warn('SCORE POST FAIL', response.statusCode, response.statusMessage, this.name, body);
log.warn('SCORE POST FAIL', response.statusCode, response.statusMessage, _this.name, body);
}
} }
}; }
})(this)); });
} }
//else
// log.info 'SCORE POST OK', response.statusCode, response.statusMessage, @name, body
if (settings.modules.challonge.enabled && this.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && this.hostinfo.mode !== 2 && !this.kicked) { if (settings.modules.challonge.enabled && this.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && this.hostinfo.mode !== 2 && !this.kicked) {
room_name = this.name; room_name = this.name;
challonge.matches._update({ challonge.matches._update({
...@@ -1876,7 +1926,9 @@ ...@@ -1876,7 +1926,9 @@
zlib.deflate(recorder_buffer, function(err, replay_buffer) { zlib.deflate(recorder_buffer, function(err, replay_buffer) {
var date_time, recorded_ip; var date_time, recorded_ip;
replay_buffer = replay_buffer.toString('binary'); replay_buffer = replay_buffer.toString('binary');
//log.info err, replay_buffer
date_time = moment().format('YYYY-MM-DD HH:mm:ss'); date_time = moment().format('YYYY-MM-DD HH:mm:ss');
//replay_id=Math.floor(Math.random()*100000000)
redisdb.hmset("replay:" + replay_id, "replay_id", replay_id, "replay_buffer", replay_buffer, "player_names", player_names, "date_time", date_time); redisdb.hmset("replay:" + replay_id, "replay_id", replay_id, "replay_buffer", replay_buffer, "player_names", player_names, "date_time", date_time);
if (!log_rep_id && !settings.modules.cloud_replay.never_expire) { if (!log_rep_id && !settings.modules.cloud_replay.never_expire) {
redisdb.expire("replay:" + replay_id, 60 * 60 * 24); redisdb.expire("replay:" + replay_id, 60 * 60 * 24);
...@@ -1912,11 +1964,12 @@ ...@@ -1912,11 +1964,12 @@
ROOM_all[index] = null; ROOM_all[index] = null;
} }
if (!this.windbot && this.established && settings.modules.http.websocket_roomlist) { if (!this.windbot && this.established && settings.modules.http.websocket_roomlist) {
roomlist["delete"](this); //ROOM_all.splice(index, 1) unless index == -1
roomlist.delete(this);
} }
}; }
Room.prototype.get_playing_player = function() { get_playing_player() {
var playing_player; var playing_player;
playing_player = []; playing_player = [];
_.each(this.players, function(player) { _.each(this.players, function(player) {
...@@ -1925,9 +1978,9 @@ ...@@ -1925,9 +1978,9 @@
} }
}); });
return playing_player; return playing_player;
}; }
Room.prototype.get_host = function() { get_host() {
var host_player; var host_player;
host_player = null; host_player = null;
_.each(this.players, function(player) { _.each(this.players, function(player) {
...@@ -1936,9 +1989,9 @@ ...@@ -1936,9 +1989,9 @@
} }
}); });
return host_player; return host_player;
}; }
Room.prototype.get_disconnected_count = function() { get_disconnected_count() {
var found, len2, m, player, ref3; var found, len2, m, player, ref3;
if (!settings.modules.reconnect.enabled) { if (!settings.modules.reconnect.enabled) {
return 0; return 0;
...@@ -1952,9 +2005,9 @@ ...@@ -1952,9 +2005,9 @@
} }
} }
return found; return found;
}; }
Room.prototype.get_challonge_score = function() { get_challonge_score() {
var challonge_duel_log; var challonge_duel_log;
if (!settings.modules.challonge.enabled || this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || this.hostinfo.mode === 2) { if (!settings.modules.challonge.enabled || this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || this.hostinfo.mode === 2) {
return null; return null;
...@@ -1986,16 +2039,16 @@ ...@@ -1986,16 +2039,16 @@
} }
} }
return challonge_duel_log; return challonge_duel_log;
}; }
Room.prototype.get_old_hostinfo = function() { get_old_hostinfo() { // Just for supporting websocket roomlist in old MyCard client....
var ret; var ret;
ret = _.clone(this.hostinfo); ret = _.clone(this.hostinfo);
ret.enable_priority = this.hostinfo.duel_rule !== 5; ret.enable_priority = this.hostinfo.duel_rule !== 5;
return ret; return ret;
}; }
Room.prototype.send_replays = function() { send_replays() {
var len2, len3, m, n, player, ref3, ref4; var len2, len3, m, n, player, ref3, ref4;
if (!(settings.modules.replay_delay && this.replays.length && this.hostinfo.mode === 1)) { if (!(settings.modules.replay_delay && this.replays.length && this.hostinfo.mode === 1)) {
return false; return false;
...@@ -2011,23 +2064,23 @@ ...@@ -2011,23 +2064,23 @@
CLIENT_send_replays(player, this); CLIENT_send_replays(player, this);
} }
return true; return true;
}; }
Room.prototype.add_windbot = function(botdata) { add_windbot(botdata) {
this.windbot = botdata; this.windbot = botdata;
request({ request({
url: "http://" + settings.modules.windbot.server_ip + ":" + settings.modules.windbot.port + "/?name=" + (encodeURIComponent(botdata.name)) + "&deck=" + (encodeURIComponent(botdata.deck)) + "&host=" + settings.modules.windbot.my_ip + "&port=" + settings.port + "&dialog=" + (encodeURIComponent(botdata.dialog)) + "&version=" + settings.version + "&password=" + (encodeURIComponent(this.name)) url: `http://${settings.modules.windbot.server_ip}:${settings.modules.windbot.port}/?name=${encodeURIComponent(botdata.name)}&deck=${encodeURIComponent(botdata.deck)}&host=${settings.modules.windbot.my_ip}&port=${settings.port}&dialog=${encodeURIComponent(botdata.dialog)}&version=${settings.version}&password=${encodeURIComponent(this.name)}`
}, (function(_this) { }, (error, response, body) => {
return function(error, response, body) { if (error) {
if (error) { log.warn('windbot add error', error, this.name);
log.warn('windbot add error', error, _this.name); ygopro.stoc_send_chat_to_room(this, "${add_windbot_failed}", ygopro.constants.COLORS.RED);
ygopro.stoc_send_chat_to_room(_this, "${add_windbot_failed}", ygopro.constants.COLORS.RED); }
} });
}; }
})(this));
};
Room.prototype.connect = function(client) { //else
//log.info "windbot added"
connect(client) {
var host_player; var host_player;
this.players.push(client); this.players.push(client);
client.join_time = moment(); client.join_time = moment();
...@@ -2035,9 +2088,11 @@ ...@@ -2035,9 +2088,11 @@
client.abuse_count = 0; client.abuse_count = 0;
host_player = this.get_host(); host_player = this.get_host();
if (host_player && (host_player !== client)) { if (host_player && (host_player !== client)) {
// 进来时已经有人在等待了,互相记录为匹配过
ROOM_players_oppentlist[host_player.ip] = client.ip; ROOM_players_oppentlist[host_player.ip] = client.ip;
ROOM_players_oppentlist[client.ip] = host_player.ip; ROOM_players_oppentlist[client.ip] = host_player.ip;
} else { } else {
// 第一个玩家刚进来,还没就位
ROOM_players_oppentlist[client.ip] = null; ROOM_players_oppentlist[client.ip] = null;
} }
} }
...@@ -2056,21 +2111,23 @@ ...@@ -2056,21 +2111,23 @@
client.pre_establish_buffers = []; client.pre_establish_buffers = [];
}); });
} }
}; }
Room.prototype.disconnect = function(client, error) { disconnect(client, error) {
var index, left_name, len2, len3, m, n, player, ref3, ref4; var index, left_name, len2, len3, m, n, player, ref3, ref4;
if (client.had_new_reconnection) { if (client.had_new_reconnection) {
return; return;
} }
if (client.is_post_watcher) { if (client.is_post_watcher) {
ygopro.stoc_send_chat_to_room(this, (client.name + " ${quit_watch}") + (error ? ": " + error : '')); ygopro.stoc_send_chat_to_room(this, `${client.name} \${quit_watch}` + (error ? `: ${error}` : ''));
index = _.indexOf(this.watchers, client); index = _.indexOf(this.watchers, client);
if (index !== -1) { if (index !== -1) {
this.watchers.splice(index, 1); this.watchers.splice(index, 1);
} }
//client.room = null
SERVER_kick(client.server); SERVER_kick(client.server);
} else { } else {
//log.info(client.name, @duel_stage != ygopro.constants.DUEL_STAGE.BEGIN, @disconnector, @random_type, @players.length)
if (this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && this.disconnector !== 'server' && !this.arena_score_handled) { if (this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && this.disconnector !== 'server' && !this.arena_score_handled) {
if (settings.modules.arena_mode.punish_quit_before_match && this.players.length === 2 && !client.arena_quit_free) { if (settings.modules.arena_mode.punish_quit_before_match && this.players.length === 2 && !client.arena_quit_free) {
ref3 = this.players; ref3 = this.players;
...@@ -2113,22 +2170,24 @@ ...@@ -2113,22 +2170,24 @@
} }
if (this.players.length && !(this.windbot && client.is_host) && !(this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && client.pos <= 3)) { if (this.players.length && !(this.windbot && client.is_host) && !(this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && client.pos <= 3)) {
left_name = (settings.modules.hide_name && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN ? "********" : client.name); left_name = (settings.modules.hide_name && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN ? "********" : client.name);
ygopro.stoc_send_chat_to_room(this, (left_name + " ${left_game}") + (error ? ": " + error : '')); ygopro.stoc_send_chat_to_room(this, `${left_name} \${left_game}` + (error ? `: ${error}` : ''));
if (!this.windbot && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.http.websocket_roomlist) { if (!this.windbot && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.http.websocket_roomlist) {
roomlist.update(this); roomlist.update(this);
} }
} else { } else {
//client.room = null
this.send_replays(); this.send_replays();
this.process.kill(); this.process.kill();
this["delete"](); //client.room = null
this.delete();
} }
if (!CLIENT_reconnect_unregister(client, false, true)) { if (!CLIENT_reconnect_unregister(client, false, true)) {
SERVER_kick(client.server); SERVER_kick(client.server);
} }
} }
}; }
Room.prototype.start_death = function() { start_death() {
var oppo_pos, win_pos; var oppo_pos, win_pos;
if (this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || this.death) { if (this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || this.death) {
return false; return false;
...@@ -2142,7 +2201,7 @@ ...@@ -2142,7 +2201,7 @@
break; break;
default: default:
this.death = (this.turn ? this.turn + 4 : 5); this.death = (this.turn ? this.turn + 4 : 5);
ygopro.stoc_send_chat_to_room(this, "${death_start}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat_to_room(this, "${death_start}", ygopro.constants.COLORS.BABYBLUE); // Extra duel started in siding
} }
} else { } else {
switch (settings.modules.http.quick_death_rule) { switch (settings.modules.http.quick_death_rule) {
...@@ -2184,21 +2243,20 @@ ...@@ -2184,21 +2243,20 @@
} }
} }
return true; return true;
}; }
Room.prototype.cancel_death = function() { cancel_death() {
if (this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || !this.death) { if (this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN || !this.death) {
return false; return false;
} }
this.death = 0; this.death = 0;
ygopro.stoc_send_chat_to_room(this, "${death_cancel}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat_to_room(this, "${death_cancel}", ygopro.constants.COLORS.BABYBLUE);
return true; return true;
}; }
return Room;
})(); };
// 网络连接
net.createServer(function(client) { net.createServer(function(client) {
var connect_count, server; var connect_count, server;
client.ip = client.remoteAddress; client.ip = client.remoteAddress;
...@@ -2208,18 +2266,25 @@ ...@@ -2208,18 +2266,25 @@
connect_count++; connect_count++;
} }
ROOM_connected_ip[client.ip] = connect_count; ROOM_connected_ip[client.ip] = connect_count;
//log.info "connect", client.ip, ROOM_connected_ip[client.ip]
// server stand for the connection to ygopro server process
server = new net.Socket(); server = new net.Socket();
client.server = server; client.server = server;
server.client = client; server.client = client;
client.setTimeout(2000); client.setTimeout(2000); //连接前超时2秒
// 释放处理
client.on('close', function(had_error) { client.on('close', function(had_error) {
var room; var room;
//log.info "client closed", client.name, had_error
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
connect_count = ROOM_connected_ip[client.ip]; connect_count = ROOM_connected_ip[client.ip];
if (connect_count > 0) { if (connect_count > 0) {
connect_count--; connect_count--;
} }
ROOM_connected_ip[client.ip] = connect_count; ROOM_connected_ip[client.ip] = connect_count;
//log.info "disconnect", client.ip, ROOM_connected_ip[client.ip]
if (!client.closed) { if (!client.closed) {
client.closed = true; client.closed = true;
if (settings.modules.heartbeat_detection.enabled) { if (settings.modules.heartbeat_detection.enabled) {
...@@ -2236,12 +2301,14 @@ ...@@ -2236,12 +2301,14 @@
}); });
client.on('error', function(error) { client.on('error', function(error) {
var room; var room;
//log.info "client error", client.name, error
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
connect_count = ROOM_connected_ip[client.ip]; connect_count = ROOM_connected_ip[client.ip];
if (connect_count > 0) { if (connect_count > 0) {
connect_count--; connect_count--;
} }
ROOM_connected_ip[client.ip] = connect_count; ROOM_connected_ip[client.ip] = connect_count;
//log.info "err disconnect", client.ip, ROOM_connected_ip[client.ip]
if (!client.closed) { if (!client.closed) {
client.closed = true; client.closed = true;
if (room) { if (room) {
...@@ -2266,12 +2333,16 @@ ...@@ -2266,12 +2333,16 @@
if (!server.client) { if (!server.client) {
return; return;
} }
//log.info "server closed", server.client.name, had_error
room = ROOM_all[server.client.rid]; room = ROOM_all[server.client.rid];
if (room && !server.system_kicked && !server.had_new_reconnection) { if (room && !server.system_kicked && !server.had_new_reconnection) {
//log.info "server close", server.client.ip, ROOM_connected_ip[server.client.ip]
room.disconnector = 'server'; room.disconnector = 'server';
} }
if (!server.client.closed) { if (!server.client.closed) {
ygopro.stoc_send_chat(server.client, "${server_closed}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(server.client, "${server_closed}", ygopro.constants.COLORS.RED);
//if room and settings.modules.replay_delay
// room.send_replays()
CLIENT_kick(server.client); CLIENT_kick(server.client);
SERVER_clear_disconnect(server); SERVER_clear_disconnect(server);
} }
...@@ -2282,12 +2353,16 @@ ...@@ -2282,12 +2353,16 @@
if (!server.client) { if (!server.client) {
return; return;
} }
//log.info "server error", client.name, error
room = ROOM_all[server.client.rid]; room = ROOM_all[server.client.rid];
if (room && !server.system_kicked && !server.had_new_reconnection) { if (room && !server.system_kicked && !server.had_new_reconnection) {
//log.info "server err close", client.ip, ROOM_connected_ip[client.ip]
room.disconnector = 'server'; room.disconnector = 'server';
} }
if (!server.client.closed) { if (!server.client.closed) {
ygopro.stoc_send_chat(server.client, "${server_error}: " + error, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(server.client, `\${server_error}: ${error}`, ygopro.constants.COLORS.RED);
//if room and settings.modules.replay_delay
// room.send_replays()
CLIENT_kick(server.client); CLIENT_kick(server.client);
SERVER_clear_disconnect(server); SERVER_clear_disconnect(server);
} }
...@@ -2313,13 +2388,15 @@ ...@@ -2313,13 +2388,15 @@
CLIENT_kick(client); CLIENT_kick(client);
return; return;
} }
ygopro.stoc_send_chat(client, "${cloud_replay_playing} R#" + replay.replay_id + " " + replay.player_names + " " + replay.date_time, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, `\${cloud_replay_playing} R#${replay.replay_id} ${replay.player_names} ${replay.date_time}`, ygopro.constants.COLORS.BABYBLUE);
client.write(replay_buffer, function() { client.write(replay_buffer, function() {
CLIENT_kick(client); CLIENT_kick(client);
}); });
}); });
}; };
} }
// 需要重构
// 客户端到服务端(ctos)协议分析
client.pre_establish_buffers = new Array(); client.pre_establish_buffers = new Array();
client.on('data', function(ctos_buffer) { client.on('data', function(ctos_buffer) {
var b, bad_ip_count, buffer, cancel, ctos_event, ctos_message_length, ctos_proto, datas, info, len2, len3, len4, len5, looplimit, m, n, o, p, ref3, ref4, result, room, struct; var b, bad_ip_count, buffer, cancel, ctos_event, ctos_message_length, ctos_proto, datas, info, len2, len3, len4, len5, looplimit, m, n, o, p, ref3, ref4, result, room, struct;
...@@ -2329,8 +2406,10 @@ ...@@ -2329,8 +2406,10 @@
room.watcher.write(ctos_buffer); room.watcher.write(ctos_buffer);
} }
} else { } else {
//ctos_buffer = Buffer.alloc(0)
ctos_message_length = 0; ctos_message_length = 0;
ctos_proto = 0; ctos_proto = 0;
//ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
datas = []; datas = [];
looplimit = 0; looplimit = 0;
while (true) { while (true) {
...@@ -2352,6 +2431,7 @@ ...@@ -2352,6 +2431,7 @@
} }
} else { } else {
if (ctos_buffer.length >= 2 + ctos_message_length) { if (ctos_buffer.length >= 2 + ctos_message_length) {
//console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
cancel = false; cancel = false;
if (settings.modules.reconnect.enabled && client.pre_reconnecting && ygopro.constants.CTOS[ctos_proto] !== 'UPDATE_DECK') { if (settings.modules.reconnect.enabled && client.pre_reconnecting && ygopro.constants.CTOS[ctos_proto] !== 'UPDATE_DECK') {
cancel = true; cancel = true;
...@@ -2411,6 +2491,7 @@ ...@@ -2411,6 +2491,7 @@
} }
} }
looplimit++; looplimit++;
//log.info(looplimit)
if (looplimit > 800 || ROOM_bad_ip[client.ip] > 5) { if (looplimit > 800 || ROOM_bad_ip[client.ip] > 5) {
log.info("error ctos", client.name, client.ip); log.info("error ctos", client.name, client.ip);
bad_ip_count = ROOM_bad_ip[client.ip]; bad_ip_count = ROOM_bad_ip[client.ip];
...@@ -2439,10 +2520,16 @@ ...@@ -2439,10 +2520,16 @@
} }
} }
}); });
// 服务端到客户端(stoc)
server.on('data', function(stoc_buffer) { server.on('data', function(stoc_buffer) {
var b, buffer, cancel, datas, info, len2, len3, len4, looplimit, m, n, o, ref3, ref4, result, stoc_event, stoc_message_length, stoc_proto, struct; var b, buffer, cancel, datas, info, len2, len3, len4, looplimit, m, n, o, ref3, ref4, result, stoc_event, stoc_message_length, stoc_proto, struct;
//stoc_buffer = Buffer.alloc(0)
stoc_message_length = 0; stoc_message_length = 0;
stoc_proto = 0; stoc_proto = 0;
//stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
//unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
//server.client.write data
datas = []; datas = [];
looplimit = 0; looplimit = 0;
while (true) { while (true) {
...@@ -2464,6 +2551,7 @@ ...@@ -2464,6 +2551,7 @@
} }
} else { } else {
if (stoc_buffer.length >= 2 + stoc_message_length) { if (stoc_buffer.length >= 2 + stoc_message_length) {
//console.log "STOC", ygopro.constants.STOC[stoc_proto]
cancel = false; cancel = false;
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3); b = stoc_buffer.slice(3, stoc_message_length - 1 + 3);
info = null; info = null;
...@@ -2518,6 +2606,7 @@ ...@@ -2518,6 +2606,7 @@
} }
} }
looplimit++; looplimit++;
//log.info(looplimit)
if (looplimit > 800) { if (looplimit > 800) {
log.info("error stoc", server.client.name); log.info("error stoc", server.client.name);
server.destroy(); server.destroy();
...@@ -2548,8 +2637,12 @@ ...@@ -2548,8 +2637,12 @@
return parsed_deck_name && (player_name === parsed_deck_name[1] || player_name === parsed_deck_name[2]); return parsed_deck_name && (player_name === parsed_deck_name[1] || player_name === parsed_deck_name[2]);
}; };
// 功能模块
// return true to cancel a synchronous message
ygopro.ctos_follow('PLAYER_INFO', true, function(buffer, info, client, server, datas) { ygopro.ctos_follow('PLAYER_INFO', true, function(buffer, info, client, server, datas) {
var geo, lang, name, name_full, struct, vpass; var geo, lang, name, name_full, struct, vpass;
// checkmate use username$password, but here don't
// so remove the password
name_full = info.name.split("$"); name_full = info.name.split("$");
name = name_full[0]; name = name_full[0];
vpass = name_full[1]; vpass = name_full[1];
...@@ -2569,6 +2662,7 @@ ...@@ -2569,6 +2662,7 @@
client.rag = true; client.rag = true;
} }
if (settings.modules.mycard.enabled) { if (settings.modules.mycard.enabled) {
//console.log(name)
request({ request({
url: settings.modules.mycard.ban_get, url: settings.modules.mycard.ban_get,
json: true, json: true,
...@@ -2576,6 +2670,7 @@ ...@@ -2576,6 +2670,7 @@
user: name user: name
} }
}, function(error, response, body) { }, function(error, response, body) {
//console.log(body)
if (_.isString(body)) { if (_.isString(body)) {
log.warn("ban get bad json", body); log.warn("ban get bad json", body);
} else if (error || !body) { } else if (error || !body) {
...@@ -2592,11 +2687,12 @@ ...@@ -2592,11 +2687,12 @@
client.name = name; client.name = name;
client.vpass = vpass; client.vpass = vpass;
client.name_vpass = vpass ? name + "$" + vpass : name; client.name_vpass = vpass ? name + "$" + vpass : name;
//console.log client.name, client.vpass
if (settings.modules.vip.enabled && CLIENT_check_vip(client)) { if (settings.modules.vip.enabled && CLIENT_check_vip(client)) {
client.vip = true; client.vip = true;
} }
if (!settings.modules.i18n.auto_pick || client.is_local) { if (!settings.modules.i18n.auto_pick || client.is_local) {
client.lang = settings.modules.i18n["default"]; client.lang = settings.modules.i18n.default;
} else { } else {
geo = geoip.lookup(client.ip); geo = geoip.lookup(client.ip);
if (!geo) { if (!geo) {
...@@ -2606,6 +2702,7 @@ ...@@ -2606,6 +2702,7 @@
if (lang = settings.modules.i18n.map[geo.country]) { if (lang = settings.modules.i18n.map[geo.country]) {
client.lang = lang; client.lang = lang;
} else { } else {
//log.info("Not in map", geo.country, client.name, client.ip)
client.lang = settings.modules.i18n.fallback; client.lang = settings.modules.i18n.fallback;
} }
} }
...@@ -2615,6 +2712,7 @@ ...@@ -2615,6 +2712,7 @@
ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) { ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) {
var check_buffer_indentity, create_room_with_action, len2, len3, len4, len5, line, m, n, name, o, p, pre_room, ref3, ref4, ref5, ref6, replay_id, room; var check_buffer_indentity, create_room_with_action, len2, len3, len4, len5, line, m, n, name, o, p, pre_room, ref3, ref4, ref5, ref6, replay_id, room;
//log.info info
info.pass = info.pass.trim(); info.pass = info.pass.trim();
client.pass = info.pass; client.pass = info.pass;
if (CLIENT_is_able_to_reconnect(client) || CLIENT_is_able_to_kick_reconnect(client)) { if (CLIENT_is_able_to_reconnect(client) || CLIENT_is_able_to_kick_reconnect(client)) {
...@@ -2635,10 +2733,11 @@ ...@@ -2635,10 +2733,11 @@
} }
return; return;
} }
ygopro.stoc_send_chat(client, "<" + (id - 0 + 1) + "> R#" + replay_id + " " + replay.player_names + " " + replay.date_time, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, `<${id - 0 + 1}> R#${replay_id} ${replay.player_names} ${replay.date_time}`, ygopro.constants.COLORS.BABYBLUE);
}); });
}); });
}); });
// 强行等待异步执行完毕_(:з」∠)_
setTimeout((function() { setTimeout((function() {
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1, msg: 1,
...@@ -2667,7 +2766,7 @@ ...@@ -2667,7 +2766,7 @@
} else if (info.pass.toUpperCase() === "W" && settings.modules.cloud_replay.enabled) { } else if (info.pass.toUpperCase() === "W" && settings.modules.cloud_replay.enabled) {
replay_id = Cloud_replay_ids[Math.floor(Math.random() * Cloud_replay_ids.length)]; replay_id = Cloud_replay_ids[Math.floor(Math.random() * Cloud_replay_ids.length)];
redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay); redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay);
} else if (info.version !== settings.version) { } else if (info.version !== settings.version) { // and (info.version < 9020 or settings.version != 4927) #强行兼容23333版
ygopro.stoc_send_chat(client, settings.modules.update, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, settings.modules.update, ygopro.constants.COLORS.RED);
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 4, msg: 4,
...@@ -2682,6 +2781,12 @@ ...@@ -2682,6 +2781,12 @@
ygopro.stoc_die(client, '${invalid_password_length}'); ygopro.stoc_die(client, '${invalid_password_length}');
return; return;
} }
//if info.version >= 9020 and settings.version == 4927 #强行兼容23333版
// info.version = settings.version
// struct = ygopro.structs["CTOS_JoinGame"]
// struct._setBuff(buffer)
// struct.set("version", info.version)
// buffer = struct.buffer
buffer = Buffer.from(info.pass.slice(0, 8), 'base64'); buffer = Buffer.from(info.pass.slice(0, 8), 'base64');
if (buffer.length !== 6) { if (buffer.length !== 6) {
ygopro.stoc_die(client, '${invalid_password_payload}'); ygopro.stoc_die(client, '${invalid_password_payload}');
...@@ -2690,7 +2795,7 @@ ...@@ -2690,7 +2795,7 @@
check_buffer_indentity = function(buf) { check_buffer_indentity = function(buf) {
var checksum, i, m, ref3; var checksum, i, m, ref3;
checksum = 0; checksum = 0;
for (i = m = 0, ref3 = buf.length; 0 <= ref3 ? m < ref3 : m > ref3; i = 0 <= ref3 ? ++m : --m) { for (i = m = 0, ref3 = buf.length; (0 <= ref3 ? m < ref3 : m > ref3); i = 0 <= ref3 ? ++m : --m) {
checksum += buf.readUInt8(i); checksum += buf.readUInt8(i);
} }
return (checksum & 0xFF) === 0; return (checksum & 0xFF) === 0;
...@@ -2705,6 +2810,11 @@ ...@@ -2705,6 +2810,11 @@
ygopro.stoc_die(client, '${invalid_password_unauthorized}'); ygopro.stoc_die(client, '${invalid_password_unauthorized}');
return; return;
} }
// 1 create public room
// 2 create private room
// 3 join room by id
// 4 create or join room by id (use for match)
// 5 join room by title
switch (action) { switch (action) {
case 1: case 1:
case 2: case 2:
...@@ -2762,7 +2872,7 @@ ...@@ -2762,7 +2872,7 @@
room = new Room(name, options); room = new Room(name, options);
if (room) { if (room) {
room.title = room_title; room.title = room_title;
room["private"] = action === 2; room.private = action === 2;
} }
break; break;
case 3: case 3:
...@@ -2789,7 +2899,7 @@ ...@@ -2789,7 +2899,7 @@
ygopro.stoc_die(client, '${invalid_password_unauthorized}'); ygopro.stoc_die(client, '${invalid_password_unauthorized}');
return; return;
} }
room["private"] = true; room.private = true;
room.arena = settings.modules.arena_mode.mode; room.arena = settings.modules.arena_mode.mode;
if (room.arena === "athletic") { if (room.arena === "athletic") {
room.max_player = 2; room.max_player = 2;
...@@ -2815,7 +2925,7 @@ ...@@ -2815,7 +2925,7 @@
ygopro.stoc_die(client, room.error); ygopro.stoc_die(client, room.error);
} else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) { } else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) { if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) {
client.setTimeout(300000); client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) {
...@@ -2831,7 +2941,7 @@ ...@@ -2831,7 +2941,7 @@
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} }
ygopro.stoc_send_chat_to_room(room, client.name + " ${watch_join}"); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref6 = room.watcher_buffers; ref6 = room.watcher_buffers;
...@@ -2845,7 +2955,8 @@ ...@@ -2845,7 +2955,8 @@
} else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) { } else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) {
ygopro.stoc_die(client, "${watch_denied_room}"); ygopro.stoc_die(client, "${watch_denied_room}");
} else { } else {
client.setTimeout(300000); //client.room = room
client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
room.connect(client); room.connect(client);
} }
...@@ -2903,6 +3014,7 @@ ...@@ -2903,6 +3014,7 @@
return; return;
} }
} }
//TODO: query database directly, like preload.
request({ request({
baseUrl: settings.modules.mycard.auth_base_url, baseUrl: settings.modules.mycard.auth_base_url,
url: '/users/' + encodeURIComponent(client.name) + '.json', url: '/users/' + encodeURIComponent(client.name) + '.json',
...@@ -2955,10 +3067,10 @@ ...@@ -2955,10 +3067,10 @@
pre_room = ROOM_find_by_name(info.pass); pre_room = ROOM_find_by_name(info.pass);
if (pre_room && pre_room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.cloud_replay.enable_halfway_watch && !pre_room.hostinfo.no_watch) { if (pre_room && pre_room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.cloud_replay.enable_halfway_watch && !pre_room.hostinfo.no_watch) {
room = pre_room; room = pre_room;
client.setTimeout(300000); client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
ygopro.stoc_send_chat_to_room(room, client.name + " ${watch_join}"); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref3 = room.watcher_buffers; ref3 = room.watcher_buffers;
...@@ -2968,7 +3080,7 @@ ...@@ -2968,7 +3080,7 @@
} }
} else { } else {
ygopro.stoc_send_chat(client, '${loading_user_info}', ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, '${loading_user_info}', ygopro.constants.COLORS.BABYBLUE);
client.setTimeout(300000); client.setTimeout(300000); //连接后超时5分钟
_async.auto({ _async.auto({
participant_data: function(done) { participant_data: function(done) {
challonge.participants._index({ challonge.participants._index({
...@@ -3019,9 +3131,13 @@ ...@@ -3019,9 +3131,13 @@
ygopro.stoc_die(client, '${challonge_match_not_found}'); ygopro.stoc_die(client, '${challonge_match_not_found}');
return; return;
} }
//if found.winnerId
// ygopro.stoc_die(client, '${challonge_match_already_finished}')
// return
room = ROOM_find_or_create_by_name('M#' + found.id); room = ROOM_find_or_create_by_name('M#' + found.id);
if (room) { if (room) {
room.challonge_info = found; room.challonge_info = found;
// room.max_player = 2
room.welcome = "${challonge_match_created}"; room.welcome = "${challonge_match_created}";
} }
if (!room) { if (!room) {
...@@ -3030,6 +3146,7 @@ ...@@ -3030,6 +3146,7 @@
ygopro.stoc_die(client, room.error); ygopro.stoc_die(client, room.error);
} else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) { } else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) { if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) {
//client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) {
...@@ -3045,7 +3162,7 @@ ...@@ -3045,7 +3162,7 @@
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} }
ygopro.stoc_send_chat_to_room(room, client.name + " ${watch_join}"); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref8 = room.watcher_buffers; ref8 = room.watcher_buffers;
...@@ -3068,6 +3185,8 @@ ...@@ -3068,6 +3185,8 @@
ygopro.stoc_die(client, "${challonge_player_already_in}"); ygopro.stoc_die(client, "${challonge_player_already_in}");
return; return;
} }
//client.room = room
//client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
room.connect(client); room.connect(client);
} }
...@@ -3078,12 +3197,12 @@ ...@@ -3078,12 +3197,12 @@
} else if (ROOM_connected_ip[client.ip] > 5) { } else if (ROOM_connected_ip[client.ip] > 5) {
log.warn("MULTI LOGIN", client.name, client.ip); log.warn("MULTI LOGIN", client.name, client.ip);
ygopro.stoc_die(client, "${too_much_connection}" + client.ip); ygopro.stoc_die(client, "${too_much_connection}" + client.ip);
} else if (_.indexOf(settings.ban.banned_user, client.name) > -1) { } else if (_.indexOf(settings.ban.banned_user, client.name) > -1) { //账号被封
settings.ban.banned_ip.push(client.ip); settings.ban.banned_ip.push(client.ip);
setting_save(settings); setting_save(settings);
log.warn("BANNED USER LOGIN", client.name, client.ip); log.warn("BANNED USER LOGIN", client.name, client.ip);
ygopro.stoc_die(client, "${banned_user_login}"); ygopro.stoc_die(client, "${banned_user_login}");
} else if (_.indexOf(settings.ban.banned_ip, client.ip) > -1) { } else if (_.indexOf(settings.ban.banned_ip, client.ip) > -1) { //IP被封
log.warn("BANNED IP LOGIN", client.name, client.ip); log.warn("BANNED IP LOGIN", client.name, client.ip);
ygopro.stoc_die(client, "${banned_ip_login}"); ygopro.stoc_die(client, "${banned_ip_login}");
} else if (!settings.modules.tournament_mode.enabled && !settings.modules.challonge.enabled && _.any(badwords.level3, function(badword) { } else if (!settings.modules.tournament_mode.enabled && !settings.modules.challonge.enabled && _.any(badwords.level3, function(badword) {
...@@ -3110,6 +3229,15 @@ ...@@ -3110,6 +3229,15 @@
} else if (info.pass.length && !ROOM_validate(info.pass)) { } else if (info.pass.length && !ROOM_validate(info.pass)) {
ygopro.stoc_die(client, "${invalid_password_room}"); ygopro.stoc_die(client, "${invalid_password_room}");
} else { } else {
//if info.version >= 9020 and settings.version == 4927 #强行兼容23333版
// info.version = settings.version
// struct = ygopro.structs["CTOS_JoinGame"]
// struct._setBuff(buffer)
// struct.set("version", info.version)
// buffer = struct.buffer
// #ygopro.stoc_send_chat(client, "看起来你是YGOMobile的用户,请记得更新先行卡补丁,否则会看到白卡", ygopro.constants.COLORS.GREEN)
//log.info 'join_game',info.pass, client.name
room = ROOM_find_or_create_by_name(info.pass, client.ip); room = ROOM_find_or_create_by_name(info.pass, client.ip);
if (!room) { if (!room) {
ygopro.stoc_die(client, "${server_full}"); ygopro.stoc_die(client, "${server_full}");
...@@ -3117,7 +3245,7 @@ ...@@ -3117,7 +3245,7 @@
ygopro.stoc_die(client, room.error); ygopro.stoc_die(client, room.error);
} else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) { } else if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) { if (settings.modules.cloud_replay.enable_halfway_watch && !room.hostinfo.no_watch) {
client.setTimeout(300000); client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) {
...@@ -3133,7 +3261,7 @@ ...@@ -3133,7 +3261,7 @@
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} }
ygopro.stoc_send_chat_to_room(room, client.name + " ${watch_join}"); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref6 = room.watcher_buffers; ref6 = room.watcher_buffers;
...@@ -3147,7 +3275,7 @@ ...@@ -3147,7 +3275,7 @@
} else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) { } else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) {
ygopro.stoc_die(client, "${watch_denied_room}"); ygopro.stoc_die(client, "${watch_denied_room}");
} else { } else {
client.setTimeout(300000); client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
room.connect(client); room.connect(client);
} }
...@@ -3156,6 +3284,7 @@ ...@@ -3156,6 +3284,7 @@
ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) { ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server, datas) {
var len2, len3, len4, line, m, n, o, player, recorder, ref3, ref4, ref5, room, watcher; var len2, len3, len4, line, m, n, o, player, recorder, ref3, ref4, ref5, room, watcher;
//欢迎信息
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
return; return;
...@@ -3182,7 +3311,7 @@ ...@@ -3182,7 +3311,7 @@
if (room.welcome) { if (room.welcome) {
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE);
} }
if (settings.modules.arena_mode.enabled && !client.is_local) { if (settings.modules.arena_mode.enabled && !client.is_local) { //and not client.score_shown
request({ request({
url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name), url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name),
json: true json: true
...@@ -3193,11 +3322,13 @@ ...@@ -3193,11 +3322,13 @@
} else if (!body || _.isString(body)) { } else if (!body || _.isString(body)) {
log.warn('LOAD SCORE FAIL', client.name, response.statusCode, response.statusMessage, body); log.warn('LOAD SCORE FAIL', client.name, response.statusCode, response.statusMessage, body);
} else { } else {
//log.info 'LOAD SCORE', client.name, body
rank_txt = body.arena_rank > 0 ? "${rank_arena}" + body.arena_rank : "${rank_blank}"; rank_txt = body.arena_rank > 0 ? "${rank_arena}" + body.arena_rank : "${rank_blank}";
ygopro.stoc_send_chat(client, client.name + "${exp_value_part1}" + body.exp + "${exp_value_part2}${exp_value_part3}" + (Math.round(body.pt)) + rank_txt + "${exp_value_part4}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, `${client.name}\${exp_value_part1}${body.exp}\${exp_value_part2}\${exp_value_part3}${Math.round(body.pt)}${rank_txt}\${exp_value_part4}`, ygopro.constants.COLORS.BABYBLUE);
} }
}); });
} }
//client.score_shown = true
if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') { if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') {
ygopro.stoc_send_chat_to_room(room, ROOM_player_get_score(client), ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat_to_room(room, ROOM_player_get_score(client), ygopro.constants.COLORS.GREEN);
ref5 = room.players; ref5 = room.players;
...@@ -3249,7 +3380,7 @@ ...@@ -3249,7 +3380,7 @@
ref6 = room.watchers; ref6 = room.watchers;
for (p = 0, len5 = ref6.length; p < len5; p++) { for (p = 0, len5 = ref6.length; p < len5; p++) {
w = ref6[p]; w = ref6[p];
if (w) { if (w) { //a WTF fix
w.write(data); w.write(data);
} }
} }
...@@ -3258,6 +3389,8 @@ ...@@ -3258,6 +3389,8 @@
} }
}); });
// 登场台词
//log.error "watcher error", error
load_words = global.load_words = function(callback) { load_words = global.load_words = function(callback) {
request({ request({
url: settings.modules.words.get, url: settings.modules.words.get,
...@@ -3364,14 +3497,19 @@ ...@@ -3364,14 +3497,19 @@
client.last_game_msg = buffer; client.last_game_msg = buffer;
client.last_game_msg_title = ygopro.constants.MSG[msg]; client.last_game_msg_title = ygopro.constants.MSG[msg];
} }
// log.info(client.name, client.last_game_msg_title)
} else if (ygopro.constants.MSG[msg] !== 'RETRY') { } else if (ygopro.constants.MSG[msg] !== 'RETRY') {
client.last_game_msg = buffer; client.last_game_msg = buffer;
client.last_game_msg_title = ygopro.constants.MSG[msg]; client.last_game_msg_title = ygopro.constants.MSG[msg];
} }
if ((msg >= 10 && msg < 30) || msg === 132 || (msg >= 140 && msg <= 144)) { // log.info(client.name, client.last_game_msg_title)
if ((msg >= 10 && msg < 30) || msg === 132 || (msg >= 140 && msg <= 144)) { //SELECT和ANNOUNCE开头的消息
room.waiting_for_player = client; room.waiting_for_player = client;
room.last_active_time = moment(); room.last_active_time = moment();
} }
//log.info("#{ygopro.constants.MSG[msg]}等待#{room.waiting_for_player.name}")
//log.info 'MSG', ygopro.constants.MSG[msg]
if (ygopro.constants.MSG[msg] === 'START') { if (ygopro.constants.MSG[msg] === 'START') {
playertype = buffer.readUInt8(1); playertype = buffer.readUInt8(1);
client.is_first = !(playertype & 0xf); client.is_first = !(playertype & 0xf);
...@@ -3399,6 +3537,7 @@ ...@@ -3399,6 +3537,7 @@
client.last_game_msg = null; client.last_game_msg = null;
} }
} }
//ygopro.stoc_send_chat_to_room(room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
if (ygopro.constants.MSG[msg] === 'HINT') { if (ygopro.constants.MSG[msg] === 'HINT') {
hint_type = buffer.readUInt8(1); hint_type = buffer.readUInt8(1);
if (hint_type === 3) { if (hint_type === 3) {
...@@ -3453,6 +3592,8 @@ ...@@ -3453,6 +3592,8 @@
pos = pos * 2; pos = pos * 2;
} }
reason = buffer.readUInt8(2); reason = buffer.readUInt8(2);
//log.info {winner: pos, reason: reason}
//room.duels.push {winner: pos, reason: reason}
room.winner = pos; room.winner = pos;
room.turn = 0; room.turn = 0;
room.duel_stage = ygopro.constants.DUEL_STAGE.END; room.duel_stage = ygopro.constants.DUEL_STAGE.END;
...@@ -3467,6 +3608,7 @@ ...@@ -3467,6 +3608,7 @@
} }
if (room && !room.finished && room.dueling_players[pos]) { if (room && !room.finished && room.dueling_players[pos]) {
room.winner_name = room.dueling_players[pos].name_vpass; room.winner_name = room.dueling_players[pos].name_vpass;
//log.info room.dueling_players, pos
room.scores[room.winner_name] = room.scores[room.winner_name] + 1; room.scores[room.winner_name] = room.scores[room.winner_name] + 1;
if (room.match_kill) { if (room.match_kill) {
room.match_kill = false; room.match_kill = false;
...@@ -3497,6 +3639,7 @@ ...@@ -3497,6 +3639,7 @@
if (ygopro.constants.MSG[msg] === 'MATCH_KILL' && client.pos === 0) { if (ygopro.constants.MSG[msg] === 'MATCH_KILL' && client.pos === 0) {
room.match_kill = true; room.match_kill = true;
} }
//lp跟踪
if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.pos === 0) { if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.pos === 0) {
pos = buffer.readUInt8(1); pos = buffer.readUInt8(1);
if (!client.is_first) { if (!client.is_first) {
...@@ -3553,6 +3696,8 @@ ...@@ -3553,6 +3696,8 @@
ygopro.stoc_send_chat_to_room(room, "${lp_low_self}", ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, "${lp_low_self}", ygopro.constants.COLORS.PINK);
} }
} }
//track card count
//todo: track card count in tag mode
if (ygopro.constants.MSG[msg] === 'MOVE' && room.hostinfo.mode !== 2) { if (ygopro.constants.MSG[msg] === 'MOVE' && room.hostinfo.mode !== 2) {
pos = buffer.readUInt8(5); pos = buffer.readUInt8(5);
if (!client.is_first) { if (!client.is_first) {
...@@ -3581,12 +3726,13 @@ ...@@ -3581,12 +3726,13 @@
client.card_count += count; client.card_count += count;
} }
} }
// check panel confirming cards in heartbeat
if (settings.modules.heartbeat_detection.enabled && ygopro.constants.MSG[msg] === 'CONFIRM_CARDS') { if (settings.modules.heartbeat_detection.enabled && ygopro.constants.MSG[msg] === 'CONFIRM_CARDS') {
check = false; check = false;
count = buffer.readInt8(2); count = buffer.readInt8(2);
max_loop = 3 + (count - 1) * 7; max_loop = 3 + (count - 1) * 7;
deck_found = 0; deck_found = 0;
limbo_found = 0; limbo_found = 0; // support custom cards which may be in location 0 in KoishiPro or EdoPro
for (i = p = 3, ref8 = max_loop; p <= ref8; i = p += 7) { for (i = p = 3, ref8 = max_loop; p <= ref8; i = p += 7) {
loc = buffer.readInt8(i + 5); loc = buffer.readInt8(i + 5);
if ((loc & 0x41) > 0) { if ((loc & 0x41) > 0) {
...@@ -3600,9 +3746,11 @@ ...@@ -3600,9 +3746,11 @@
} }
} }
if (check) { if (check) {
//console.log("Confirming cards:" + client.name)
client.heartbeat_protected = true; client.heartbeat_protected = true;
} }
} }
// chain detection
if (settings.modules.heartbeat_detection.enabled && client.pos === 0) { if (settings.modules.heartbeat_detection.enabled && client.pos === 0) {
if (ygopro.constants.MSG[msg] === 'CHAINING') { if (ygopro.constants.MSG[msg] === 'CHAINING') {
card = buffer.readUInt32LE(1); card = buffer.readUInt32LE(1);
...@@ -3618,6 +3766,7 @@ ...@@ -3618,6 +3766,7 @@
if (found) { if (found) {
room.long_resolve_card = card; room.long_resolve_card = card;
} else { } else {
// console.log(0,card)
delete room.long_resolve_card; delete room.long_resolve_card;
} }
} else if (ygopro.constants.MSG[msg] === 'CHAINED' && room.long_resolve_card) { } else if (ygopro.constants.MSG[msg] === 'CHAINED' && room.long_resolve_card) {
...@@ -3626,9 +3775,11 @@ ...@@ -3626,9 +3775,11 @@
room.long_resolve_chain = []; room.long_resolve_chain = [];
} }
room.long_resolve_chain[chain] = true; room.long_resolve_chain[chain] = true;
// console.log(1,chain)
delete room.long_resolve_card; delete room.long_resolve_card;
} else if (ygopro.constants.MSG[msg] === 'CHAIN_SOLVING' && room.long_resolve_chain) { } else if (ygopro.constants.MSG[msg] === 'CHAIN_SOLVING' && room.long_resolve_chain) {
chain = buffer.readInt8(1); chain = buffer.readInt8(1);
// console.log(2,chain)
if (room.long_resolve_chain[chain]) { if (room.long_resolve_chain[chain]) {
ref9 = room.get_playing_player(); ref9 = room.get_playing_player();
for (r = 0, len6 = ref9.length; r < len6; r++) { for (r = 0, len6 = ref9.length; r < len6; r++) {
...@@ -3638,12 +3789,15 @@ ...@@ -3638,12 +3789,15 @@
} }
} else if ((ygopro.constants.MSG[msg] === 'CHAIN_NEGATED' || ygopro.constants.MSG[msg] === 'CHAIN_DISABLED') && room.long_resolve_chain) { } else if ((ygopro.constants.MSG[msg] === 'CHAIN_NEGATED' || ygopro.constants.MSG[msg] === 'CHAIN_DISABLED') && room.long_resolve_chain) {
chain = buffer.readInt8(1); chain = buffer.readInt8(1);
// console.log(3,chain)
delete room.long_resolve_chain[chain]; delete room.long_resolve_chain[chain];
} else if (ygopro.constants.MSG[msg] === 'CHAIN_END') { } else if (ygopro.constants.MSG[msg] === 'CHAIN_END') {
// console.log(4,chain)
delete room.long_resolve_card; delete room.long_resolve_card;
delete room.long_resolve_chain; delete room.long_resolve_chain;
} }
} }
//登场台词
if (settings.modules.dialogues.enabled || settings.modules.vip.enabled) { if (settings.modules.dialogues.enabled || settings.modules.vip.enabled) {
if (ygopro.constants.MSG[msg] === 'SUMMONING' || ygopro.constants.MSG[msg] === 'SPSUMMONING' || ygopro.constants.MSG[msg] === 'CHAINING') { if (ygopro.constants.MSG[msg] === 'SUMMONING' || ygopro.constants.MSG[msg] === 'SPSUMMONING' || ygopro.constants.MSG[msg] === 'CHAINING') {
card = buffer.readUInt32LE(1); card = buffer.readUInt32LE(1);
...@@ -3695,6 +3849,7 @@ ...@@ -3695,6 +3849,7 @@
return false; return false;
}); });
//房间管理
ygopro.ctos_follow('HS_TOOBSERVER', true, function(buffer, info, client, server, datas) { ygopro.ctos_follow('HS_TOOBSERVER', true, function(buffer, info, client, server, datas) {
var len2, m, player, ref3, room; var len2, m, player, ref3, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
...@@ -3730,18 +3885,18 @@ ...@@ -3730,18 +3885,18 @@
player = ref3[m]; player = ref3[m];
if (player && player.pos === info.pos && player !== client) { if (player && player.pos === info.pos && player !== client) {
if (room.arena === "athletic" || settings.modules.challonge.enabled) { if (room.arena === "athletic" || settings.modules.challonge.enabled) {
ygopro.stoc_send_chat_to_room(room, client.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${client.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_kick(client); CLIENT_kick(client);
return true; return true;
} }
client.kick_count = client.kick_count ? client.kick_count + 1 : 1; client.kick_count = client.kick_count ? client.kick_count + 1 : 1;
if (client.kick_count >= 5 && room.random_type) { if (client.kick_count >= 5 && room.random_type) {
ygopro.stoc_send_chat_to_room(room, client.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${client.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}"); ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}");
CLIENT_kick(client); CLIENT_kick(client);
return true; return true;
} }
ygopro.stoc_send_chat_to_room(room, player.name + " ${kicked_by_player}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${player.name} \${kicked_by_player}`, ygopro.constants.COLORS.RED);
} }
} }
return false; return false;
...@@ -3751,8 +3906,12 @@ ...@@ -3751,8 +3906,12 @@
var is_host, selftype; var is_host, selftype;
selftype = info.type & 0xf; selftype = info.type & 0xf;
is_host = ((info.type >> 4) & 0xf) !== 0; is_host = ((info.type >> 4) & 0xf) !== 0;
// if room and room.hostinfo.no_watch and selftype == 7
// ygopro.stoc_die(client, "${watch_denied_room}")
// return true
client.is_host = is_host; client.is_host = is_host;
client.pos = selftype; client.pos = selftype;
//console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
return false; return false;
}); });
...@@ -3834,6 +3993,7 @@ ...@@ -3834,6 +3993,7 @@
} }
} }
if (room.ready_player_count_without_host >= room.max_player - 1) { if (room.ready_player_count_without_host >= room.max_player - 1) {
//log.info "all ready"
setTimeout((function() { setTimeout((function() {
wait_room_start(ROOM_all[client.rid], settings.modules.random_duel.ready_time); wait_room_start(ROOM_all[client.rid], settings.modules.random_duel.ready_time);
}), 1000); }), 1000);
...@@ -3853,9 +4013,9 @@ ...@@ -3853,9 +4013,9 @@
return true; return true;
} }
client.reconnecting = false; client.reconnecting = false;
if (client.time_confirm_required) { if (client.time_confirm_required) { // client did not send TIME_CONFIRM
client.waiting_for_last = true; client.waiting_for_last = true;
} else if (client.last_game_msg && client.last_game_msg_title !== 'WAITING') { } else if (client.last_game_msg && client.last_game_msg_title !== 'WAITING') { // client sent TIME_CONFIRM
if (client.last_hint_msg) { if (client.last_hint_msg) {
ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg); ygopro.stoc_send(client, 'GAME_MSG', client.last_hint_msg);
} }
...@@ -3899,7 +4059,7 @@ ...@@ -3899,7 +4059,7 @@
time -= 1; time -= 1;
if (time) { if (time) {
if (!(time % 5)) { if (!(time % 5)) {
ygopro.stoc_send_chat_to_room(room, "" + (time <= 9 ? ' ' : '') + time + "${kick_count_down}", time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE); ygopro.stoc_send_chat_to_room(room, `${time <= 9 ? ' ' : ''}${time}\${kick_count_down}`, time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE);
} }
setTimeout((function() { setTimeout((function() {
wait_room_start(room, time); wait_room_start(room, time);
...@@ -3910,7 +4070,7 @@ ...@@ -3910,7 +4070,7 @@
player = ref3[m]; player = ref3[m];
if (player && player.is_host) { if (player && player.is_host) {
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}"); ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}");
ygopro.stoc_send_chat_to_room(room, player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_kick(player); CLIENT_kick(player);
} }
} }
...@@ -3931,11 +4091,11 @@ ...@@ -3931,11 +4091,11 @@
continue; continue;
} }
display_name = (settings.modules.hide_name && player !== room.waiting_for_player ? "********" : room.waiting_for_player.name); display_name = (settings.modules.hide_name && player !== room.waiting_for_player ? "********" : room.waiting_for_player.name);
ygopro.stoc_send_chat(player, "" + (room.waiting_for_player_time <= 9 ? ' ' : '') + room.waiting_for_player_time + "${kick_count_down_arena_part1} " + display_name + " ${kick_count_down_arena_part2}", room.waiting_for_player_time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE); ygopro.stoc_send_chat(player, `${room.waiting_for_player_time <= 9 ? ' ' : ''}${room.waiting_for_player_time}\${kick_count_down_arena_part1} ${display_name} \${kick_count_down_arena_part2}`, room.waiting_for_player_time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE);
} }
} }
} else { } else {
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_kick(room.waiting_for_player); CLIENT_kick(room.waiting_for_player);
if (room.waiting_for_player_interval) { if (room.waiting_for_player_interval) {
clearInterval(room.waiting_for_player_interval); clearInterval(room.waiting_for_player_interval);
...@@ -3945,6 +4105,7 @@ ...@@ -3945,6 +4105,7 @@
} }
}; };
//tip
ygopro.stoc_send_random_tip = function(client) { ygopro.stoc_send_random_tip = function(client) {
var tip_type; var tip_type;
tip_type = "tips"; tip_type = "tips";
...@@ -4042,13 +4203,14 @@ ...@@ -4042,13 +4203,14 @@
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
return; return;
} }
if (room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN) { if (room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN) { //first start
room.duel_stage = ygopro.constants.DUEL_STAGE.FINGER; room.duel_stage = ygopro.constants.DUEL_STAGE.FINGER;
room.start_time = moment().format(); room.start_time = moment().format();
room.turn = 0; room.turn = 0;
if (!room.windbot && settings.modules.http.websocket_roomlist) { if (!room.windbot && settings.modules.http.websocket_roomlist) {
roomlist.start(room); roomlist.start(room);
} }
//room.duels = []
room.dueling_players = []; room.dueling_players = [];
ref3 = room.players; ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) { for (m = 0, len2 = ref3.length; m < len2; m++) {
...@@ -4063,13 +4225,14 @@ ...@@ -4063,13 +4225,14 @@
name: player.name name: player.name
}); });
if (room.random_type === 'T') { if (room.random_type === 'T') {
// 双打房不记录匹配过
ROOM_players_oppentlist[player.ip] = null; ROOM_players_oppentlist[player.ip] = null;
} }
} }
if (room.hostinfo.auto_death) { if (room.hostinfo.auto_death) {
ygopro.stoc_send_chat_to_room(room, "${auto_death_part1}" + room.hostinfo.auto_death + "${auto_death_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat_to_room(room, `\${auto_death_part1}${room.hostinfo.auto_death}\${auto_death_part2}`, ygopro.constants.COLORS.BABYBLUE);
} }
} else if (room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING && client.pos < 4) { } else if (room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING && client.pos < 4) { // side deck verified
client.selected_preduel = true; client.selected_preduel = true;
if (client.side_tcount) { if (client.side_tcount) {
clearInterval(client.side_interval); clearInterval(client.side_interval);
...@@ -4116,6 +4279,7 @@ ...@@ -4116,6 +4279,7 @@
} else { } else {
deck_arena = deck_arena + 'custom'; deck_arena = deck_arena + 'custom';
} }
//log.info "DECK LOG START", client.name, room.arena
if (settings.modules.deck_log.local) { if (settings.modules.deck_log.local) {
deck_name = moment().format('YYYY-MM-DD HH-mm-ss') + ' ' + room.process_pid + ' ' + client.pos + ' ' + client.ip.slice(7) + ' ' + client.name.replace(/[\/\\\?\*]/g, '_'); deck_name = moment().format('YYYY-MM-DD HH-mm-ss') + ' ' + room.process_pid + ' ' + client.pos + ' ' + client.ip.slice(7) + ' ' + client.name.replace(/[\/\\\?\*]/g, '_');
fs.writeFile(settings.modules.deck_log.local + deck_name + '.ydk', deck_text, 'utf-8', function(err) { fs.writeFile(settings.modules.deck_log.local + deck_name + '.ydk', deck_text, 'utf-8', function(err) {
...@@ -4143,6 +4307,8 @@ ...@@ -4143,6 +4307,8 @@
} }
}); });
} }
//else
//log.info 'DECK POST OK', response.statusCode, client.name, body
client.deck_saved = true; client.deck_saved = true;
} }
}); });
...@@ -4200,6 +4366,8 @@ ...@@ -4200,6 +4366,8 @@
}); });
}; };
//else
//log.info 'BIG BROTHER OK', response.statusCode, roomname, body
ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server, datas) { ygopro.ctos_follow('CHAT', true, function(buffer, info, client, server, datas) {
var buy_result, cancel, ccolor, cip, cmd, cmsg, cname, code, color, cvalue, key, msg, name, oldmsg, ref3, room, struct, sur_player, uname, windbot, word; var buy_result, cancel, ccolor, cip, cmd, cmsg, cname, code, color, cvalue, key, msg, name, oldmsg, ref3, room, struct, sur_player, uname, windbot, word;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
...@@ -4443,6 +4611,8 @@ ...@@ -4443,6 +4611,8 @@
} }
} }
} }
//when '/test'
// ygopro.stoc_send_hint_card_to_room(room, 2333365)
if (msg.length > 100) { if (msg.length > 100) {
log.warn("SPAM WORD", client.name, client.ip, msg); log.warn("SPAM WORD", client.name, client.ip, msg);
if (client.abuse_count) { if (client.abuse_count) {
...@@ -4481,12 +4651,14 @@ ...@@ -4481,12 +4651,14 @@
} }
} else if (client.rag && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) { } else if (client.rag && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
client.rag = false; client.rag = false;
//ygopro.stoc_send_chat(client, "${chat_warn_level0}", ygopro.constants.COLORS.RED)
cancel = true; cancel = true;
} else if (_.any(settings.ban.spam_word, function(badword) { } else if (_.any(settings.ban.spam_word, function(badword) {
var regexp; var regexp;
regexp = new RegExp(badword, 'i'); regexp = new RegExp(badword, 'i');
return msg.match(regexp); return msg.match(regexp);
}, msg)) { }, msg)) {
//log.warn "SPAM WORD", client.name, client.ip, oldmsg
client.abuse_count = client.abuse_count + 2; client.abuse_count = client.abuse_count + 2;
ygopro.stoc_send_chat(client, "${chat_warn_level0}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${chat_warn_level0}", ygopro.constants.COLORS.RED);
cancel = true; cancel = true;
...@@ -4503,6 +4675,7 @@ ...@@ -4503,6 +4675,7 @@
} else { } else {
_.each(badwords.level1, function(badword) { _.each(badwords.level1, function(badword) {
var regexp; var regexp;
//log.info msg
regexp = new RegExp(badword, "ig"); regexp = new RegExp(badword, "ig");
msg = msg.replace(regexp, "**"); msg = msg.replace(regexp, "**");
}, msg); }, msg);
...@@ -4528,7 +4701,7 @@ ...@@ -4528,7 +4701,7 @@
ROOM_unwelcome(room, client, "${random_ban_reason_abuse}"); ROOM_unwelcome(room, client, "${random_ban_reason_abuse}");
} }
if (client.abuse_count >= 5) { if (client.abuse_count >= 5) {
ygopro.stoc_send_chat_to_room(room, client.name + " ${chat_banned}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${client.name} \${chat_banned}`, ygopro.constants.COLORS.RED);
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}"); ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}");
} }
return cancel; return cancel;
...@@ -4560,14 +4733,15 @@ ...@@ -4560,14 +4733,15 @@
if (!room) { if (!room) {
return false; return false;
} }
if (info.mainc > 256 || info.sidec > 256) { //log.info info
if (info.mainc > 256 || info.sidec > 256) { // Prevent attack, see https://github.com/Fluorohydride/ygopro/issues/2174
CLIENT_kick(client); CLIENT_kick(client);
return true; return true;
} }
buff_main = (function() { buff_main = (function() {
var m, ref3, results; var m, ref3, results;
results = []; results = [];
for (i = m = 0, ref3 = info.mainc; 0 <= ref3 ? m < ref3 : m > ref3; i = 0 <= ref3 ? ++m : --m) { for (i = m = 0, ref3 = info.mainc; (0 <= ref3 ? m < ref3 : m > ref3); i = 0 <= ref3 ? ++m : --m) {
results.push(info.deckbuf[i]); results.push(info.deckbuf[i]);
} }
return results; return results;
...@@ -4575,7 +4749,7 @@ ...@@ -4575,7 +4749,7 @@
buff_side = (function() { buff_side = (function() {
var m, ref3, ref4, results; var m, ref3, ref4, results;
results = []; results = [];
for (i = m = ref3 = info.mainc, ref4 = info.mainc + info.sidec; ref3 <= ref4 ? m < ref4 : m > ref4; i = ref3 <= ref4 ? ++m : --m) { for (i = m = ref3 = info.mainc, ref4 = info.mainc + info.sidec; (ref3 <= ref4 ? m < ref4 : m > ref4); i = ref3 <= ref4 ? ++m : --m) {
results.push(info.deckbuf[i]); results.push(info.deckbuf[i]);
} }
return results; return results;
...@@ -4648,12 +4822,15 @@ ...@@ -4648,12 +4822,15 @@
struct.set("sidec", deck_side.length); struct.set("sidec", deck_side.length);
struct.set("deckbuf", deckbuf); struct.set("deckbuf", deckbuf);
buffer = struct.buffer; buffer = struct.buffer;
ygopro.stoc_send_chat(client, "${deck_correct_part1} " + found_deck + " ${deck_correct_part2}", ygopro.constants.COLORS.BABYBLUE); //log.info("deck ok: " + client.name)
ygopro.stoc_send_chat(client, `\${deck_correct_part1} ${found_deck} \${deck_correct_part2}`, ygopro.constants.COLORS.BABYBLUE);
} else { } else {
ygopro.stoc_send_chat(client, "${deck_incorrect_part1} " + found_deck + " ${deck_incorrect_part2}", ygopro.constants.COLORS.RED); //log.info("bad deck: " + client.name + " / " + buff_main + " / " + buff_side)
ygopro.stoc_send_chat(client, `\${deck_incorrect_part1} ${found_deck} \${deck_incorrect_part2}`, ygopro.constants.COLORS.RED);
} }
} else { } else {
ygopro.stoc_send_chat(client, client.name + "${deck_not_found}", ygopro.constants.COLORS.RED); //log.info("player deck not found: " + client.name)
ygopro.stoc_send_chat(client, `${client.name}\${deck_not_found}`, ygopro.constants.COLORS.RED);
} }
} }
return false; return false;
...@@ -4767,6 +4944,7 @@ ...@@ -4767,6 +4944,7 @@
return; return;
} }
client.selected_preduel = true; client.selected_preduel = true;
// room.selecting_tp = false
if (!(room.random_type || room.arena)) { if (!(room.random_type || room.arena)) {
return; return;
} }
...@@ -4860,7 +5038,7 @@ ...@@ -4860,7 +5038,7 @@
client.selected_preduel = false; client.selected_preduel = false;
if (settings.modules.side_timeout) { if (settings.modules.side_timeout) {
client.side_tcount = settings.modules.side_timeout; client.side_tcount = settings.modules.side_timeout;
ygopro.stoc_send_chat(client, "${side_timeout_part1}" + settings.modules.side_timeout + "${side_timeout_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, `\${side_timeout_part1}${settings.modules.side_timeout}\${side_timeout_part2}`, ygopro.constants.COLORS.BABYBLUE);
sinterval = setInterval(function() { sinterval = setInterval(function() {
if (!(room && client && client.side_tcount && room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING)) { if (!(room && client && client.side_tcount && room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING)) {
clearInterval(sinterval); clearInterval(sinterval);
...@@ -4869,12 +5047,13 @@ ...@@ -4869,12 +5047,13 @@
if (client.side_tcount === 1) { if (client.side_tcount === 1) {
ygopro.stoc_send_chat_to_room(room, client.name + "${side_overtime_room}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat_to_room(room, client.name + "${side_overtime_room}", ygopro.constants.COLORS.BABYBLUE);
ygopro.stoc_send_chat(client, "${side_overtime}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${side_overtime}", ygopro.constants.COLORS.RED);
//room.scores[client.name_vpass] = -9
CLIENT_send_replays(client, room); CLIENT_send_replays(client, room);
CLIENT_kick(client); CLIENT_kick(client);
return clearInterval(sinterval); return clearInterval(sinterval);
} else { } else {
client.side_tcount = client.side_tcount - 1; client.side_tcount = client.side_tcount - 1;
return ygopro.stoc_send_chat(client, "${side_remain_part1}" + client.side_tcount + "${side_remain_part2}", ygopro.constants.COLORS.BABYBLUE); return ygopro.stoc_send_chat(client, `\${side_remain_part1}${client.side_tcount}\${side_remain_part2}`, ygopro.constants.COLORS.BABYBLUE);
} }
}, 60000); }, 60000);
client.side_interval = sinterval; client.side_interval = sinterval;
...@@ -4916,6 +5095,7 @@ ...@@ -4916,6 +5095,7 @@
Cloud_replay_ids.push(room.cloud_replay_id); Cloud_replay_ids.push(room.cloud_replay_id);
} }
if (!room.replays[room.duel_count - 1]) { if (!room.replays[room.duel_count - 1]) {
// console.log("Replay saved: ", room.duel_count - 1, client.pos)
room.replays[room.duel_count - 1] = buffer; room.replays[room.duel_count - 1] = buffer;
} }
if (settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.replay_safe) { if (settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.replay_safe) {
...@@ -4966,7 +5146,7 @@ ...@@ -4966,7 +5146,7 @@
}); });
} }
if (settings.modules.cloud_replay.enabled) { if (settings.modules.cloud_replay.enabled) {
ygopro.stoc_send_chat(client, "${cloud_replay_delay_part1}R#" + room.cloud_replay_id + "${cloud_replay_delay_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, `\${cloud_replay_delay_part1}R#${room.cloud_replay_id}\${cloud_replay_delay_part2}`, ygopro.constants.COLORS.BABYBLUE);
} }
return settings.modules.tournament_mode.block_replay_to_player || settings.modules.replay_delay && room.hostinfo.mode === 1; return settings.modules.tournament_mode.block_replay_to_player || settings.modules.replay_delay && room.hostinfo.mode === 1;
} else { } else {
...@@ -4983,15 +5163,17 @@ ...@@ -4983,15 +5163,17 @@
return; return;
} }
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
//log.info time_passed
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment(); room.last_active_time = moment();
ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}"); ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}");
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); //log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_send_replays(room.waiting_for_player, room); CLIENT_send_replays(room.waiting_for_player, room);
CLIENT_kick(room.waiting_for_player); CLIENT_kick(room.waiting_for_player);
} else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) { } else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) {
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED);
ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}"); ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}");
} }
done(); done();
...@@ -5008,14 +5190,16 @@ ...@@ -5008,14 +5190,16 @@
return; return;
} }
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
//log.info time_passed
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment(); room.last_active_time = moment();
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
//log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
CLIENT_send_replays(room.waiting_for_player, room); CLIENT_send_replays(room.waiting_for_player, room);
CLIENT_kick(room.waiting_for_player); CLIENT_kick(room.waiting_for_player);
} else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) { } else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) {
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED);
} }
done(); done();
}); });
...@@ -5071,6 +5255,7 @@ ...@@ -5071,6 +5255,7 @@
}); });
}, 1000); }, 1000);
// spawn windbot
windbot_looplimit = 0; windbot_looplimit = 0;
windbot_process = global.windbot_process = null; windbot_process = global.windbot_process = null;
...@@ -5119,6 +5304,7 @@ ...@@ -5119,6 +5304,7 @@
global.rebooted = false; global.rebooted = false;
//http
if (settings.modules.http) { if (settings.modules.http) {
addCallback = function(callback, text) { addCallback = function(callback, text) {
if (!callback) { if (!callback) {
...@@ -5126,12 +5312,15 @@ ...@@ -5126,12 +5312,15 @@
} }
return callback + "( " + text + " );"; return callback + "( " + text + " );";
}; };
requestListener = function(request, response) { requestListener = async function(request, response) {
var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, key, len2, len3, len4, m, n, o, parseQueryString, pass_validated, ref3, ref4, replay, ret_keys, room, roomsjson, tasks, u; var archive_args, archive_name, archive_process, check, death_room_found, duellog, err, error, filename, getpath, key, len2, len3, m, n, parseQueryString, pass_validated, ref3, ref4, replay, ret_keys, roomsjson, tasks, u;
parseQueryString = true; parseQueryString = true;
u = url.parse(request.url, parseQueryString); u = url.parse(request.url, parseQueryString);
//pass_validated = u.query.pass == settings.modules.http.password
//console.log(u.query.username, u.query.pass)
if (u.pathname === '/api/getrooms') { if (u.pathname === '/api/getrooms') {
pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true); pass_validated = (await auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true));
if (!settings.modules.http.public_roomlist && !pass_validated) { if (!settings.modules.http.public_roomlist && !pass_validated) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}')); response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}'));
...@@ -5181,7 +5370,7 @@ ...@@ -5181,7 +5370,7 @@
}); });
} }
} else if (u.pathname === '/api/duellog' && settings.modules.tournament_mode.enabled) { } else if (u.pathname === '/api/duellog' && settings.modules.tournament_mode.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log")) { if (!(await auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "[{name:'密码错误'}]")); response.end(addCallback(u.query.callback, "[{name:'密码错误'}]"));
return; return;
...@@ -5210,7 +5399,7 @@ ...@@ -5210,7 +5399,7 @@
response.end(addCallback(u.query.callback, ret_keys)); response.end(addCallback(u.query.callback, ret_keys));
} }
} else if (u.pathname === '/api/archive.zip' && settings.modules.tournament_mode.enabled) { } else if (u.pathname === '/api/archive.zip' && settings.modules.tournament_mode.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay_archive")) { if (!(await auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay_archive"))) {
response.writeHead(403); response.writeHead(403);
response.end("Invalid password."); response.end("Invalid password.");
return; return;
...@@ -5233,40 +5422,32 @@ ...@@ -5233,40 +5422,32 @@
archive_process = spawn(settings.modules.tournament_mode.replay_archive_tool, archive_args, { archive_process = spawn(settings.modules.tournament_mode.replay_archive_tool, archive_args, {
cwd: settings.modules.tournament_mode.replay_path cwd: settings.modules.tournament_mode.replay_path
}); });
archive_process.on('error', (function(_this) { archive_process.on('error', (err) => {
return function(err) { response.writeHead(403);
response.writeHead(403); response.end("Failed packing replays. " + err);
response.end("Failed packing replays. " + err); });
}; archive_process.on('exit', (code) => {
})(this)); return fs.readFile(settings.modules.tournament_mode.replay_path + archive_name, function(error, buffer) {
archive_process.on('exit', (function(_this) { if (error) {
return function(code) { response.writeHead(403);
return fs.readFile(settings.modules.tournament_mode.replay_path + archive_name, function(error, buffer) { response.end("Failed sending replays. " + error);
if (error) { } else {
response.writeHead(403); response.writeHead(200, {
response.end("Failed sending replays. " + error); "Content-Type": "application/octet-stream",
} else { "Content-Disposition": "attachment"
response.writeHead(200, { });
"Content-Type": "application/octet-stream", response.end(buffer);
"Content-Disposition": "attachment" }
}); });
response.end(buffer); });
}
});
};
})(this));
archive_process.stdout.setEncoding('utf8'); archive_process.stdout.setEncoding('utf8');
archive_process.stdout.on('data', (function(_this) { archive_process.stdout.on('data', (data) => {
return function(data) { return log.info("archive process: " + data);
return log.info("archive process: " + data); });
};
})(this));
archive_process.stderr.setEncoding('utf8'); archive_process.stderr.setEncoding('utf8');
archive_process.stderr.on('data', (function(_this) { archive_process.stderr.on('data', (data) => {
return function(data) { return log.warn("archive error: " + data);
return log.warn("archive error: " + data); });
};
})(this));
} catch (error1) { } catch (error1) {
error = error1; error = error1;
response.writeHead(403); response.writeHead(403);
...@@ -5274,7 +5455,7 @@ ...@@ -5274,7 +5455,7 @@
} }
} }
} else if (u.pathname === '/api/clearlog' && settings.modules.tournament_mode.enabled) { } else if (u.pathname === '/api/clearlog' && settings.modules.tournament_mode.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "clear_duel_log", "clear_duel_log")) { if (!(await auth.auth(u.query.username, u.query.pass, "clear_duel_log", "clear_duel_log"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "[{name:'密码错误'}]")); response.end(addCallback(u.query.callback, "[{name:'密码错误'}]"));
return; return;
...@@ -5292,7 +5473,7 @@ ...@@ -5292,7 +5473,7 @@
response.end(addCallback(u.query.callback, "[{name:'Success'}]")); response.end(addCallback(u.query.callback, "[{name:'Success'}]"));
} }
} else if (_.startsWith(u.pathname, '/api/replay') && settings.modules.tournament_mode.enabled) { } else if (_.startsWith(u.pathname, '/api/replay') && settings.modules.tournament_mode.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay")) { if (!(await auth.auth(u.query.username, u.query.pass, "download_replay", "download_replay"))) {
response.writeHead(403); response.writeHead(403);
response.end("密码错误"); response.end("密码错误");
return; return;
...@@ -5321,22 +5502,25 @@ ...@@ -5321,22 +5502,25 @@
}); });
} }
} else if (u.pathname === '/api/message') { } else if (u.pathname === '/api/message') {
//if !pass_validated
// response.writeHead(200)
// response.end(addCallback(u.query.callback, "['密码错误', 0]"))
// return
if (u.query.shout) { if (u.query.shout) {
if (!auth.auth(u.query.username, u.query.pass, "shout", "shout")) { if (!(await auth.auth(u.query.username, u.query.pass, "shout", "shout"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
for (o = 0, len4 = ROOM_all.length; o < len4; o++) { _async.each(ROOM_all, function(room) {
room = ROOM_all[o];
if (room && room.established) { if (room && room.established) {
ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW); return ygopro.stoc_send_chat_to_room(room, u.query.shout, ygopro.constants.COLORS.YELLOW);
} }
} });
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['shout ok', '" + u.query.shout + "']")); response.end(addCallback(u.query.callback, "['shout ok', '" + u.query.shout + "']"));
} else if (u.query.stop) { } else if (u.query.stop) {
if (!auth.auth(u.query.username, u.query.pass, "stop", "stop")) { if (!(await auth.auth(u.query.username, u.query.pass, "stop", "stop"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5344,30 +5528,29 @@ ...@@ -5344,30 +5528,29 @@
if (u.query.stop === 'false') { if (u.query.stop === 'false') {
u.query.stop = false; u.query.stop = false;
} }
setting_change(settings, 'modules:stop', u.query.stop, function(err) { response.writeHead(200);
response.writeHead(200); try {
if (err) { await util.promisify(setting_change)(settings, 'modules:stop', u.query.stop);
return response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']")); response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']"));
} else { } catch (error1) {
return response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']")); err = error1;
} response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']"));
}); }
} else if (u.query.welcome) { } else if (u.query.welcome) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome")) { if (!(await auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
setting_change(settings, 'modules:welcome', function(err) { try {
response.writeHead(200); await util.promisify(setting_change)(settings, 'modules:stop', u.query.welcome);
if (err) { response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']"));
return response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']")); } catch (error1) {
} else { err = error1;
return response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']")); response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']"));
} }
});
} else if (u.query.getwelcome) { } else if (u.query.getwelcome) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome")) { if (!(await auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5375,7 +5558,7 @@ ...@@ -5375,7 +5558,7 @@
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['get ok', '" + settings.modules.welcome + "']")); response.end(addCallback(u.query.callback, "['get ok', '" + settings.modules.welcome + "']"));
} else if (u.query.loadtips) { } else if (u.query.loadtips) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_tips")) { if (!(await auth.auth(u.query.username, u.query.pass, "change_settings", "change_tips"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5395,7 +5578,7 @@ ...@@ -5395,7 +5578,7 @@
} }
}); });
} else if (u.query.loaddialogues) { } else if (u.query.loaddialogues) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues")) { if (!(await auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5415,7 +5598,7 @@ ...@@ -5415,7 +5598,7 @@
} }
}); });
} else if (u.query.ban) { } else if (u.query.ban) {
if (!auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user")) { if (!(await auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5429,7 +5612,7 @@ ...@@ -5429,7 +5612,7 @@
} }
}); });
} else if (u.query.kick) { } else if (u.query.kick) {
if (!auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user")) { if (!(await auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5445,7 +5628,7 @@ ...@@ -5445,7 +5628,7 @@
} }
}); });
} else if (u.query.death) { } else if (u.query.death) {
if (!auth.auth(u.query.username, u.query.pass, "start_death", "start_death")) { if (!(await auth.auth(u.query.username, u.query.pass, "start_death", "start_death"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5469,7 +5652,7 @@ ...@@ -5469,7 +5652,7 @@
} }
}); });
} else if (u.query.deathcancel) { } else if (u.query.deathcancel) {
if (!auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death")) { if (!(await auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
...@@ -5493,7 +5676,7 @@ ...@@ -5493,7 +5676,7 @@
} }
}); });
} else if (u.query.reboot) { } else if (u.query.reboot) {
if (!auth.auth(u.query.username, u.query.pass, "stop", "reboot")) { if (!(await auth.auth(u.query.username, u.query.pass, "stop", "reboot"))) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
......
...@@ -214,10 +214,10 @@ var pushHTMLs = function() { ...@@ -214,10 +214,10 @@ var pushHTMLs = function() {
//建立一个http服务器,接收API操作 //建立一个http服务器,接收API操作
function requestListener(req, res) { async function requestListener(req, res) {
var u = url.parse(req.url, true); var u = url.parse(req.url, true);
if (!auth.auth(u.query.username, u.query.password, "update_dashboard", "update_dashboard")) { if (!await auth.auth(u.query.username, u.query.password, "update_dashboard", "update_dashboard")) {
res.writeHead(403); res.writeHead(403);
res.end("Auth Failed."); res.end("Auth Failed.");
return; return;
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 2.5.1
(function() { (function() {
var Struct, _, declaration, field, i, len, loadJSON, name, result, structs_declaration, type, typedefs; var Struct, _, declaration, field, i, len, loadJSON, name, result, structs_declaration, type, typedefs;
...@@ -14,14 +14,17 @@ ...@@ -14,14 +14,17 @@
this.i18ns = loadJSON('./data/i18n.json'); this.i18ns = loadJSON('./data/i18n.json');
structs_declaration = loadJSON('./data/structs.json'); //常量/类型声明
structs_declaration = loadJSON('./data/structs.json'); //结构体声明
typedefs = loadJSON('./data/typedefs.json'); typedefs = loadJSON('./data/typedefs.json'); //类型声明
this.proto_structs = loadJSON('./data/proto_structs.json'); this.proto_structs = loadJSON('./data/proto_structs.json'); //消息与结构体的对应,未完成,对着duelclient.cpp加
this.constants = loadJSON('./data/constants.json'); this.constants = loadJSON('./data/constants.json'); //network.h里定义的常量
//结构体定义
this.structs = {}; this.structs = {};
for (name in structs_declaration) { for (name in structs_declaration) {
...@@ -35,7 +38,7 @@ ...@@ -35,7 +38,7 @@
result.chars(field.name, field.length * 2, field.encoding); result.chars(field.name, field.length * 2, field.encoding);
break; break;
default: default:
throw "unsupported encoding: " + field.encoding; throw `unsupported encoding: ${field.encoding}`;
} }
} else { } else {
type = field.type; type = field.type;
...@@ -43,7 +46,7 @@ ...@@ -43,7 +46,7 @@
type = typedefs[type]; type = typedefs[type];
} }
if (field.length) { if (field.length) {
result.array(field.name, field.length, type); result.array(field.name, field.length, type); //不支持结构体
} else { } else {
if (this.structs[type]) { if (this.structs[type]) {
result.struct(field.name, this.structs[type]); result.struct(field.name, this.structs[type]);
...@@ -56,6 +59,7 @@ ...@@ -56,6 +59,7 @@
this.structs[name] = result; this.structs[name] = result;
} }
//消息跟踪函数 需要重构, 另暂时只支持异步, 同步没做.
this.stoc_follows = {}; this.stoc_follows = {};
this.stoc_follows_before = {}; this.stoc_follows_before = {};
...@@ -154,11 +158,13 @@ ...@@ -154,11 +158,13 @@
}); });
}; };
//消息发送函数,至少要把俩合起来....
this.stoc_send = function(socket, proto, info) { this.stoc_send = function(socket, proto, info) {
var buffer, header, key, ref, struct, value; var buffer, header, key, ref, struct, value;
if (socket.closed) { if (socket.closed) {
return; return;
} }
//console.log proto, proto_structs.STOC[proto], structs[proto_structs.STOC[proto]]
if (typeof info === 'undefined') { if (typeof info === 'undefined') {
buffer = ""; buffer = "";
} else if (Buffer.isBuffer(info)) { } else if (Buffer.isBuffer(info)) {
...@@ -169,7 +175,7 @@ ...@@ -169,7 +175,7 @@
struct.set(info); struct.set(info);
buffer = struct.buffer(); buffer = struct.buffer();
} }
if (typeof proto === 'string') { if (typeof proto === 'string') { //需要重构
ref = this.constants.STOC; ref = this.constants.STOC;
for (key in ref) { for (key in ref) {
value = ref[key]; value = ref[key];
...@@ -196,6 +202,7 @@ ...@@ -196,6 +202,7 @@
if (socket.closed) { if (socket.closed) {
return; return;
} }
//console.log proto, proto_structs.CTOS[proto], structs[proto_structs.CTOS[proto]]
if (typeof info === 'undefined') { if (typeof info === 'undefined') {
buffer = ""; buffer = "";
} else if (Buffer.isBuffer(info)) { } else if (Buffer.isBuffer(info)) {
...@@ -206,7 +213,7 @@ ...@@ -206,7 +213,7 @@
struct.set(info); struct.set(info);
buffer = struct.buffer(); buffer = struct.buffer();
} }
if (typeof proto === 'string') { if (typeof proto === 'string') { //需要重构
ref = this.constants.CTOS; ref = this.constants.CTOS;
for (key in ref) { for (key in ref) {
value = ref[key]; value = ref[key];
...@@ -228,11 +235,9 @@ ...@@ -228,11 +235,9 @@
} }
}; };
this.stoc_send_chat = function(client, msg, player) { //util
this.stoc_send_chat = function(client, msg, player = 8) {
var j, len1, line, o, r, re, ref, ref1; var j, len1, line, o, r, re, ref, ref1;
if (player == null) {
player = 8;
}
if (!client) { if (!client) {
console.log("err stoc_send_chat"); console.log("err stoc_send_chat");
return; return;
...@@ -256,11 +261,8 @@ ...@@ -256,11 +261,8 @@
} }
}; };
this.stoc_send_chat_to_room = function(room, msg, player) { this.stoc_send_chat_to_room = function(room, msg, player = 8) {
var client, j, k, len1, len2, ref, ref1; var client, j, k, len1, len2, ref, ref1;
if (player == null) {
player = 8;
}
if (!room) { if (!room) {
console.log("err stoc_send_chat_to_room"); console.log("err stoc_send_chat_to_room");
return; return;
......
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