コード例 #1
0
        private static async Task CmdPrintHelp(DiscordCommandArguments args)
        {
            StringBuilder sb = new StringBuilder();

            int page         = 1;
            int maxPageCount = CommandManager.commands.Count / 10 + 1;

            if (args["page"] != null && !int.TryParse(args["page"], out page))
            {
                sb.AppendLine($"**{args["page"]}** is not a number!");
            }
            else if (page < 1)
            {
                sb.AppendLine($"Cannot show page **{page}** of help - Pages start at **1**!");
            }
            else if (page * 10 > CommandManager.commands.Count + 10)
            {
                sb.AppendLine($"Cannot show page **{page}** of help - There are only **{maxPageCount}** pages!");
            }
            else
            {
                sb.AppendLine($"**Help:** Showing page **{page}** out of **{maxPageCount}**");
                sb.AppendLine();

                --page;

                for (int i = page * 10; i < (page + 1) * 10 && i < CommandManager.commands.Count; ++i)
                {
                    sb.AppendLine(CommandManager.commands[i].GetHelpString());
                }
            }

            await args.Channel.SendMessage(sb.ToString());
        }
コード例 #2
0
        private static async Task CmdPrintPlugins(DiscordCommandArguments args)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"**Plugins:**");
            sb.AppendLine();

            foreach (LunarBotPlugin plugin in PluginManager.Plugins)
            {
                sb.AppendLine(plugin.GetPluginDescription());
            }

            await args.Channel.SendMessage(sb.ToString());
        }
コード例 #3
0
        public async Task Execute(MessageEventArgs e, List <string> args)
        {
            DiscordCommandArguments argsProper = new DiscordCommandArguments();

            argsProper.Channel = e.Channel;
            argsProper.Message = e.Message;
            argsProper.Server  = e.Server;
            argsProper.User    = e.User;

            argsProper["_command"] = args[0];

            string arg;

            for (int i = 0; i < Arguments.Count; ++i)
            {
                arg = i + 1 < args.Count ? args[i + 1] : null;
                if (arg == null && !Arguments[i].isOptional)
                {
                    await e.Channel.SendMessage($"{e.Message.User.Mention} - Sorry, but that command was missing the required parameter '{Arguments[i].argName}'");

                    return;
                }
                if (Arguments[i].includesRemainder)
                {
                    for (int j = i + 2; j < args.Count; ++j)
                    {
                        arg += " " + args[j];
                    }
                }
                argsProper[Arguments[i].argName] = arg;
            }

            try
            {
                await Action(argsProper);
            }
            catch (Exception ex)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine($"{e.Message.User.Mention} - Sorry, but an exception occurred while running that command. The exception is as follows:");
                sb.AppendLine();
                sb.AppendLine(ex.ToString());
                await e.Channel.SendMessage(sb.ToString());
            }
        }
コード例 #4
0
        private static async Task CmdMath(DiscordCommandArguments args)
        {
            string math = args["math"];

            org.mariuszgromada.math.mxparser.Expression expr = new org.mariuszgromada.math.mxparser.Expression(math);
            StringBuilder sb = new StringBuilder();

            if (!expr.checkSyntax())
            {
                sb.AppendLine($"{args.User.Mention} - Error in mathematical expression:");
                sb.AppendLine(expr.getErrorMessage());
            }
            else
            {
                sb.AppendLine($"{args.User.Mention} - {math} = **{expr.calculate()}**");
            }
            await args.Channel.SendMessage(sb.ToString());
        }
コード例 #5
0
        private static async Task CmdAddRTCommand(DiscordCommandArguments args)
        {
            string commandName = args["command"].ToLower();
            string codeContent = args["code"];

            if (CommandManager.commands.Find(c => c.HasCommandName(commandName)) != null)
            {
                await args.Channel.SendMessage($"{args.User.Mention} - Sorry, but the command {commandName} already exists!");

                return;
            }

            MethodInfo mi = await RuntimeCommandCompiler.CompileInputCode(args, codeContent);

            if (mi != null)
            {
                CommandManager.AddCommand(commandName, async e2 =>
                {
                    mi.Invoke(null, new object[] { e2 });
                }).SetHelpString("[Runtime defined method]");
            }
        }
コード例 #6
0
        public static async Task <MethodInfo> CompileInputCode(DiscordCommandArguments e, string codeContent)
        {
            string             code       = @"
using Discord;
using System;
using LunarBotRuntime;

public class InlineCommand
{
    static Channel channel;
    static User user;
    static Message message;
    static Server server;

    public static void _runtimeInvoke(MessageEventArgs messageArgs, DiscordCommandArguments args)
    {
        channel = messageArgs.Channel;
        user = messageArgs.User;
        message = messageArgs.Message;
        server = messageArgs.Server;
        " + codeContent + @"
    }
}
";
            CSharpCodeProvider provider   = new CSharpCodeProvider();
            CompilerParameters parameters = new CompilerParameters();

            parameters.GenerateInMemory   = true;
            parameters.GenerateExecutable = false;
            parameters.ReferencedAssemblies.AddRange(new string[] {
                "LunarBotRuntime.exe",
                "Discord.Net.dll",
                "Newtonsoft.Json.dll",
                "Nito.AsyncEx.dll",
                "Nito.AsyncEx.Concurrent.dll",
                "Nito.AsyncEx.Enlightenment.dll",
                "RestSharp.dll",
                "WebSocket4Net.dll",
            });
            CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

            if (results.Errors.HasErrors)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine($"{e.User.Mention} - Compilation failed! Code had the following errors:");
                sb.AppendLine();

                foreach (CompilerError error in results.Errors)
                {
                    sb.AppendLine($"Error ({error.ErrorNumber} @ {error.Line}): {error.ErrorText}");
                }

                await e.Channel.SendMessage(sb.ToString());

                return(null);
            }

            Assembly assembly = results.CompiledAssembly;
            Type     program  = assembly.GetType("InlineCommand");

            return(program.GetMethod("_runtimeInvoke"));
        }