/// <summary> /// Handle fatal errors such as ping failure, login failure, server disconnection, and so on. /// Allows AutoRelog to perform on fatal errors, prompt for server version, and offline commands. /// </summary> /// <param name="errorMessage">Error message to display and optionally pass to AutoRelog bot</param> /// <param name="versionError">Specify if the error is related to an incompatible or unkown server version</param> /// <param name="disconnectReason">If set, the error message will be processed by the AutoRelog bot</param> public static void HandleFailure(string errorMessage = null, bool versionError = false, ChatBots.AutoRelog.DisconnectReason?disconnectReason = null) { if (!String.IsNullOrEmpty(errorMessage)) { ConsoleIO.Reset(); while (Console.KeyAvailable) { Console.ReadKey(true); } Console.WriteLine(errorMessage); if (disconnectReason.HasValue) { if (ChatBots.AutoRelog.OnDisconnectStatic(disconnectReason.Value, errorMessage)) { return; //AutoRelog is triggering a restart of the client } } } if (Settings.interactiveMode) { if (versionError) { Translations.Write("mcc.server_version"); Settings.ServerVersion = Console.ReadLine(); if (Settings.ServerVersion != "") { useMcVersionOnce = true; Restart(); return; } } if (offlinePrompt == null) { offlinePrompt = new Thread(new ThreadStart(delegate { string command = " "; ConsoleIO.WriteLineFormatted(Translations.Get("mcc.disconnected", (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar))); Translations.WriteLineFormatted("mcc.press_exit"); while (command.Length > 0) { if (!ConsoleIO.BasicIO) { ConsoleIO.Write('>'); } command = Console.ReadLine().Trim(); if (command.Length > 0) { string message = ""; if (Settings.internalCmdChar != ' ' && command[0] == Settings.internalCmdChar) { command = command.Substring(1); } if (command.StartsWith("reco")) { message = new Commands.Reco().Run(null, Settings.ExpandVars(command), null); } else if (command.StartsWith("connect")) { message = new Commands.Connect().Run(null, Settings.ExpandVars(command), null); } else if (command.StartsWith("exit") || command.StartsWith("quit")) { message = new Commands.Exit().Run(null, Settings.ExpandVars(command), null); } else if (command.StartsWith("help")) { ConsoleIO.WriteLineFormatted("§8MCC: " + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + new Commands.Reco().GetCmdDescTranslated()); ConsoleIO.WriteLineFormatted("§8MCC: " + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + new Commands.Connect().GetCmdDescTranslated()); } else { ConsoleIO.WriteLineFormatted(Translations.Get("icmd.unknown", command.Split(' ')[0])); } if (message != "") { ConsoleIO.WriteLineFormatted("§8MCC: " + message); } } } })); offlinePrompt.Start(); } } else { // Not in interactive mode, just exit and let the calling script handle the failure if (disconnectReason.HasValue) { // Return distinct exit codes for known failures. if (disconnectReason.Value == ChatBot.DisconnectReason.UserLogout) { Exit(1); } if (disconnectReason.Value == ChatBot.DisconnectReason.InGameKick) { Exit(2); } if (disconnectReason.Value == ChatBot.DisconnectReason.ConnectionLost) { Exit(3); } if (disconnectReason.Value == ChatBot.DisconnectReason.LoginRejected) { Exit(4); } } Exit(); } }
/// <summary> /// Handle fatal errors such as ping failure, login failure, server disconnection, and so on. /// Allows AutoRelog to perform on fatal errors, prompt for server version, and offline commands. /// </summary> /// <param name="errorMessage">Error message to display and optionally pass to AutoRelog bot</param> /// <param name="versionError">Specify if the error is related to an incompatible or unkown server version</param> /// <param name="disconnectReason">If set, the error message will be processed by the AutoRelog bot</param> public static void HandleFailure(string errorMessage = null, bool versionError = false, ChatBots.AutoRelog.DisconnectReason?disconnectReason = null) { if (!String.IsNullOrEmpty(errorMessage)) { ConsoleIO.Reset(); while (Console.KeyAvailable) { Console.ReadKey(true); } Console.WriteLine(errorMessage); if (disconnectReason.HasValue) { if (ChatBots.AutoRelog.OnDisconnectStatic(disconnectReason.Value, errorMessage)) { return; //AutoRelog is triggering a restart of the client } } } if (Settings.interactiveMode) { if (versionError) { Console.Write("Server version : "); Settings.ServerVersion = Console.ReadLine(); if (Settings.ServerVersion != "") { useMcVersionOnce = true; Restart(); return; } } if (offlinePrompt == null) { offlinePrompt = new Thread(new ThreadStart(delegate { string command = " "; ConsoleIO.WriteLineFormatted("Not connected to any server. Use '" + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + "help' for help."); ConsoleIO.WriteLineFormatted("Or press Enter to exit Minecraft Console Client."); while (command.Length > 0) { if (!ConsoleIO.basicIO) { ConsoleIO.Write('>'); } command = Console.ReadLine().Trim(); if (command.Length > 0) { string message = ""; if (Settings.internalCmdChar != ' ' && command[0] == Settings.internalCmdChar) { command = command.Substring(1); } if (command.StartsWith("reco")) { message = new Commands.Reco().Run(null, Settings.ExpandVars(command)); } else if (command.StartsWith("connect")) { message = new Commands.Connect().Run(null, Settings.ExpandVars(command)); } else if (command.StartsWith("exit") || command.StartsWith("quit")) { message = new Commands.Exit().Run(null, Settings.ExpandVars(command)); } else if (command.StartsWith("help")) { ConsoleIO.WriteLineFormatted("§8MCC: " + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + new Commands.Reco().CMDDesc); ConsoleIO.WriteLineFormatted("§8MCC: " + (Settings.internalCmdChar == ' ' ? "" : "" + Settings.internalCmdChar) + new Commands.Connect().CMDDesc); } else { ConsoleIO.WriteLineFormatted("§8Unknown command '" + command.Split(' ')[0] + "'."); } if (message != "") { ConsoleIO.WriteLineFormatted("§8MCC: " + message); } } } })); offlinePrompt.Start(); } } else { Exit(); } }
/// <summary> /// The main entry point of Minecraft Console Client /// </summary> static void Main(string[] args) { Console.WriteLine("Console Client for MC {0} to {1} - v{2} - By ORelio & Contributors", MCLowestVersion, MCHighestVersion, Version); //Build information to facilitate processing of bug reports if (BuildInfo != null) { ConsoleIO.WriteLineFormatted("§8" + BuildInfo); } //Debug input ? if (args.Length == 1 && args[0] == "--keyboard-debug") { ConsoleIO.WriteLine("Keyboard debug mode: Press any key to display info"); ConsoleIO.DebugReadInput(); } //Setup ConsoleIO ConsoleIO.LogPrefix = "§8[MCC] "; if (args.Length >= 1 && args[args.Length - 1] == "BasicIO" || args.Length >= 1 && args[args.Length - 1] == "BasicIO-NoColor") { if (args.Length >= 1 && args[args.Length - 1] == "BasicIO-NoColor") { ConsoleIO.BasicIO_NoColor = true; } ConsoleIO.BasicIO = true; args = args.Where(o => !Object.ReferenceEquals(o, args[args.Length - 1])).ToArray(); } //Take advantage of Windows 10 / Mac / Linux UTF-8 console if (isUsingMono || WindowsVersion.WinMajorVersion >= 10) { Console.OutputEncoding = Console.InputEncoding = Encoding.UTF8; } //Process ini configuration file if (args.Length >= 1 && System.IO.File.Exists(args[0]) && System.IO.Path.GetExtension(args[0]).ToLower() == ".ini") { Settings.LoadSettings(args[0]); //remove ini configuration file from arguments array List <string> args_tmp = args.ToList <string>(); args_tmp.RemoveAt(0); args = args_tmp.ToArray(); } else if (System.IO.File.Exists("MinecraftClient.ini")) { Settings.LoadSettings("MinecraftClient.ini"); } else { Settings.WriteDefaultSettings("MinecraftClient.ini"); } //Load external translation file. Should be called AFTER settings loaded Translations.LoadExternalTranslationFile(Settings.Language); //Other command-line arguments if (args.Length >= 1) { Settings.Login = args[0]; if (args.Length >= 2) { Settings.Password = args[1]; if (args.Length >= 3) { Settings.SetServerIP(args[2]); //Single command? if (args.Length >= 4) { Settings.SingleCommand = args[3]; } } } } if (Settings.ConsoleTitle != "") { Settings.Username = "******"; Console.Title = Settings.ExpandVars(Settings.ConsoleTitle); } //Test line to troubleshoot invisible colors if (Settings.DebugMessages) { ConsoleIO.WriteLineFormatted(Translations.Get("debug.color_test", "[0123456789ABCDEF]: [§00§11§22§33§44§55§66§77§88§99§aA§bB§cC§dD§eE§fF§r]")); } //Load cached sessions from disk if necessary if (Settings.SessionCaching == CacheType.Disk) { bool cacheLoaded = SessionCache.InitializeDiskCache(); if (Settings.DebugMessages) { Translations.WriteLineFormatted(cacheLoaded ? "debug.session_cache_ok" : "debug.session_cache_fail"); } } //Asking the user to type in missing data such as Username and Password bool useBrowser = Settings.AccountType == ProtocolHandler.AccountType.Microsoft && Settings.LoginMethod == "browser"; if (Settings.Login == "") { if (useBrowser) { ConsoleIO.WriteLine("Press Enter to skip session cache checking and continue sign-in with browser"); } Console.Write(ConsoleIO.BasicIO ? Translations.Get("mcc.login_basic_io") + "\n" : Translations.Get("mcc.login")); Settings.Login = Console.ReadLine(); } if (Settings.Password == "" && (Settings.SessionCaching == CacheType.None || !SessionCache.Contains(Settings.Login.ToLower())) && !useBrowser) { RequestPassword(); } // Setup exit cleaning code ExitCleanUp.Add(delegate() { // Do NOT use Program.Exit() as creating new Thread cause program to freeze if (client != null) { client.Disconnect(); ConsoleIO.Reset(); } if (offlinePrompt != null) { offlinePrompt.Abort(); offlinePrompt = null; ConsoleIO.Reset(); } if (Settings.playerHeadAsIcon) { ConsoleIcon.revertToMCCIcon(); } }); startupargs = args; InitializeClient(); }