PreloaderLogWriter.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using BepInEx.ConsoleUtil;
  6. using BepInEx.Logging;
  7. namespace BepInEx.Preloader
  8. {
  9. public class PreloaderConsoleListener : ILogListener
  10. {
  11. public static List<LogEventArgs> LogEvents { get; } = new List<LogEventArgs>();
  12. public static TextWriter StandardOut { get; set; }
  13. protected PreloaderConsoleSource LoggerSource { get; set; }
  14. public PreloaderConsoleListener(bool redirectConsole)
  15. {
  16. StandardOut = Console.Out;
  17. if (redirectConsole)
  18. {
  19. LoggerSource = new PreloaderConsoleSource();
  20. Logger.Sources.Add(LoggerSource);
  21. Console.SetOut(LoggerSource);
  22. }
  23. }
  24. public void LogEvent(object sender, LogEventArgs eventArgs)
  25. {
  26. LogEvents.Add(eventArgs);
  27. Kon.ForegroundColor = eventArgs.Level.GetConsoleColor();
  28. ConsoleDirectWrite(eventArgs.ToStringLine());
  29. Kon.ForegroundColor = ConsoleColor.Gray;
  30. }
  31. public void ConsoleDirectWrite(string value)
  32. {
  33. StandardOut.Write(value);
  34. }
  35. public void ConsoleDirectWriteLine(string value)
  36. {
  37. StandardOut.WriteLine(value);
  38. }
  39. public void Dispose()
  40. {
  41. if (LoggerSource != null)
  42. {
  43. Console.SetOut(StandardOut);
  44. Logger.Sources.Remove(LoggerSource);
  45. LoggerSource.Dispose();
  46. LoggerSource = null;
  47. }
  48. }
  49. }
  50. public class PreloaderConsoleSource : TextWriter, ILogSource
  51. {
  52. public override Encoding Encoding { get; } = Console.OutputEncoding;
  53. public string SourceName { get; } = "BepInEx Preloader";
  54. public event EventHandler<LogEventArgs> LogEvent;
  55. public override void Write(object value)
  56. => LogEvent?.Invoke(this, new LogEventArgs(value, LogLevel.Info, this));
  57. public override void Write(string value)
  58. => Write((object)value);
  59. public override void WriteLine() { }
  60. public override void WriteLine(object value)
  61. => Write(value);
  62. public override void WriteLine(string value)
  63. => Write(value);
  64. }
  65. }