using System; using System.IO; using System.Text; using BepInEx.Configuration; using BepInEx.Unix; namespace BepInEx { public static class ConsoleManager { internal static IConsoleDriver Driver { get; set; } /// /// True if an external console has been started, false otherwise. /// public static bool ConsoleActive => Driver?.ConsoleActive ?? false; /// /// The stream that writes to the standard out stream of the process. Should never be null. /// public static TextWriter StandardOutStream => Driver?.StandardOut; /// /// The stream that writes to an external console. Null if no such console exists /// public static TextWriter ConsoleStream => Driver?.ConsoleOut; public static void Initialize(bool alreadyActive) { switch (Environment.OSVersion.Platform) { case PlatformID.MacOSX: case PlatformID.Unix: { Driver = new LinuxConsoleDriver(); break; } case PlatformID.Win32NT: { Driver = new WindowsConsoleDriver(); break; } } Driver.Initialize(alreadyActive); } private static void DriverCheck() { if (Driver == null) throw new InvalidOperationException("Driver has not been initialized"); } public static void CreateConsole() { if (ConsoleActive) return; DriverCheck(); Driver.CreateConsole(); SetConsoleStreams(); } public static void DetachConsole() { if (!ConsoleActive) return; DriverCheck(); Driver.DetachConsole(); SetConsoleStreams(); } public static void SetConsoleEncoding() { // Apparently Windows code-pages work in Mono. // https://stackoverflow.com/a/33456543 // Alternatively we can pass in "shift-jis" var encoding = ConfigConsoleShiftJis.Value ? Encoding.GetEncoding(932): Encoding.UTF8; SetConsoleEncoding(encoding); } public static void SetConsoleEncoding(Encoding encoding) { if (!ConsoleActive) throw new InvalidOperationException("Console is not currently active"); DriverCheck(); Driver.SetConsoleEncoding(encoding); } public static void SetConsoleTitle(string title) { DriverCheck(); Driver.SetConsoleTitle(title); } public static void SetConsoleColor(ConsoleColor color) { DriverCheck(); Driver.SetConsoleColor(color); } internal static void SetConsoleStreams() { if (ConsoleActive) { Console.SetOut(ConsoleStream); Console.SetError(ConsoleStream); } else { Console.SetOut(TextWriter.Null); Console.SetError(TextWriter.Null); } } public static readonly ConfigEntry ConfigConsoleEnabled = ConfigFile.CoreConfig.Bind( "Logging.Console", "Enabled", false, "Enables showing a console for log output."); public static readonly ConfigEntry ConfigConsoleShiftJis = ConfigFile.CoreConfig.Bind( "Logging.Console", "ShiftJisEncoding", false, "If true, console is set to the Shift-JIS encoding, otherwise UTF-8 encoding."); } }