ConsoleComponentSystem.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. namespace ET.Server
  6. {
  7. [EntitySystemOf(typeof(ConsoleComponent))]
  8. [FriendOf(typeof(ModeContex))]
  9. public static partial class ConsoleComponentSystem
  10. {
  11. [EntitySystem]
  12. private static void Awake(this ConsoleComponent self)
  13. {
  14. self.Start().NoContext();
  15. }
  16. private static async ETTask Start(this ConsoleComponent self)
  17. {
  18. self.CancellationTokenSource = new CancellationTokenSource();
  19. while (true)
  20. {
  21. try
  22. {
  23. ModeContex modeContex = self.GetComponent<ModeContex>();
  24. string line = await Task.Factory.StartNew(() =>
  25. {
  26. Console.Write($"{modeContex?.Mode ?? ""}> ");
  27. return Console.In.ReadLine();
  28. }, self.CancellationTokenSource.Token);
  29. line = line.Trim();
  30. switch (line)
  31. {
  32. case "":
  33. break;
  34. case "exit":
  35. self.RemoveComponent<ModeContex>();
  36. break;
  37. default:
  38. {
  39. string[] lines = line.Split(" ");
  40. string mode = modeContex == null? lines[0] : modeContex.Mode;
  41. IConsoleHandler iConsoleHandler = ConsoleDispatcher.Instance.Get(mode);
  42. if (modeContex == null)
  43. {
  44. modeContex = self.AddComponent<ModeContex>();
  45. modeContex.Mode = mode;
  46. }
  47. await iConsoleHandler.Run(self.Fiber(), modeContex, line);
  48. break;
  49. }
  50. }
  51. }
  52. catch (Exception e)
  53. {
  54. Log.Console(e.ToString());
  55. }
  56. }
  57. }
  58. }
  59. }