You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Program.cs 4.6 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using Discord;
  2. using Discord.WebSocket;
  3. using Microsoft.CodeAnalysis.CSharp.Scripting;
  4. using Microsoft.CodeAnalysis.Scripting;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.Diagnostics;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Reflection;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. namespace Idn
  16. {
  17. public class Program
  18. {
  19. public static readonly string[] Imports =
  20. {
  21. "System",
  22. "System.Collections.Generic",
  23. "System.Linq",
  24. "System.Threading.Tasks",
  25. "System.Diagnostics",
  26. "System.IO",
  27. "Discord",
  28. "Discord.Rest",
  29. "Discord.WebSocket",
  30. "idn"
  31. };
  32. static async Task Main(string[] args)
  33. {
  34. var token = File.ReadAllText("token.ignore");
  35. var client = new DiscordSocketClient(new DiscordSocketConfig { LogLevel = LogSeverity.Debug });
  36. var logQueue = new ConcurrentQueue<LogMessage>();
  37. var logCancelToken = new CancellationTokenSource();
  38. int presenceUpdates = 0;
  39. client.Log += msg =>
  40. {
  41. logQueue.Enqueue(msg);
  42. return Task.CompletedTask;
  43. };
  44. Console.CancelKeyPress += (_ev, _s) =>
  45. {
  46. logCancelToken.Cancel();
  47. };
  48. var logTask = Task.Run(async () =>
  49. {
  50. var fs = new FileStream("idn.log", FileMode.Append);
  51. var logStringBuilder = new StringBuilder(200);
  52. string logString = "";
  53. byte[] helloBytes = Encoding.UTF8.GetBytes($"### new log session: {DateTime.Now} ###\n\n");
  54. await fs.WriteAsync(helloBytes);
  55. while (!logCancelToken.IsCancellationRequested)
  56. {
  57. if (logQueue.TryDequeue(out var msg))
  58. {
  59. if (msg.Message?.IndexOf("PRESENCE_UPDATE)") > 0)
  60. {
  61. presenceUpdates++;
  62. continue;
  63. }
  64. _ = msg.ToString(builder: logStringBuilder);
  65. logStringBuilder.AppendLine();
  66. logString = logStringBuilder.ToString();
  67. Debug.Write(logString, "DNET");
  68. await fs.WriteAsync(Encoding.UTF8.GetBytes(logString));
  69. }
  70. await fs.FlushAsync();
  71. try
  72. {
  73. await Task.Delay(100, logCancelToken.Token);
  74. }
  75. finally { }
  76. }
  77. byte[] goodbyeBytes = Encoding.UTF8.GetBytes($"#!! end log session: {DateTime.Now} !!#\n\n\n");
  78. await fs.WriteAsync(goodbyeBytes);
  79. await fs.DisposeAsync();
  80. });
  81. await client.LoginAsync(TokenType.Bot, token);
  82. await client.StartAsync();
  83. var options = ScriptOptions.Default
  84. .AddReferences(GetAssemblies().ToArray())
  85. .AddImports(Imports);
  86. var globals = new ScriptGlobals
  87. {
  88. Client = client,
  89. PUCount = -1,
  90. };
  91. while (true)
  92. {
  93. Console.Write("> ");
  94. string input = Console.ReadLine();
  95. if (input == "quit!")
  96. {
  97. break;
  98. }
  99. object eval;
  100. try
  101. {
  102. globals.PUCount = presenceUpdates;
  103. eval = await CSharpScript.EvaluateAsync(input, options, globals);
  104. }
  105. catch (Exception e)
  106. {
  107. eval = e;
  108. }
  109. Console.WriteLine(Inspector.Inspect(eval));
  110. }
  111. await client.StopAsync();
  112. client.Dispose();
  113. logCancelToken.Cancel();
  114. try
  115. { await logTask; }
  116. finally { Console.WriteLine("goodbye!"); }
  117. }
  118. static IEnumerable<Assembly> GetAssemblies()
  119. {
  120. var Assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
  121. foreach (var a in Assemblies)
  122. {
  123. var asm = Assembly.Load(a);
  124. yield return asm;
  125. }
  126. yield return Assembly.GetEntryAssembly();
  127. }
  128. public class ScriptGlobals
  129. {
  130. public DiscordSocketClient Client { get; set; }
  131. public int PUCount { get; set; }
  132. }
  133. }
  134. }