public async Task<ActionResult> Command_EvaluateAsync( [Name("Code")] [Description("The code to execute.")] [Remainder] string script) { var props = new EvaluationHelper(Context); var result = await _scripting.EvaluateScriptAsync(script, props).ConfigureAwait(false); var canUseEmbed = true; string stringRep; if (result.IsSuccess) { if (result.ReturnValue != null) { var special = false; switch (result.ReturnValue) { case ActionResult bresult: return bresult; case string str: stringRep = str; break; case IDictionary dictionary: var asb = new StringBuilder(); asb.AppendLine("Dictionary of type ``" + dictionary.GetType().Name + "``"); foreach (var ent in dictionary.Keys) asb.AppendLine($"- ``{ent}``: ``{dictionary[ent]}``"); stringRep = asb.ToString(); special = true; canUseEmbed = false; break; case IEnumerable enumerable: var asb0 = new StringBuilder(); asb0.AppendLine("Enumerable of type ``" + enumerable.GetType().Name + "``"); foreach (var ent in enumerable) asb0.AppendLine($"- ``{ent}``"); stringRep = asb0.ToString(); special = true; canUseEmbed = false; break; default: stringRep = result.ReturnValue.ToString(); break; } if ((stringRep.StartsWith("```") && stringRep.EndsWith("```")) || special) canUseEmbed = false; else stringRep = $"```cs\n{stringRep}```"; } else { stringRep = "No results returned."; } if (canUseEmbed) { var footerString = $"{(result.CompilationTime != -1 ? $"Compilation time: {result.CompilationTime}ms" : "")} {(result.ExecutionTime != -1 ? $"| Execution time: {result.ExecutionTime}ms" : "")}"; return Ok(e => e .WithTitle("Scripting Result") .WithDescription(result.ReturnValue != null ? "Type: `" + result.ReturnValue.GetType().Name + "`" : "") .AddField("Input", $"```cs\n{script}```") .AddField("Output", stringRep) .WithFooter(footerString, Context.BotUser.GetEffectiveAvatarUrl())); } return Ok(stringRep); } var embed = new EmbedBuilder { Title = "Scripting Result", Description = $"Scripting failed during stage **{FormatEnumMember(result.FailedStage)}**" }; embed.AddField("Input", $"```cs\n{script}```"); if (result.CompilationDiagnostics?.Count > 0) { var field = new EmbedFieldBuilder { Name = "Compilation Errors" }; var sb = new StringBuilder(); foreach (var compilationDiagnostic in result.CompilationDiagnostics.OrderBy(a => a.Location.SourceSpan.Start)) { var start = compilationDiagnostic.Location.SourceSpan.Start; var end = compilationDiagnostic.Location.SourceSpan.End; var bottomRow = script.Substring(start, end - start); if (!string.IsNullOrEmpty(bottomRow)) sb.AppendLine("`" + bottomRow + "`"); sb.AppendLine( $" - ``{compilationDiagnostic.Id}`` ({FormatDiagnosticLocation(compilationDiagnostic.Location)}): **{compilationDiagnostic.GetMessage()}**"); sb.AppendLine(); } field.Value = sb.ToString(); if (result.Exception != null) sb.AppendLine(); embed.AddField(field); } if (result.Exception != null) embed.AddField("Exception", $"``{result.Exception.GetType().Name}``: ``{result.Exception.Message}``"); return Ok(embed); }