From 5ca5b10db85a5f777794e7efb64b91730b91786c Mon Sep 17 00:00:00 2001
From: TheUbMunster <66451362+TheUbMunster@users.noreply.github.com>
Date: Tue, 26 Jul 2022 16:08:57 -0600
Subject: [PATCH 1/4] Fixed backwards ternaries in ban, crash, rejoin, 0
arguments no longer valid.
---
Server/Program.cs | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/Server/Program.cs b/Server/Program.cs
index 548d85b..0434204 100644
--- a/Server/Program.cs
+++ b/Server/Program.cs
@@ -197,12 +197,15 @@ server.PacketHandler = (c, p) => {
};
CommandHandler.RegisterCommand("rejoin", args => {
+ if (args.Length == 0) {
+ return "Usage: rejoin <* | usernames...>";
+ }
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args.Length == 1 && args[0] == "*"
- ? server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))
- : server.Clients.Where(c => c.Connected)).ToArray();
+ Client[] clients = (args[0] == "*"
+ ? server.Clients.Where(c => c.Connected)
+ : server.Clients.Where(c =>
+ c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
builder.Append(user.Name);
@@ -214,12 +217,15 @@ CommandHandler.RegisterCommand("rejoin", args => {
});
CommandHandler.RegisterCommand("crash", args => {
+ if (args.Length == 0) {
+ return "Usage: crash <* | usernames...>";
+ }
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args.Length == 1 && args[0] == "*"
- ? server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))
- : server.Clients.Where(c => c.Connected)).ToArray();
+ Client[] clients = (args[0] == "*"
+ ? server.Clients.Where(c => c.Connected)
+ : server.Clients.Where(c =>
+ c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
moreThanOne = true;
@@ -239,13 +245,16 @@ CommandHandler.RegisterCommand("crash", args => {
});
CommandHandler.RegisterCommand("ban", args => {
+ if (args.Length == 0) {
+ return "Usage: ban <* | usernames...>";
+ }
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args.Length == 1 && args[0] == "*"
- ? server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))
- : server.Clients.Where(c => c.Connected)).ToArray();
+ Client[] clients = (args[0] == "*"
+ ? server.Clients.Where(c => c.Connected)
+ : server.Clients.Where(c =>
+ c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
moreThanOne = true;
From d604c59a771ceeb836b1e66b97e12a87b8519773 Mon Sep 17 00:00:00 2001
From: TheUbMunster <66451362+TheUbMunster@users.noreply.github.com>
Date: Tue, 26 Jul 2022 17:09:44 -0600
Subject: [PATCH 2/4] Added quotable arguments, potential fix for ban * not
banning anyone.
---
Server/CommandHandler.cs | 34 ++++++++++++++++++++++++++++++++--
Server/Program.cs | 6 +++---
2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/Server/CommandHandler.cs b/Server/CommandHandler.cs
index 9a9634f..6dc5978 100644
--- a/Server/CommandHandler.cs
+++ b/Server/CommandHandler.cs
@@ -1,4 +1,5 @@
-namespace Server;
+using System.Text;
+namespace Server;
public static class CommandHandler {
public delegate Response Handler(string[] args);
@@ -19,10 +20,39 @@ public static class CommandHandler {
}
}
- public static Response GetResult(string input) {
+ ///
+ /// Modified by TheUbMunster
+ ///
+ public static Response GetResult(string input)
+ {
try {
string[] args = input.Split(' ');
if (args.Length == 0) return "No command entered, see help command for valid commands";
+ //this part is to allow single arguments that contain spaces (since the game seems to be able to handle usernames with spaces, we need to as well)
+ List newArgs = new List();
+ newArgs.Add(args[0]);
+ for (int i = 1; i < args.Length; i++) {
+ if (args[i].Length == 0) continue; //empty string (>1 whitespace between arguments).
+ else if (args[i][0] == '\"') {
+ //concatenate args until a string ends with a quote
+ StringBuilder sb = new StringBuilder();
+ i--; //fix off-by-one issue
+ do
+ {
+ i++;
+ sb.Append(args[i] + " "); //add space back removed by the string.Split(' ')
+ if (i >= args.Length) {
+ return "Unmatching quotes, make sure that whenever quotes are used, another quote is present to close it (no action was performed).";
+ }
+ } while (args[i][^1] != '\"');
+ newArgs.Add(sb.ToString(1, sb.Length - 3)); //remove quotes and extra space at the end.
+ }
+ else
+ {
+ newArgs.Add(args[i]);
+ }
+ }
+ args = newArgs.ToArray();
string commandName = args[0];
return Handlers.TryGetValue(commandName, out Handler? handler) ? handler(args[1..]) : $"Invalid command {args[0]}, see help command for valid commands";
}
diff --git a/Server/Program.cs b/Server/Program.cs
index 0434204..2b8ff86 100644
--- a/Server/Program.cs
+++ b/Server/Program.cs
@@ -202,7 +202,7 @@ CommandHandler.RegisterCommand("rejoin", args => {
}
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args[0] == "*"
+ Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
@@ -222,7 +222,7 @@ CommandHandler.RegisterCommand("crash", args => {
}
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args[0] == "*"
+ Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
@@ -251,7 +251,7 @@ CommandHandler.RegisterCommand("ban", args => {
bool moreThanOne = false;
StringBuilder builder = new StringBuilder();
- Client[] clients = (args[0] == "*"
+ Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
From db05586dd061ae9c794f5b3b2a7e1e66856bac1a Mon Sep 17 00:00:00 2001
From: TheUbMunster <66451362+TheUbMunster@users.noreply.github.com>
Date: Tue, 26 Jul 2022 17:09:44 -0600
Subject: [PATCH 3/4] Added quotable arguments, potential fix for ban * not
banning anyone.
---
Server/Program.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Server/Program.cs b/Server/Program.cs
index 2b8ff86..045a05d 100644
--- a/Server/Program.cs
+++ b/Server/Program.cs
@@ -205,7 +205,7 @@ CommandHandler.RegisterCommand("rejoin", args => {
Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
+ c.Connected && args.Any(x => c.Name == x || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
builder.Append(user.Name);
@@ -225,7 +225,7 @@ CommandHandler.RegisterCommand("crash", args => {
Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
+ c.Connected && args.Any(x => c.Name == x || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
moreThanOne = true;
@@ -254,7 +254,7 @@ CommandHandler.RegisterCommand("ban", args => {
Client[] clients = (args[0].Trim() == "*"
? server.Clients.Where(c => c.Connected)
: server.Clients.Where(c =>
- c.Connected && args.Any(x => c.Name.StartsWith(x) || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
+ c.Connected && args.Any(x => c.Name == x || (Guid.TryParse(x, out Guid result) && result == c.Id)))).ToArray();
foreach (Client user in clients) {
if (moreThanOne) builder.Append(", ");
moreThanOne = true;
From 66114bdecb3850c7b55b06b8349c413bd6b6a626 Mon Sep 17 00:00:00 2001
From: Sanae <32604996+Sanae6@users.noreply.github.com>
Date: Wed, 27 Jul 2022 14:00:58 -0600
Subject: [PATCH 4/4] Always update client's name on connect
Since the client variable would be changed in a reconnect, the name is not set on the old client object.
---
Server/Server.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Server/Server.cs b/Server/Server.cs
index dfe19cd..f312ea3 100644
--- a/Server/Server.cs
+++ b/Server/Server.cs
@@ -170,7 +170,6 @@ public class Server {
ConnectPacket connect = new ConnectPacket();
connect.Deserialize(memory.Memory.Span[packetRange]);
lock (Clients) {
- client.Name = connect.ClientName;
if (Clients.Count(x => x.Connected) == Settings.Instance.Server.MaxPlayers) {
client.Logger.Error($"Turned away as server is at max clients");
memory.Dispose();
@@ -212,6 +211,7 @@ public class Server {
throw new Exception($"Invalid connection type {connect.ConnectionType}");
}
+ client.Name = connect.ClientName;
client.Connected = true;
if (firstConn) {
// do any cleanup required when it comes to new clients
@@ -313,4 +313,4 @@ public class Server {
header.Deserialize(data[..Constants.HeaderSize]);
return header;
}
-}
\ No newline at end of file
+}