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()); }
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()); }
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()); } }
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()); }
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]"); } }
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")); }