public override void Install(CommandsManager manager) { manager.AddCommand(new CommandStub("eval", "Evaluates real-time C# code. Be careful with this", "Evaluates C# code that is dynamically compiled.\n\nThe following namespaces are available for use:\n * DiscordSharp\n * System.Threading\n * DiscordSharp.Objects\n\n\nMake sure your function returns a string value.\nYou can reference the DiscordSharp client by using `discordClient`.", PermissionType.User, 1, e => { bool canExec = false; if (manager.HasPermission(e.Author, PermissionType.Admin)) canExec = true; if (!canExec) { e.Channel.SendMessage("kek"); return; } string whatToEval = e.Args[0]; if (whatToEval.StartsWith("`") && whatToEval.EndsWith("`")) whatToEval = whatToEval.Trim('`'); try { var eval = EvalProvider.CreateEvalMethod<DiscordClient, string>(whatToEval, EvalNamespaces, new string[] { "DiscordSharp.dll", "System.Data.Linq.dll" }); string res = ""; Thread.Sleep(1000); Thread executionThread = null; Task evalTask = new Task(() => { executionThread = Thread.CurrentThread; if (eval != null) { try { res = eval(manager.Client); } catch (Exception ex) { res = "Exception occurred while running: " + ex.Message; } } else { string errors = "Errors While Compiling: \n"; if (EvalProvider.errors != null) { if (EvalProvider.errors.Count > 0) { foreach (var error in EvalProvider.errors) { errors += $"{error.ToString()}\n\n"; } } e.Channel.SendMessage($"```\n{errors}\n```"); } else e.Channel.SendMessage("Errors!"); } }); evalTask.Start(); evalTask.Wait(10 * 1000); if (!runningOnMono) //causes exceptions apparently >.> if (executionThread != null) executionThread.Abort(); if (res == null || res == "") e.Channel.SendMessage("Terminated after 10 second timeout."); else e.Channel.SendMessage($"**Result**\n```\n{res}\n```"); } catch (Exception ex) { string errors = "Errors While Compiling: \n"; if (EvalProvider.errors != null) { if (EvalProvider.errors.Count > 0) { foreach (var error in EvalProvider.errors) { errors += $"{error.ToString()}\n\n"; } } else errors += ex.Message; e.Channel.SendMessage($"```\n{errors}\n```"); } else e.Channel.SendMessage($"Errors! {ex.Message}"); } }), this); manager.AddCommand(new CommandStub("lua", "Evals Lua code.", "WIP.", PermissionType.Admin, 1, cmdArgs => { string whatToEval = cmdArgs.Args[0]; if (whatToEval.StartsWith("`") && whatToEval.EndsWith("`")) { whatToEval = whatToEval.Trim('`'); if (whatToEval.StartsWith("\n")) whatToEval = whatToEval.Trim('\n'); } Lua state = new Lua(); bool isAdmin = false; if (manager.HasPermission(cmdArgs.Author, PermissionType.Admin)) { state["discordClient"] = manager.Client; state.LoadCLRPackage(); string importStatements = ""; foreach (var use in EvalNamespaces) importStatements += $"import('{use}')\n"; state.DoString(importStatements); isAdmin = true; } else { //state.DoString("import = function () end"); } state.DoString(CustomLuaFunctions); string prefix = isAdmin ? $"{whatToEval}" : $"return run({whatToEval});"; var res = state.DoString(prefix); string resultMessage = $"**Result: {res.Length}**\n```"; foreach (var obj in res) { resultMessage += $"\n{obj.ToString()}"; } resultMessage += "\n```"; if (res != null) cmdArgs.Channel.SendMessage($"{resultMessage}"); else cmdArgs.Channel.SendMessage($"No result given."); }), this); }