| @@ -40,6 +40,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" | ||||
| EndProject | EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" | |||||
| EndProject | |||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
| @@ -218,6 +220,18 @@ Global | |||||
| {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.Build.0 = Release|Any CPU | {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.Build.0 = Release|Any CPU | ||||
| {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.ActiveCfg = Release|Any CPU | {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.ActiveCfg = Release|Any CPU | ||||
| {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.Build.0 = Release|Any CPU | {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.Build.0 = Release|Any CPU | ||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.ActiveCfg = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.Build.0 = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.ActiveCfg = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.Build.0 = Debug|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.ActiveCfg = Release|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU | |||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
| HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
| @@ -236,6 +250,7 @@ Global | |||||
| {E169E15A-E82C-45BF-8C24-C2CADB7093AA} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} | {E169E15A-E82C-45BF-8C24-C2CADB7093AA} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} | ||||
| {FC67057C-E92F-4E1C-98BE-46F839C8AD71} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} | {FC67057C-E92F-4E1C-98BE-46F839C8AD71} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} | ||||
| {47820065-3CFB-401C-ACEA-862BD564A404} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | {47820065-3CFB-401C-ACEA-862BD564A404} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | ||||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| SolutionGuid = {D2404771-EEC8-45F2-9D71-F3373F6C1495} | SolutionGuid = {D2404771-EEC8-45F2-9D71-F3373F6C1495} | ||||
| @@ -0,0 +1,74 @@ | |||||
| using System.Collections; | |||||
| using System.Linq; | |||||
| using System.Reflection; | |||||
| using System.Text; | |||||
| namespace idn | |||||
| { | |||||
| public static class Inspector | |||||
| { | |||||
| public static string Inspect(object value) | |||||
| { | |||||
| var builder = new StringBuilder(); | |||||
| if (value != null) | |||||
| { | |||||
| var type = value.GetType().GetTypeInfo(); | |||||
| builder.AppendLine($"[{type.Namespace}.{type.Name}]"); | |||||
| builder.AppendLine($"{InspectProperty(value)}"); | |||||
| if (value is IEnumerable) | |||||
| { | |||||
| var items = (value as IEnumerable).Cast<object>().ToArray(); | |||||
| if (items.Length > 0) | |||||
| { | |||||
| builder.AppendLine(); | |||||
| foreach (var item in items) | |||||
| builder.AppendLine($"- {InspectProperty(item)}"); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| var groups = type.GetProperties(BindingFlags.Instance | BindingFlags.Public) | |||||
| .Where(x => x.GetIndexParameters().Length == 0) | |||||
| .GroupBy(x => x.Name) | |||||
| .OrderBy(x => x.Key) | |||||
| .ToArray(); | |||||
| if (groups.Length > 0) | |||||
| { | |||||
| builder.AppendLine(); | |||||
| int pad = groups.Max(x => x.Key.Length) + 1; | |||||
| foreach (var group in groups) | |||||
| builder.AppendLine($"{group.Key.PadRight(pad, ' ')}{InspectProperty(group.First().GetValue(value))}"); | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| builder.AppendLine("null"); | |||||
| return builder.ToString(); | |||||
| } | |||||
| private static string InspectProperty(object obj) | |||||
| { | |||||
| if (obj == null) | |||||
| return "null"; | |||||
| var type = obj.GetType(); | |||||
| var debuggerDisplay = type.GetProperty("DebuggerDisplay", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); | |||||
| if (debuggerDisplay != null) | |||||
| return debuggerDisplay.GetValue(obj).ToString(); | |||||
| var toString = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) | |||||
| .Where(x => x.Name == "ToString" && x.DeclaringType != typeof(object)) | |||||
| .FirstOrDefault(); | |||||
| if (toString != null) | |||||
| return obj.ToString(); | |||||
| var count = type.GetProperty("Count", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); | |||||
| if (count != null) | |||||
| return $"[{count.GetValue(obj)} Items]"; | |||||
| return obj.ToString(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,135 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.IO; | |||||
| using System.Linq; | |||||
| using System.Reflection; | |||||
| using System.Threading.Tasks; | |||||
| using Microsoft.CodeAnalysis.CSharp.Scripting; | |||||
| using Microsoft.CodeAnalysis.Scripting; | |||||
| using Discord; | |||||
| using Discord.WebSocket; | |||||
| using System.Collections.Concurrent; | |||||
| using System.Threading; | |||||
| using System.Text; | |||||
| using System.Diagnostics; | |||||
| namespace idn | |||||
| { | |||||
| public class Program | |||||
| { | |||||
| public static readonly string[] Imports = | |||||
| { | |||||
| "System", | |||||
| "System.Collections.Generic", | |||||
| "System.Linq", | |||||
| "System.Threading.Tasks", | |||||
| "System.Diagnostics", | |||||
| "System.IO", | |||||
| "Discord", | |||||
| "Discord.Rest", | |||||
| "Discord.WebSocket", | |||||
| "idn" | |||||
| }; | |||||
| static async Task Main(string[] args) | |||||
| { | |||||
| var token = File.ReadAllText("token.ignore"); | |||||
| var client = new DiscordSocketClient(new DiscordSocketConfig { LogLevel = LogSeverity.Debug }); | |||||
| var logQueue = new ConcurrentQueue<LogMessage>(); | |||||
| var logCancelToken = new CancellationTokenSource(); | |||||
| client.Log += msg => | |||||
| { | |||||
| logQueue.Enqueue(msg); | |||||
| return Task.CompletedTask; | |||||
| }; | |||||
| var logTask = Task.Run(async () => | |||||
| { | |||||
| var fs = new FileStream("idn.log", FileMode.Append); | |||||
| //var f = File.Open("idn.log", FileMode.Append); | |||||
| StringBuilder logStringBuilder = new StringBuilder(200); | |||||
| string logString = ""; | |||||
| byte[] helloBytes = Encoding.UTF8.GetBytes($"### new log session: {DateTime.Now} ###\n\n"); | |||||
| await fs.WriteAsync(helloBytes); | |||||
| while (!logCancelToken.IsCancellationRequested) | |||||
| { | |||||
| if (logQueue.TryDequeue(out var msg)) | |||||
| { | |||||
| _ = msg.ToString(builder: logStringBuilder); | |||||
| logStringBuilder.AppendLine(); | |||||
| logString = logStringBuilder.ToString(); | |||||
| Debug.Write(logString, "DNET"); | |||||
| await fs.WriteAsync(Encoding.UTF8.GetBytes(logString), logCancelToken.Token); | |||||
| } | |||||
| await fs.FlushAsync(); | |||||
| await Task.Delay(100, logCancelToken.Token); | |||||
| } | |||||
| byte[] goodbyeBytes = Encoding.UTF8.GetBytes($"#!! end log session: {DateTime.Now} !!#\n\n\n"); | |||||
| await fs.WriteAsync(goodbyeBytes); | |||||
| await fs.DisposeAsync(); | |||||
| }); | |||||
| await client.LoginAsync(TokenType.Bot, token); | |||||
| await client.StartAsync(); | |||||
| var options = ScriptOptions.Default | |||||
| .AddReferences(GetAssemblies().ToArray()) | |||||
| .AddImports(Imports); | |||||
| var globals = new ScriptGlobals | |||||
| { | |||||
| Client = client, | |||||
| }; | |||||
| while (true) | |||||
| { | |||||
| Console.Write("> "); | |||||
| string input = Console.ReadLine(); | |||||
| if (input == "quit!") | |||||
| { | |||||
| break; | |||||
| } | |||||
| object eval; | |||||
| try | |||||
| { | |||||
| eval = await CSharpScript.EvaluateAsync(input, options, globals); | |||||
| } | |||||
| catch (Exception e) | |||||
| { | |||||
| eval = e; | |||||
| } | |||||
| Console.WriteLine(Inspector.Inspect(eval)); | |||||
| } | |||||
| await client.StopAsync(); | |||||
| client.Dispose(); | |||||
| logCancelToken.Cancel(); | |||||
| try | |||||
| { await logTask; } | |||||
| finally { Console.WriteLine("goodbye!"); } | |||||
| } | |||||
| static IEnumerable<Assembly> GetAssemblies() | |||||
| { | |||||
| var Assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies(); | |||||
| foreach (var a in Assemblies) | |||||
| { | |||||
| var asm = Assembly.Load(a); | |||||
| yield return asm; | |||||
| } | |||||
| yield return Assembly.GetEntryAssembly(); | |||||
| } | |||||
| public class ScriptGlobals | |||||
| { | |||||
| public DiscordSocketClient Client { get; set; } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <PropertyGroup> | |||||
| <OutputType>Exe</OutputType> | |||||
| <TargetFramework>netcoreapp3.1</TargetFramework> | |||||
| </PropertyGroup> | |||||
| <ItemGroup> | |||||
| <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="3.5.0" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ProjectReference Include="..\..\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" /> | |||||
| </ItemGroup> | |||||
| </Project> | |||||
| @@ -0,0 +1 @@ | |||||
| Get-Content .\bin\Debug\netcoreapp3.1\idn.log -Tail 3 -Wait | |||||