From 1dc2722d509e578b243bfda1a675dcfdb6003941 Mon Sep 17 00:00:00 2001 From: RblSb Date: Mon, 27 Sep 2021 20:13:55 +0300 Subject: Got a bug? Write /dump to chat as admin And open new issue with received file. --- src/Types.hx | 4 ++++ src/client/Main.hx | 6 ++++++ src/client/Utils.hx | 19 +++++++++++++++++++ src/server/Logger.hx | 8 ++++++-- src/server/Main.hx | 35 +++++++++++++++++++++++++++++++---- 5 files changed, 66 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/Types.hx b/src/Types.hx index 90952e2..d31196d 100644 --- a/src/Types.hx +++ b/src/Types.hx @@ -193,6 +193,9 @@ typedef WsEvent = { }, ?togglePlaylistLock:{ isOpen:Bool + }, + ?dump:{ + data:String } } @@ -230,4 +233,5 @@ enum abstract WsEventType(String) { var ShufflePlaylist; var UpdatePlaylist; var TogglePlaylistLock; + var Dump; } diff --git a/src/client/Main.hx b/src/client/Main.hx index eae0fc8..96d9ad0 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -534,6 +534,9 @@ class Main { case TogglePlaylistLock: setPlaylistLock(data.togglePlaylistLock.isOpen); + + case Dump: + Utils.saveFile("dump.json", ApplicationJson, data.dump.data); } } @@ -879,6 +882,9 @@ class Main { case "flashback", "fb": send({type: Flashback}); return false; + case "dump": + send({type: Dump}); + return true; } if (matchSimpleDate.match(command)) { send({ diff --git a/src/client/Utils.hx b/src/client/Utils.hx index 818dfdf..2c887ba 100644 --- a/src/client/Utils.hx +++ b/src/client/Utils.hx @@ -1,5 +1,6 @@ package client; +import haxe.io.Mime; import js.Browser.document; import js.Browser.navigator; import js.Browser.window; @@ -126,4 +127,22 @@ class Utils { document.body.appendChild(input); input.click(); } + + public static function saveFile(name:String, mime:Mime, data:String):Void { + final blob = new js.html.Blob([data], { + type: mime + }); + final url = URL.createObjectURL(blob); + final a = document.createElement("a"); + untyped a.download = name; + untyped a.href = url; + a.onclick = function(e) { + e.cancelBubble = true; + e.stopPropagation(); + } + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } } diff --git a/src/server/Logger.hx b/src/server/Logger.hx index cd96d1b..f089c94 100644 --- a/src/server/Logger.hx +++ b/src/server/Logger.hx @@ -23,7 +23,7 @@ class Logger { public function log(event:ServerEvent):Void { logs.push(event); - if (logs.length > 5000) logs.shift(); + if (logs.length > 1000) logs.shift(); } public function saveLog():Void { @@ -34,7 +34,11 @@ class Logger { File.saveContent('$folder/$name.json', Json.stringify(logs, filterNulls, "\t")); } - function filterNulls(key:Any, value:Any):Any { + public function getLogs():Array { + return logs; + } + + public function filterNulls(key:Any, value:Any):Any { #if js if (value == null) return js.Lib.undefined; #end diff --git a/src/server/Main.hx b/src/server/Main.hx index b9e9325..748c513 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -238,7 +238,13 @@ class Main { function saveState():Void { trace("Saving state..."); - final data:ServerState = { + final json = Json.stringify(getCurrentState(), "\t"); + File.saveContent(statePath, json); + writeUsers(userList); + } + + function getCurrentState():ServerState { + return { videoList: videoList, isPlaylistOpen: isPlaylistOpen, itemPos: itemPos, @@ -248,9 +254,6 @@ class Main { paused: videoTimer.isPaused() } } - final json = Json.stringify(data, "\t"); - File.saveContent(statePath, json); - writeUsers(userList); } function loadState():Void { @@ -395,6 +398,7 @@ class Main { if (data.type == TogglePlaylistLock) return false; if (data.type == UpdatePlaylist) return false; if (data.type == Logout) return false; + if (data.type == Dump) return false; // check if request has same field as type value final t:String = cast data.type; final t = t.charAt(0).toLowerCase() + t.substr(1); @@ -811,6 +815,29 @@ class Main { isOpen: isPlaylistOpen } }); + + case Dump: + if (!client.isAdmin) return; + final data = { + state: getCurrentState(), + clients: clients.map(client -> { + name: client.name, + id: client.id, + ip: clientIp(client.req), + isBanned: client.isBanned, + isAdmin: client.isAdmin, + isLeader: client.isLeader, + isUser: client.isUser, + }), + logs: logger.getLogs() + } + final json = Json.stringify(data, logger.filterNulls, "\t"); + send(client, { + type: Dump, + dump: { + data: json + } + }); } } -- cgit v1.2.3