示例#1
0
        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);
        }