diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Types.hx | 4 | ||||
| -rw-r--r-- | src/client/Main.hx | 23 | ||||
| -rw-r--r-- | src/server/Main.hx | 11 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/Types.hx b/src/Types.hx index 6a15bba..3a3f437 100644 --- a/src/Types.hx +++ b/src/Types.hx @@ -142,6 +142,9 @@ typedef WsEvent = { name:String, time:Float }, + ?kickClient:{ + name:String, + }, ?addVideo:{ item:VideoItem, atEnd:Bool @@ -205,6 +208,7 @@ enum abstract WsEventType(String) { // var AddClient; // var RemoveClient; var BanClient; + var KickClient; var AddVideo; var RemoveVideo; var SkipVideo; diff --git a/src/client/Main.hx b/src/client/Main.hx index bfbe97e..eae0fc8 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -40,6 +40,7 @@ class Main { final filters:Array<{regex:EReg, replace:String}> = []; var personal = new Client("Unknown", 0); var isConnected = false; + var disabledReconnection = false; var ws:WebSocket; final player:Player; var onTimeGet:Timer; @@ -127,6 +128,7 @@ class Main { if (isConnected) serverMessage(2); isConnected = false; player.pause(); + if (disabledReconnection) return; Timer.delay(openWebSocket, 2000); } } @@ -412,6 +414,9 @@ class Main { if (personal.group.toInt() != oldGroup) onUserGroupChanged(); case BanClient: // server-only + case KickClient: + disabledReconnection = true; + ws.close(); case Message: addMessage(data.message.clientName, data.message.text); @@ -835,6 +840,7 @@ class Main { switch (command) { case "ban": + mergeRedundantArgs(args, 0, 2); final name = args[0]; final time = parseSimpleDate(args[1]); if (time < 0) return true; @@ -847,6 +853,7 @@ class Main { }); return true; case "unban", "removeBan": + mergeRedundantArgs(args, 0, 1); final name = args[0]; send({ type: BanClient, @@ -856,6 +863,16 @@ class Main { } }); return true; + case "kick": + mergeRedundantArgs(args, 0, 1); + final name = args[0]; + send({ + type: KickClient, + kickClient: { + name: name + } + }); + return true; case "clear": send({type: ClearChat}); return true; @@ -906,6 +923,12 @@ class Main { return Std.parseInt(block); } + function mergeRedundantArgs(args:Array<String>, pos:Int, newLength:Int):Void { + final count = args.length - (newLength - 1); + if (count < 2) return; + args.insert(pos, args.splice(pos, count).join(" ")); + } + public function blinkTabWithTitle(title:String):Void { if (!document.hidden) return; if (onBlinkTab != null) onBlinkTab.stop(); diff --git a/src/server/Main.hx b/src/server/Main.hx index 42abaa9..b038f01 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -474,6 +474,17 @@ class Main { serverMessage(client, '${bannedClient.name} ($ip) has been banned.'); sendClientList(); + case KickClient: + if (!checkPermission(client, BanClientPerm)) return; + final name = data.kickClient.name; + final kickedClient = clients.getByName(name); + if (kickedClient == null) return; + if (client.name != name && kickedClient.isAdmin) { + serverMessage(client, "adminsCannotBeBannedError"); + return; + } + send(kickedClient, {type: KickClient}); + case Login: final name = data.login.clientName.trim(); final lcName = name.toLowerCase(); |
