aboutsummaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2020-06-03 14:32:02 +0300
committerRblSb <msrblsb@gmail.com>2020-06-03 14:32:02 +0300
commit6bb620cb803a6587dcbacc4a3360cbf3d75f3064 (patch)
tree93424d764d9922ab74617eb4793b5cc0ed6eec0d /build
parentc1a044cf6c83dd87c81ad90ab0a4d10d2f74f67c (diff)
Event logs and log replay
Diffstat (limited to 'build')
-rw-r--r--build/server.js522
1 files changed, 453 insertions, 69 deletions
diff --git a/build/server.js b/build/server.js
index 09fa596..4789311 100644
--- a/build/server.js
+++ b/build/server.js
@@ -251,6 +251,35 @@ HxOverrides.dateStr = function(date) {
var s = date.getSeconds();
return date.getFullYear() + "-" + (m < 10 ? "0" + m : "" + m) + "-" + (d < 10 ? "0" + d : "" + d) + " " + (h < 10 ? "0" + h : "" + h) + ":" + (mi < 10 ? "0" + mi : "" + mi) + ":" + (s < 10 ? "0" + s : "" + s);
};
+HxOverrides.strDate = function(s) {
+ switch(s.length) {
+ case 8:
+ var k = s.split(":");
+ var d = new Date();
+ d["setTime"](0);
+ d["setUTCHours"](k[0]);
+ d["setUTCMinutes"](k[1]);
+ d["setUTCSeconds"](k[2]);
+ return d;
+ case 10:
+ var k = s.split("-");
+ return new Date(k[0],k[1] - 1,k[2],0,0,0);
+ case 19:
+ var k = s.split(" ");
+ var y = k[0].split("-");
+ var t = k[1].split(":");
+ return new Date(y[0],y[1] - 1,y[2],t[0],t[1],t[2]);
+ default:
+ throw haxe_Exception.thrown("Invalid date format : " + s);
+ }
+};
+HxOverrides.cca = function(s,index) {
+ var x = s.charCodeAt(index);
+ if(x != x) {
+ return undefined;
+ }
+ return x;
+};
HxOverrides.substr = function(s,pos,len) {
if(len == null) {
len = s.length;
@@ -914,7 +943,7 @@ JsonParser_$28.prototype = $extend(json2object_reader_BaseParser.prototype,{
this.value = null;
}
,loadJsonString: function(s,pos,variable) {
- this.value = this.loadString(s,pos,variable,["Connected","Login","PasswordRequest","LoginError","Logout","Message","ServerMessage","UpdateClients","AddVideo","RemoveVideo","SkipVideo","VideoLoaded","Pause","Play","GetTime","SetTime","SetRate","Rewind","SetLeader","PlayItem","SetNextItem","ToggleItemType","ClearChat","ClearPlaylist","ShufflePlaylist","UpdatePlaylist","TogglePlaylistLock"],"Connected");
+ this.value = this.loadString(s,pos,variable,["Connected","Disconnected","Login","PasswordRequest","LoginError","Logout","Message","ServerMessage","UpdateClients","AddVideo","RemoveVideo","SkipVideo","VideoLoaded","Pause","Play","GetTime","SetTime","SetRate","Rewind","SetLeader","PlayItem","SetNextItem","ToggleItemType","ClearChat","ClearPlaylist","ShufflePlaylist","UpdatePlaylist","TogglePlaylistLock"],"Connected");
}
,__class__: JsonParser_$28
});
@@ -1876,9 +1905,28 @@ Lambda.exists = function(it,f) {
}
return false;
};
+Lambda.count = function(it,pred) {
+ var n = 0;
+ if(pred == null) {
+ var _ = $getIterator(it);
+ while(_.hasNext()) {
+ _.next();
+ ++n;
+ }
+ } else {
+ var x = $getIterator(it);
+ while(x.hasNext()) if(pred(x.next())) {
+ ++n;
+ }
+ }
+ return n;
+};
var haxe_IMap = function() { };
haxe_IMap.__name__ = true;
haxe_IMap.__isInterface__ = true;
+haxe_IMap.prototype = {
+ __class__: haxe_IMap
+};
var haxe_ds_StringMap = function() {
this.h = Object.create(null);
};
@@ -1895,8 +1943,32 @@ haxe_ds_StringMap.keysIterator = function(h) {
return keys[idx - 1];
}};
};
+haxe_ds_StringMap.kvIterator = function(h) {
+ var keys = Object.keys(h);
+ var len = keys.length;
+ var idx = 0;
+ return { hasNext : function() {
+ return idx < len;
+ }, next : function() {
+ idx += 1;
+ var k = keys[idx - 1];
+ return { key : k, value : h[k]};
+ }};
+};
haxe_ds_StringMap.prototype = {
- __class__: haxe_ds_StringMap
+ get: function(key) {
+ return this.h[key];
+ }
+ ,set: function(key,value) {
+ this.h[key] = value;
+ }
+ ,keys: function() {
+ return haxe_ds_StringMap.keysIterator(this.h);
+ }
+ ,keyValueIterator: function() {
+ return haxe_ds_StringMap.kvIterator(this.h);
+ }
+ ,__class__: haxe_ds_StringMap
};
var Lang = function() { };
Lang.__name__ = true;
@@ -2013,6 +2085,46 @@ StringTools.startsWith = function(s,start) {
return false;
}
};
+StringTools.endsWith = function(s,end) {
+ var elen = end.length;
+ var slen = s.length;
+ if(slen >= elen) {
+ return s.indexOf(end,slen - elen) == slen - elen;
+ } else {
+ return false;
+ }
+};
+StringTools.isSpace = function(s,pos) {
+ var c = HxOverrides.cca(s,pos);
+ if(!(c > 8 && c < 14)) {
+ return c == 32;
+ } else {
+ return true;
+ }
+};
+StringTools.ltrim = function(s) {
+ var l = s.length;
+ var r = 0;
+ while(r < l && StringTools.isSpace(s,r)) ++r;
+ if(r > 0) {
+ return HxOverrides.substr(s,r,l - r);
+ } else {
+ return s;
+ }
+};
+StringTools.rtrim = function(s) {
+ var l = s.length;
+ var r = 0;
+ while(r < l && StringTools.isSpace(s,l - r - 1)) ++r;
+ if(r > 0) {
+ return HxOverrides.substr(s,0,l - r);
+ } else {
+ return s;
+ }
+};
+StringTools.trim = function(s) {
+ return StringTools.ltrim(StringTools.rtrim(s));
+};
StringTools.lpad = function(s,c,l) {
if(c.length <= 0) {
return s;
@@ -2023,6 +2135,15 @@ StringTools.lpad = function(s,c,l) {
buf_b += s == null ? "null" : "" + s;
return buf_b;
};
+StringTools.rpad = function(s,c,l) {
+ if(c.length <= 0) {
+ return s;
+ }
+ var buf_b = "";
+ buf_b = "" + (s == null ? "null" : "" + s);
+ while(buf_b.length < l) buf_b += c == null ? "null" : "" + c;
+ return buf_b;
+};
StringTools.replace = function(s,sub,by) {
return s.split(sub).join(by);
};
@@ -2429,6 +2550,75 @@ haxe_io_Path.extension = function(path) {
}
return s.ext;
};
+haxe_io_Path.normalize = function(path) {
+ var slash = "/";
+ path = path.split("\\").join(slash);
+ if(path == slash) {
+ return slash;
+ }
+ var target = [];
+ var _g = 0;
+ var _g1 = path.split(slash);
+ while(_g < _g1.length) {
+ var token = _g1[_g];
+ ++_g;
+ if(token == ".." && target.length > 0 && target[target.length - 1] != "..") {
+ target.pop();
+ } else if(token == "") {
+ if(target.length > 0 || HxOverrides.cca(path,0) == 47) {
+ target.push(token);
+ }
+ } else if(token != ".") {
+ target.push(token);
+ }
+ }
+ var acc_b = "";
+ var colon = false;
+ var slashes = false;
+ var _g2_offset = 0;
+ var _g2_s = target.join(slash);
+ while(_g2_offset < _g2_s.length) {
+ var s = _g2_s;
+ var index = _g2_offset++;
+ var c = s.charCodeAt(index);
+ if(c >= 55296 && c <= 56319) {
+ c = c - 55232 << 10 | s.charCodeAt(index + 1) & 1023;
+ }
+ var c1 = c;
+ if(c1 >= 65536) {
+ ++_g2_offset;
+ }
+ var c2 = c1;
+ switch(c2) {
+ case 47:
+ if(!colon) {
+ slashes = true;
+ } else {
+ var i = c2;
+ colon = false;
+ if(slashes) {
+ acc_b += "/";
+ slashes = false;
+ }
+ acc_b += String.fromCodePoint(i);
+ }
+ break;
+ case 58:
+ acc_b += ":";
+ colon = true;
+ break;
+ default:
+ var i1 = c2;
+ colon = false;
+ if(slashes) {
+ acc_b += "/";
+ slashes = false;
+ }
+ acc_b += String.fromCodePoint(i1);
+ }
+ }
+ return acc_b;
+};
haxe_io_Path.addTrailingSlash = function(path) {
if(path.length == 0) {
return "/";
@@ -3129,13 +3319,19 @@ json2object_PositionUtils.prototype = {
,__class__: json2object_PositionUtils
};
var server_ConsoleInput = function(main) {
+ var _g = new haxe_ds_StringMap();
+ _g.set("addAdmin",{ args : ["name","password"], desc : "Adds channel admin"});
+ _g.set("replay",{ args : ["name"], desc : "Replay log file on server from user/logs/"});
+ _g.set("logList",{ args : [], desc : "Show log list from user/logs/"});
+ _g.set("exit",{ args : [], desc : "Exit process"});
+ this.commands = _g;
this.main = main;
};
server_ConsoleInput.__name__ = true;
server_ConsoleInput.prototype = {
initConsoleInput: function() {
var _gthis = this;
- var rl = js_node_Readline.createInterface(process.stdin,process.stdout);
+ var rl = js_node_Readline.createInterface({ input : process.stdin, output : process.stdout, completer : $bind(this,this.onCompletion)});
haxe_Log.trace = function(msg,pos) {
js_node_Readline.clearLine(process.stdout,0);
js_node_Readline.cursorTo(process.stdout,0,null);
@@ -3148,26 +3344,105 @@ server_ConsoleInput.prototype = {
rl.prompt();
});
}
- ,parseLine: function(line) {
- if(StringTools.startsWith(line,"/addAdmin")) {
- var args = line.split(" ");
- if(args.length != 3) {
- haxe_Log.trace("Wrong count of arguments",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 36, className : "server.ConsoleInput", methodName : "parseLine"});
- return;
+ ,onCompletion: function(line) {
+ var _g = [];
+ var item = this.commands.keys();
+ while(item.hasNext()) _g.push("/" + item.next() + " ");
+ var _g1 = [];
+ var _g11 = 0;
+ while(_g11 < _g.length) {
+ var v = _g[_g11];
+ ++_g11;
+ if(StringTools.startsWith(v,line)) {
+ _g1.push(v);
}
- var name = args[1];
- var password = args[2];
+ }
+ if(_g1.length > 0) {
+ return [_g1,line];
+ }
+ return [_g,line];
+ }
+ ,parseLine: function(line) {
+ if(line.charCodeAt(0) != 47 || line.length < 2) {
+ this.printHelp(line);
+ return;
+ }
+ var args = StringTools.trim(line).split(" ");
+ var command = HxOverrides.substr(args.shift(),1,null);
+ if(this.commands.get(command) == null) {
+ this.printHelp(line);
+ return;
+ }
+ if(!this.isValidArgs(command,args)) {
+ return;
+ }
+ switch(command) {
+ case "addAdmin":
+ var name = args[0];
+ var password = args[1];
if(this.main.badNickName(name)) {
- haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 44, className : "server.ConsoleInput", methodName : "parseLine"});
+ haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 100, className : "server.ConsoleInput", methodName : "parseLine"});
return;
}
this.main.addAdmin(name,password);
- } else if(line == "/exit") {
+ break;
+ case "exit":
this.main.exit();
- return;
- } else {
- haxe_Log.trace("Unknown command \"" + line + "\". List:\n/addAdmin name password | Adds channel admin\n/exit | Exit process",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 53, className : "server.ConsoleInput", methodName : "parseLine"});
+ break;
+ case "logList":
+ server_Utils.ensureDir(this.main.logsDir);
+ var _this = js_node_Fs.readdirSync(this.main.logsDir);
+ var _g = [];
+ var _g1 = 0;
+ while(_g1 < _this.length) {
+ var v = _this[_g1];
+ ++_g1;
+ if(StringTools.endsWith(v,".json")) {
+ _g.push(v);
+ }
+ }
+ var _g1 = 0;
+ while(_g1 < _g.length) haxe_Log.trace(haxe_io_Path.withoutExtension(_g[_g1++]),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 121, className : "server.ConsoleInput", methodName : "parseLine"});
+ break;
+ case "replay":
+ server_Utils.ensureDir(this.main.logsDir);
+ var path = haxe_io_Path.normalize("" + this.main.logsDir + "/" + args[0] + ".json");
+ if(!sys_FileSystem.exists(path)) {
+ haxe_Log.trace("File \"" + path + "\" not found",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 110, className : "server.ConsoleInput", methodName : "parseLine"});
+ return;
+ }
+ var events = JSON.parse(js_node_Fs.readFileSync(path,{ encoding : "utf8"}));
+ this.main.replayLog(events);
+ break;
+ }
+ }
+ ,isValidArgs: function(command,args) {
+ var len = args.length;
+ var actual = this.commands.get(command).args.length;
+ if(len != actual) {
+ haxe_Log.trace("Wrong count of arguments for command \"" + command + "\" (" + len + " instead of " + actual + ")",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 132, className : "server.ConsoleInput", methodName : "isValidArgs"});
+ return false;
+ }
+ return true;
+ }
+ ,printHelp: function(line) {
+ var maxLength = 0;
+ var _g = this.commands.keyValueIterator();
+ while(_g.hasNext()) {
+ var _g1 = _g.next();
+ var len = ("/" + _g1.key + " " + _g1.value.args.join(" ")).length;
+ if(maxLength < len) {
+ maxLength = len;
+ }
+ }
+ var list = [];
+ var _g = this.commands.keyValueIterator();
+ while(_g.hasNext()) {
+ var _g1 = _g.next();
+ var data = _g1.value;
+ list.push("" + StringTools.rpad("/" + _g1.key + " " + data.args.join(" ")," ",maxLength) + " | " + data.desc);
}
+ haxe_Log.trace("Unknown command \"" + line + "\". List:\n" + list.join("\n"),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 151, className : "server.ConsoleInput", methodName : "printHelp"});
}
,__class__: server_ConsoleInput
};
@@ -3327,6 +3602,72 @@ server_HttpServer.getMimeType = function(ext) {
}
return contentType;
};
+var server_Logger = function(folder,maxCount,verbose) {
+ this.matchFileFormat = new EReg("[0-9_-]+\\.json$","");
+ this.logs = [];
+ this.folder = folder;
+ this.maxCount = maxCount;
+ this.verbose = verbose;
+};
+server_Logger.__name__ = true;
+server_Logger.prototype = {
+ log: function(event) {
+ this.logs.push(event);
+ if(this.logs.length > 5000) {
+ this.logs.shift();
+ }
+ }
+ ,saveLog: function() {
+ if(this.logs.length == 0) {
+ return;
+ }
+ server_Utils.ensureDir(this.folder);
+ this.removeOldestLog(this.folder);
+ var name = DateTools.format(new Date(),"%Y-%m-%d_%H_%M_%S");
+ js_node_Fs.writeFileSync("" + this.folder + "/" + name + ".json",JSON.stringify(this.logs,$bind(this,this.filterNulls),"\t"));
+ }
+ ,filterNulls: function(key,value) {
+ if(value == null) {
+ return undefined;
+ }
+ return value;
+ }
+ ,removeOldestLog: function(folder) {
+ var _gthis = this;
+ var names = js_node_Fs.readdirSync(folder);
+ if(Lambda.count(names,function(item) {
+ return _gthis.matchFileFormat.match(item);
+ }) < this.maxCount) {
+ return;
+ }
+ var minDate = 0.0;
+ var fileName = null;
+ var _g = 0;
+ while(_g < names.length) {
+ var name = names[_g];
+ ++_g;
+ var date = this.extractFileDate(name).getTime();
+ if(minDate == 0 || minDate > date) {
+ minDate = date;
+ fileName = name;
+ }
+ }
+ if(fileName == null) {
+ return;
+ }
+ js_node_Fs.unlinkSync("" + folder + "/" + fileName);
+ }
+ ,extractFileDate: function(name) {
+ name = haxe_io_Path.withoutExtension(name);
+ var t = name.split("_");
+ var d = t.shift().split("-");
+ if(d.length != 3 && t.length != 3) {
+ return new Date(0);
+ }
+ return HxOverrides.strDate("" + d[0] + "-" + d[1] + "-" + d[2] + " " + t[0] + ":" + t[1] + ":" + t[2]);
+ }
+ ,__class__: server_Logger
+};
var server_Main = function() {
this.loadedClientsCount = 0;
this.htmlChars = new EReg("[&^<>'\"]","");
@@ -3342,6 +3683,7 @@ var server_Main = function() {
var _gthis = this;
this.verbose = Lambda.has(process.argv.slice(2),"--verbose");
this.statePath = "" + this.rootDir + "/user/state.json";
+ this.logsDir = "" + this.rootDir + "/user/logs";
process.on("SIGINT",$bind(this,this.exit));
process.on("SIGUSR1",$bind(this,this.exit));
process.on("SIGUSR2",$bind(this,this.exit));
@@ -3354,6 +3696,7 @@ var server_Main = function() {
_gthis.logError("unhandledRejection",reason);
_gthis.exit();
});
+ this.logger = new server_Logger(this.logsDir,10,this.verbose);
this.consoleInput = new server_ConsoleInput(this);
this.consoleInput.initConsoleInput();
this.initIntergationHandlers();
@@ -3371,8 +3714,8 @@ var server_Main = function() {
}
server_Utils.getGlobalIp(function(ip) {
_gthis.globalIp = ip;
- haxe_Log.trace("Local: http://" + _gthis.localIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 86, className : "server.Main", methodName : "new"});
- haxe_Log.trace("Global: http://" + _gthis.globalIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 87, className : "server.Main", methodName : "new"});
+ haxe_Log.trace("Local: http://" + _gthis.localIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 90, className : "server.Main", methodName : "new"});
+ haxe_Log.trace("Global: http://" + _gthis.globalIp + ":" + _gthis.port,{ fileName : "src/server/Main.hx", lineNumber : 91, className : "server.Main", methodName : "new"});
});
var dir = "" + this.rootDir + "/res";
server_HttpServer.init(dir,"" + this.rootDir + "/user/res",this.config.localAdmins);
@@ -3391,6 +3734,7 @@ server_Main.main = function() {
server_Main.prototype = {
exit: function() {
this.saveState();
+ this.logger.saveLog();
if(this.wss == null) {
process.exit();
return;
@@ -3445,7 +3789,7 @@ server_Main.prototype = {
var field = _g1[_g];
++_g;
if(Reflect.field(config,field) == null) {
- haxe_Log.trace("Warning: config field \"" + field + "\" is unknown",{ fileName : "src/server/Main.hx", lineNumber : 141, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: config field \"" + field + "\" is unknown",{ fileName : "src/server/Main.hx", lineNumber : 146, className : "server.Main", methodName : "getUserConfig"});
}
config[field] = Reflect.field(customConfig,field);
}
@@ -3456,14 +3800,14 @@ server_Main.prototype = {
var emote = _g1[_g];
++_g;
if(emoteCopies_h[emote.name]) {
- haxe_Log.trace("Warning: emote name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 146, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: emote name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 151, className : "server.Main", methodName : "getUserConfig"});
}
emoteCopies_h[emote.name] = true;
if(!this.verbose) {
continue;
}
if(emoteCopies_h[emote.image]) {
- haxe_Log.trace("Warning: emote url of name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 149, className : "server.Main", methodName : "getUserConfig"});
+ haxe_Log.trace("Warning: emote url of name \"" + emote.name + "\" has copy",{ fileName : "src/server/Main.hx", lineNumber : 154, className : "server.Main", methodName : "getUserConfig"});
}
emoteCopies_h[emote.image] = true;
}
@@ -3478,13 +3822,11 @@ server_Main.prototype = {
}
,writeUsers: function(users) {
var folder = "" + this.rootDir + "/user";
- if(!sys_FileSystem.exists(folder)) {
- sys_FileSystem.createDirectory(folder);
- }
+ server_Utils.ensureDir(folder);
js_node_Fs.writeFileSync("" + folder + "/users.json",JSON.stringify(users,null,"\t"));
}
,saveState: function() {
- haxe_Log.trace("Saving state...",{ fileName : "src/server/Main.hx", lineNumber : 173, className : "server.Main", methodName : "saveState"});
+ haxe_Log.trace("Saving state...",{ fileName : "src/server/Main.hx", lineNumber : 176, className : "server.Main", methodName : "saveState"});
var json = JSON.stringify({ videoList : this.videoList, isPlaylistOpen : this.isPlaylistOpen, itemPos : this.itemPos, messages : this.messages, timer : { time : this.videoTimer.getTime(), paused : this.videoTimer.isPaused()}},null,"\t");
js_node_Fs.writeFileSync(this.statePath,json);
}
@@ -3492,7 +3834,7 @@ server_Main.prototype = {
if(!sys_FileSystem.exists(this.statePath)) {
return;
}
- haxe_Log.trace("Loading state...",{ fileName : "src/server/Main.hx", lineNumber : 190, className : "server.Main", methodName : "loadState"});
+ haxe_Log.trace("Loading state...",{ fileName : "src/server/Main.hx", lineNumber : 193, className : "server.Main", methodName : "loadState"});
var data = JSON.parse(js_node_Fs.readFileSync(this.statePath,{ encoding : "utf8"}));
this.videoList.length = 0;
this.messages.length = 0;
@@ -3509,11 +3851,9 @@ server_Main.prototype = {
this.videoTimer.pause();
}
,logError: function(type,data) {
- haxe_Log.trace(type,{ fileName : "src/server/Main.hx", lineNumber : 204, className : "server.Main", methodName : "logError", customParams : [data]});
+ haxe_Log.trace(type,{ fileName : "src/server/Main.hx", lineNumber : 207, className : "server.Main", methodName : "logError", customParams : [data]});
var crashesFolder = "" + this.rootDir + "/user/crashes";
- if(!sys_FileSystem.exists(crashesFolder)) {
- sys_FileSystem.createDirectory(crashesFolder);
- }
+ server_Utils.ensureDir(crashesFolder);
js_node_Fs.writeFileSync("" + crashesFolder + "/" + (DateTools.format(new Date(),"%Y-%m-%d_%H_%M_%S") + "-" + type) + ".json",JSON.stringify(data,null,"\t"));
}
,initIntergationHandlers: function() {
@@ -3527,7 +3867,7 @@ server_Main.prototype = {
if(_gthis.clients.length == 0) {
return;
}
- haxe_Log.trace("Ping " + url,{ fileName : "src/server/Main.hx", lineNumber : 219, className : "server.Main", methodName : "initIntergationHandlers"});
+ haxe_Log.trace("Ping " + url,{ fileName : "src/server/Main.hx", lineNumber : 222, className : "server.Main", methodName : "initIntergationHandlers"});
js_node_Http.get(url,null,function(r) {
});
};
@@ -3541,62 +3881,68 @@ server_Main.prototype = {
}
this.userList.admins.push({ name : name, hash : hash});
this.writeUsers(this.userList);
- haxe_Log.trace("Admin " + name + " added.",{ fileName : "src/server/Main.hx", lineNumber : 234, className : "server.Main", methodName : "addAdmin"});
+ haxe_Log.trace("Admin " + name + " added.",{ fileName : "src/server/Main.hx", lineNumber : 237, className : "server.Main", methodName : "addAdmin"});
+ }
+ ,replayLog: function(events) {
+ var _gthis = this;
+ var timer = new haxe_Timer(1000);
+ timer.run = function() {
+ if(events.length == 0) {
+ timer.stop();
+ return;
+ }
+ var e = events.shift();
+ switch(e.event.type) {
+ case "Connected":
+ if(ClientTools.getByName(_gthis.clients,e.clientName) == null) {
+ var id = _gthis.freeIds.length > 0 ? _gthis.freeIds.shift() : _gthis.clients.length;
+ _gthis.clients.push(new Client({ send : function() {
+ return;
+ }},null,id,e.clientName,e.clientGroup));
+ }
+ _gthis.onMessage(ClientTools.getByName(_gthis.clients,e.clientName),e.event,true);
+ break;
+ case "Login":
+ var name = e.event.login.clientName;
+ if(e.event.login.passHash != null && !Lambda.exists(_gthis.userList.admins,function(a) {
+ return a.name == name;
+ })) {
+ e.event.login.passHash = null;
+ }
+ _gthis.onMessage(ClientTools.getByName(_gthis.clients,e.clientName),e.event,true);
+ break;
+ default:
+ _gthis.onMessage(ClientTools.getByName(_gthis.clients,e.clientName),e.event,true);
+ }
+ };
}
,onConnect: function(ws,req) {
var _gthis = this;
var ip = req.connection.remoteAddress;
var id = this.freeIds.length > 0 ? this.freeIds.shift() : this.clients.length;
var name = "Guest " + (id + 1);
- haxe_Log.trace("" + name + " connected (" + ip + ")",{ fileName : "src/server/Main.hx", lineNumber : 241, className : "server.Main", methodName : "onConnect"});
+ haxe_Log.trace("" + name + " connected (" + ip + ")",{ fileName : "src/server/Main.hx", lineNumber : 274, className : "server.Main", methodName : "onConnect"});
var client = new Client(ws,req,id,name,0);
client.setGroupFlag(ClientGroup.Admin,this.config.localAdmins && req.connection.localAddress == ip);
this.clients.push(client);
- if(this.clients.length == 1 && this.videoList.length > 0) {
- if(this.videoTimer.isPaused()) {
- this.videoTimer.play();
- }
- }
- var client1 = client;
- var tmp = this.config;
- var tmp1 = this.messages;
- var client2 = client.name;
- var _g = [];
- var _g1 = 0;
- var _g2 = this.clients;
- while(_g1 < _g2.length) _g.push(_g2[_g1++].getData());
- this.send(client1,{ type : "Connected", connected : { config : tmp, history : tmp1, isUnknownClient : true, clientName : client2, clients : _g, videoList : this.videoList, isPlaylistOpen : this.isPlaylistOpen, itemPos : this.itemPos, globalIp : this.globalIp}});
- this.sendClientList();
+ this.onMessage(client,{ type : "Connected"},true);
ws.on("message",function(data) {
var obj = _gthis.wsEventParser.fromJson(data);
if(_gthis.wsEventParser.errors.length > 0) {
var errors = "" + ("Wrong request for type \"" + obj.type + "\":") + "\n" + json2object_ErrorUtils.convertErrorArray(_gthis.wsEventParser.errors);
- haxe_Log.trace(errors,{ fileName : "src/server/Main.hx", lineNumber : 273, className : "server.Main", methodName : "onConnect"});
+ haxe_Log.trace(errors,{ fileName : "src/server/Main.hx", lineNumber : 289, className : "server.Main", methodName : "onConnect"});
_gthis.serverMessage(client,errors);
return;
}
- _gthis.onMessage(client,obj);
+ _gthis.onMessage(client,obj,false);
});
ws.on("close",function(err) {
- haxe_Log.trace("Client " + client.name + " disconnected",{ fileName : "src/server/Main.hx", lineNumber : 280, className : "server.Main", methodName : "onConnect"});
- server_Utils.sortedPush(_gthis.freeIds,client.id);
- HxOverrides.remove(_gthis.clients,client);
- _gthis.sendClientList();
- if((client.group & 2) != 0) {
- if(_gthis.videoTimer.isPaused()) {
- _gthis.videoTimer.play();
- }
- }
- if(_gthis.clients.length == 0) {
- if(_gthis.waitVideoStart != null) {
- _gthis.waitVideoStart.stop();
- }
- _gthis.videoTimer.pause();
- }
+ _gthis.onMessage(client,{ type : "Disconnected"},true);
});
}
- ,onMessage: function(client,data) {
+ ,onMessage: function(client,data,internal) {
var _gthis = this;
+ this.logger.log({ clientName : client.name, clientGroup : client.group, event : data, time : new Date().getTime()});
switch(data.type) {
case "AddVideo":
if(!this.checkPermission(client,"addVideo")) {
@@ -3650,6 +3996,36 @@ server_Main.prototype = {
this.broadcast(data);
break;
case "Connected":
+ if(!internal) {
+ return;
+ }
+ if(this.clients.length == 1 && this.videoList.length > 0) {
+ if(this.videoTimer.isPaused()) {
+ this.videoTimer.play();
+ }
+ }
+ this.send(client,{ type : "Connected", connected : { config : this.config, history : this.messages, isUnknownClient : true, clientName : client.name, clients : this.clientList(), videoList : this.videoList, isPlaylistOpen : this.isPlaylistOpen, itemPos : this.itemPos, globalIp : this.globalIp}});
+ this.sendClientListExcept(client);
+ break;
+ case "Disconnected":
+ if(!internal) {
+ return;
+ }
+ haxe_Log.trace("Client " + client.name + " disconnected",{ fileName : "src/server/Main.hx", lineNumber : 334, className : "server.Main", methodName : "onMessage"});
+ server_Utils.sortedPush(this.freeIds,client.id);
+ HxOverrides.remove(this.clients,client);
+ this.sendClientList();
+ if((client.group & 2) != 0) {
+ if(this.videoTimer.isPaused()) {
+ this.videoTimer.play();
+ }
+ }
+ if(this.clients.length == 0) {
+ if(this.waitVideoStart != null) {
+ this.waitVideoStart.stop();
+ }
+ this.videoTimer.pause();
+ }
break;
case "GetTime":
if(this.videoList.length == 0) {
@@ -3712,7 +4088,7 @@ server_Main.prototype = {
client.name = name;
client.setGroupFlag(ClientGroup.User,true);
this.send(client,{ type : data.type, login : { isUnknownClient : true, clientName : client.name, clients : this.clientList()}});
- this.sendClientList();
+ this.sendClientListExcept(client);
break;
case "LoginError":
break;
@@ -3721,7 +4097,7 @@ server_Main.prototype = {
client.name = "Guest " + (this.clients.indexOf(client) + 1);
client.setGroupFlag(ClientGroup.User,false);
this.send(client,{ type : data.type, logout : { oldClientName : oldName, clientName : client.name, clients : this.clientList()}});
- this.sendClientList();
+ this.sendClientListExcept(client);
break;
case "Message":
if(!this.checkPermission(client,"writeChat")) {
@@ -3920,6 +4296,9 @@ server_Main.prototype = {
,sendClientList: function() {
this.broadcast({ type : "UpdateClients", updateClients : { clients : this.clientList()}});
}
+ ,sendClientListExcept: function(skipped) {
+ this.broadcastExcept(skipped,{ type : "UpdateClients", updateClients : { clients : this.clientList()}});
+ }
,serverMessage: function(client,textId) {
this.send(client,{ type : "ServerMessage", serverMessage : { textId : textId}});
}
@@ -4018,6 +4397,11 @@ server_Main.prototype = {
};
var server_Utils = function() { };
server_Utils.__name__ = true;
+server_Utils.ensureDir = function(path) {
+ if(!sys_FileSystem.exists(path)) {
+ sys_FileSystem.createDirectory(path);
+ }
+};
server_Utils.getGlobalIp = function(callback) {
js_node_Https.get("https://myexternalip.com/raw",function(r) {
r.setEncoding("utf8");
@@ -4029,7 +4413,7 @@ server_Utils.getGlobalIp = function(callback) {
callback(data_b);
});
}).on("error",function(e) {
- haxe_Log.trace("Warning: connection error, server is local.",{ fileName : "src/server/Utils.hx", lineNumber : 16, className : "server.Utils", methodName : "getGlobalIp"});
+ haxe_Log.trace("Warning: connection error, server is local.",{ fileName : "src/server/Utils.hx", lineNumber : 21, className : "server.Utils", methodName : "getGlobalIp"});
callback("127.0.0.1");
});
};
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage