From 07e335b780bd18e02222e18bad19494957f887e5 Mon Sep 17 00:00:00 2001 From: Deathmax Date: Sat, 9 Jul 2011 17:24:04 +0800 Subject: [PATCH] inforesponse and statusresponse now work properly. --- TShockAPI/RconHandler.cs | 97 +++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 11 deletions(-) diff --git a/TShockAPI/RconHandler.cs b/TShockAPI/RconHandler.cs index c6b8feee..efaa3980 100644 --- a/TShockAPI/RconHandler.cs +++ b/TShockAPI/RconHandler.cs @@ -90,6 +90,7 @@ namespace TShockAPI Log.Error(e.ToString()); } } + } private static string SendPacket(byte[] bytes, string hostname, int port) @@ -123,14 +124,13 @@ namespace TShockAPI { if (!string.IsNullOrEmpty(Password)) { - var args = packetstring.Split(' '); - if (args.Length >= 3) + var args = ParseParameters(packetstring); + if (args.Count >= 3) { if (args[1] == Password) { - string command = ""; - for (int i = 2; i < args.Length; i++) - command += args[i] + " "; + args[1] = ""; + string command = string.Join(" ", args.ToArray()); command = command.TrimEnd(' ').TrimEnd('\0'); Response = ""; response = ExecuteCommand(command); @@ -187,9 +187,7 @@ namespace TShockAPI foreach (TSPlayer player in TShock.Players) { if (player != null && player.Active) - { statusstring += (string.Format("0 0 {0}\n", player.Name)); - } } response += statusstring; print = false; @@ -275,10 +273,10 @@ namespace TShockAPI writer.Write(Encoding.UTF8.GetBytes(string.Format("print\n{0}", response))); else writer.Write(Encoding.UTF8.GetBytes(response)); - var packet = Encoding.UTF8.GetBytes( - (Encoding.UTF8.GetString(stream.GetBuffer()) - .Substring(0, (int)stream.Length))); - return packet; + var trimmedpacket = new byte[(int)stream.Length]; + var packet = stream.GetBuffer(); + Array.Copy(packet, trimmedpacket, (int)stream.Length); + return trimmedpacket; } private static byte[] PadPacket(byte[] packet) @@ -296,5 +294,82 @@ namespace TShockAPI returnpacket = packet; return returnpacket; } + + #region ParseParams + private static List ParseParameters(string str) + { + var ret = new List(); + var sb = new StringBuilder(); + bool instr = false; + for (int i = 0; i < str.Length; i++) + { + char c = str[i]; + + if (instr) + { + if (c == '\\') + { + if (i + 1 >= str.Length) + break; + c = GetEscape(str[++i]); + } + else if (c == '"') + { + ret.Add(sb.ToString()); + sb.Clear(); + instr = false; + continue; + } + sb.Append(c); + } + else + { + if (IsWhiteSpace(c)) + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + } + else if (c == '"') + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + instr = true; + } + else + { + sb.Append(c); + } + } + } + if (sb.Length > 0) + ret.Add(sb.ToString()); + + return ret; + } + private static char GetEscape(char c) + { + switch (c) + { + case '\\': + return '\\'; + case '"': + return '"'; + case 't': + return '\t'; + default: + return c; + } + } + private static bool IsWhiteSpace(char c) + { + return c == ' ' || c == '\t' || c == '\n'; + } + #endregion } }