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); }