add idn debugger
where is my foxboat
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
74
samples/idn/Inspector.cs
Normal file
74
samples/idn/Inspector.cs
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
135
samples/idn/Program.cs
Normal file
135
samples/idn/Program.cs
Normal file
@@ -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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
samples/idn/idn.csproj
Normal file
16
samples/idn/idn.csproj
Normal file
@@ -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>
|
||||||
1
samples/idn/logview.ps1
Normal file
1
samples/idn/logview.ps1
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Get-Content .\bin\Debug\netcoreapp3.1\idn.log -Tail 3 -Wait
|
||||||
Reference in New Issue
Block a user