@@ -40,6 +40,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" | |||
EndProject | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
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|x86.ActiveCfg = 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 | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
@@ -236,6 +250,7 @@ Global | |||
{E169E15A-E82C-45BF-8C24-C2CADB7093AA} = {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} | |||
{4A03840B-9EBE-47E3-89AB-E0914DF21AFB} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
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 |