From ea17ec87f12a2283e3138048945a35fb0ac3acf7 Mon Sep 17 00:00:00 2001 From: ORelio Date: Mon, 6 Apr 2015 11:42:43 +0200 Subject: [PATCH] Better exception catching - Better catch in proxy handler - Better catch in StartClient (thx doranchak) --- MinecraftClient/McTcpClient.cs | 65 ++++++++++++------- .../Protocol/Handlers/Protocol18.cs | 2 +- MinecraftClient/Proxy/ProxyHandler.cs | 12 ++-- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs index ebf99e75..25144ebd 100644 --- a/MinecraftClient/McTcpClient.cs +++ b/MinecraftClient/McTcpClient.cs @@ -89,6 +89,7 @@ namespace MinecraftClient private void StartClient(string user, string uuid, string sessionID, string server_ip, ushort port, int protocolversion, bool singlecommand, string command) { + bool retry = false; this.sessionid = sessionID; this.uuid = uuid; this.username = user; @@ -113,37 +114,51 @@ namespace MinecraftClient client.ReceiveBufferSize = 1024 * 1024; handler = Protocol.ProtocolHandler.getProtocolHandler(client, protocolversion, this); Console.WriteLine("Version is supported.\nLogging in..."); - - if (handler.Login()) + + try { - if (singlecommand) + if (handler.Login()) { - handler.SendChatMessage(command); - ConsoleIO.WriteLineFormatted("§7Command §8" + command + "§7 sent."); - Thread.Sleep(5000); - handler.Disconnect(); - Thread.Sleep(1000); - } - else - { - foreach (ChatBot bot in scripts_on_hold) - bot.SetHandler(this); - bots.AddRange(scripts_on_hold); - scripts_on_hold.Clear(); - - Console.WriteLine("Server was successfully joined.\nType '" - + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) - + "quit' to leave the server."); - - cmdprompt = new Thread(new ThreadStart(CommandPrompt)); - cmdprompt.Name = "MCC Command prompt"; - cmdprompt.Start(); + if (singlecommand) + { + handler.SendChatMessage(command); + ConsoleIO.WriteLineFormatted("§7Command §8" + command + "§7 sent."); + Thread.Sleep(5000); + handler.Disconnect(); + Thread.Sleep(1000); + } + else + { + foreach (ChatBot bot in scripts_on_hold) + bot.SetHandler(this); + bots.AddRange(scripts_on_hold); + scripts_on_hold.Clear(); + + Console.WriteLine("Server was successfully joined.\nType '" + + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + + "quit' to leave the server."); + + cmdprompt = new Thread(new ThreadStart(CommandPrompt)); + cmdprompt.Name = "MCC Command prompt"; + cmdprompt.Start(); + } } } + catch (Exception e) + { + ConsoleIO.WriteLineFormatted("§8" + e.Message); + Console.WriteLine("Failed to join this server."); + retry = true; + } } catch (SocketException) { Console.WriteLine("Failed to connect to this IP."); + retry = true; + } + + if (retry) + { if (AttemptsLeft > 0) { ChatBot.LogToConsole("Waiting 5 seconds (" + AttemptsLeft + " attempts left)..."); @@ -428,6 +443,10 @@ namespace MinecraftClient public void OnPlayerJoin(Guid uuid, string name) { + //Ignore TabListPlus placeholders + if (name.StartsWith("0000tab#")) + return; + lock (onlinePlayers) { onlinePlayers[uuid] = name; diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index a1eb60f3..ae1ae240 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -458,7 +458,7 @@ namespace MinecraftClient.Protocol.Handlers byte[] server_adress_len = getVarInt(server_adress_val.Length); byte[] server_port = BitConverter.GetBytes((ushort)handler.getServerPort()); Array.Reverse(server_port); byte[] next_state = getVarInt(2); - byte[] handshake_packet = concatBytes( protocol_version, server_adress_len, server_adress_val, server_port, next_state); + byte[] handshake_packet = concatBytes(protocol_version, server_adress_len, server_adress_val, server_port, next_state); SendPacket(0x00, handshake_packet); diff --git a/MinecraftClient/Proxy/ProxyHandler.cs b/MinecraftClient/Proxy/ProxyHandler.cs index 6ac63582..71b5faba 100644 --- a/MinecraftClient/Proxy/ProxyHandler.cs +++ b/MinecraftClient/Proxy/ProxyHandler.cs @@ -57,11 +57,15 @@ namespace MinecraftClient.Proxy } else return new TcpClient(host, port); } - catch (ProxyException e) + catch (Exception e) { - ConsoleIO.WriteLineFormatted("§8" + e.Message); - proxy = null; - return null; + if (e is ProxyException || e is SocketException) + { + ConsoleIO.WriteLineFormatted("§8" + e.Message); + proxy = null; + return null; + } + else throw; } } }