diff options
| author | RblSb <msrblsb@gmail.com> | 2020-06-03 14:32:02 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-06-03 14:32:02 +0300 |
| commit | 6bb620cb803a6587dcbacc4a3360cbf3d75f3064 (patch) | |
| tree | 93424d764d9922ab74617eb4793b5cc0ed6eec0d /src/server/ConsoleInput.hx | |
| parent | c1a044cf6c83dd87c81ad90ab0a4d10d2f74f67c (diff) | |
Event logs and log replay
Diffstat (limited to 'src/server/ConsoleInput.hx')
| -rw-r--r-- | src/server/ConsoleInput.hx | 141 |
1 files changed, 118 insertions, 23 deletions
diff --git a/src/server/ConsoleInput.hx b/src/server/ConsoleInput.hx index 8b2463f..3c287af 100644 --- a/src/server/ConsoleInput.hx +++ b/src/server/ConsoleInput.hx @@ -1,20 +1,59 @@ package server; +import haxe.extern.EitherType as Or; +import haxe.io.Path; +import haxe.Json; +import sys.FileSystem; +import sys.io.File; import js.html.Console; import js.node.Readline; import js.Node.process; using StringTools; +private typedef CommandData = { + args:Array<String>, + desc:String +} + +private enum abstract Command(String) from String { + var AddAdmin = "addAdmin"; + var Replay = "replay"; + var LogList = "logList"; + var Exit = "exit"; +} + class ConsoleInput { final main:Main; + final commands:Map<Command, CommandData> = [ + AddAdmin => { + args: ["name", "password"], + desc: "Adds channel admin" + }, + Replay => { + args: ["name"], + desc: "Replay log file on server from user/logs/" + }, + LogList => { + args: [], + desc: "Show log list from user/logs/" + }, + Exit => { + args: [], + desc: "Exit process" + } + ]; public function new(main:Main) { this.main = main; } public function initConsoleInput():Void { - final rl = Readline.createInterface(process.stdin, process.stdout); + final rl = Readline.createInterface({ + input: process.stdin, + output: process.stdout, + completer: onCompletion + }); haxe.Log.trace = (msg, ?pos) -> { Readline.clearLine(process.stdout, 0); Readline.cursorTo(process.stdout, 0, null); @@ -29,31 +68,87 @@ class ConsoleInput { // rl.on("close", exit); } - function parseLine(line:String):Void { - if (line.startsWith("/addAdmin")) { - final args = line.split(" "); - if (args.length != 3) { - trace("Wrong count of arguments"); - return; - } - final name = args[1]; - final password = args[2]; - if (main.badNickName(name)) { - final error = Lang.get("usernameError") - .replace("$MAX", '${main.config.maxLoginLength}'); - trace(error); - return; - } - main.addAdmin(name, password); + function onCompletion(line:String):Array<Or<Array<String>, String>> { + final commands:Array<String> = [ + for (item in commands.keys()) '/$item ' + ]; + final matches = commands.filter(item -> item.startsWith(line)); + if (matches.length > 0) return [matches, line]; + return [commands, line]; + } - } else if (line == "/exit") { - main.exit(); + function parseLine(line:String):Void { + if (line.fastCodeAt(0) != "/".code || line.length < 2) { + printHelp(line); return; - } else { - trace('Unknown command "$line". List: -/addAdmin name password | Adds channel admin -/exit | Exit process'); } + final args = line.trim().split(" "); + final command:Command = args.shift().substr(1); + if (commands[command] == null) { + printHelp(line); + return; + } + if (!isValidArgs(command, args)) return; + + switch (command) { + case AddAdmin: + final name = args[0]; + final password = args[1]; + if (main.badNickName(name)) { + final error = Lang.get("usernameError") + .replace("$MAX", '${main.config.maxLoginLength}'); + trace(error); + return; + } + main.addAdmin(name, password); + + case Replay: + Utils.ensureDir(main.logsDir); + final name = args[0]; + final path = Path.normalize('${main.logsDir}/$name.json'); + if (!FileSystem.exists(path)) { + trace('File "$path" not found'); + return; + } + final text = File.getContent(path); + final events:Array<ServerEvent> = Json.parse(text); + main.replayLog(events); + + case LogList: + Utils.ensureDir(main.logsDir); + final names = FileSystem.readDirectory(main.logsDir) + .filter(s -> s.endsWith(".json")); + for (name in names) trace(Path.withoutExtension(name)); + + case Exit: + main.exit(); + } + } + + function isValidArgs(command:Command, args:Array<String>):Bool { + final len = args.length; + final actual = commands[command].args.length; + if (len != actual) { + trace('Wrong count of arguments for command "$command" ($len instead of $actual)'); + return false; + } + return true; + } + + function printHelp(line:String):Void { + var maxLength = 0; + for (name => data in commands) { + final len = '/$name ${data.args.join(" ")}'.length; + if (maxLength < len) maxLength = len; + } + final list:Array<String> = []; + for (name => data in commands) { + final args = data.args.join(" "); + final item = '/$name $args'.rpad(" ", maxLength); + list.push('$item | ${data.desc}'); + } + final desc = list.join("\n"); + trace('Unknown command "$line". List:\n$desc'); } } |
