using Discord; using Discord.Commands; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using System.Linq; using EventBot.Attributes; using EventBot.Services; using Discord.Addons.Interactive; using EventBot.Misc; namespace EventBot.Modules { public class BasicModule : ModuleBase { private readonly DatabaseService _database; public BasicModule(DatabaseService database) { _database = database; } [RequireUserPermission(GuildPermission.Administrator, Group = "Permission")] [RequireOwner(Group = "Permission")] [RequireContext(ContextType.Guild)] [Command("prefix")] [Name("Configure prefix")] [Summary("Gets prefix.")] public async Task PrefixCommand() { var guildConfig = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id); if (guildConfig == null) throw new Exception("No guild config was foumd."); if(guildConfig.Prefix != null) await ReplyAsync($"Current prefix is `{guildConfig.Prefix}`"); else await ReplyAsync($"There is no prefix set for this guild."); } [RequireUserPermission(GuildPermission.Administrator, Group = "Permission")] [RequireOwner(Group = "Permission")] [RequireContext(ContextType.Guild)] [Command("prefix")] [Name("Configure prefix")] [Summary("Sets prefix.")] public async Task PrefixCommand( [Summary("New prefix to set")] string newPrefix) { var guildConfig = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id); if (guildConfig == null) throw new Exception("No guild config was foumd."); guildConfig.Prefix = newPrefix; await _database.SaveChangesAsync(); await ReplyAsync($"Prefix has been set to `{guildConfig.Prefix}`"); } [Group("help")] public class HelpModule : InteractiveBase { private readonly CommandService _commands; public HelpModule(CommandService commands) { _commands = commands; } [Command] [Name("Help")] [Summary("Lists all commands with there descriptions.")] public async Task DefaultHelpAsync() { var pagedCommands = _commands.Commands .OrderBy(c => c.Aliases[0]) .Where(c => c.Attributes .Select(a => { switch (a) { case NoHelpAttribute _: return false; case RequireContextAttribute rc: return Context.IsContextType(rc.Contexts); default: return true; } }) .Aggregate(true, (a, r) => a && r)) .SelectMany(c => c.Aliases.Select(a => new { CI = c, MA = (c.Aliases[0] == a), A = a }).Reverse()) .Select((e, i) => new { Command = e, Index = i }) .GroupBy(o => o.Index / 30) .Select(g => g.Select(o => o.Command)); var pager = new PaginatedMessage() { Title = "Command list", Color = Color.DarkBlue, Pages = pagedCommands.Select(p => string.Join("\r\n", p.Select(c => { if (c.MA) return $"`{c.CI.FormatCallHelpString()}` - **{c.CI.Name}**"; else return $"`{c.A}` `↪`"; }))), Options = new PaginatedAppearanceOptions() { Info = null, JumpDisplayOptions = JumpDisplayOptions.Never } }; await PagedReplyAsync(pager); } [Command] [Name("Help")] [Summary("Shows detailed info about command.")] public async Task DefaultHelpAsync([Summary("Command ")][Remainder] string commandAlias) { var command = _commands.Commands.Where(c => c.Aliases.Contains(commandAlias)).FirstOrDefault(); if (command == null) throw new Exception("This command was not found."); var embed = new EmbedBuilder() .WithTitle(command.Name) .WithDescription(command.Summary) .WithColor(Color.DarkTeal); embed.AddField("Module", command.Module.Name, true); if (command.Aliases.Count > 1) embed.AddField("Aliases", string.Join(", ", command.Aliases)); if(command.Parameters.Count > 0) embed.AddField("Parameters", string.Join("\r\n", command.Parameters.Select(p => $"`{p.FormatParameter()}` *(Type: {p.FormatParameterType()})* - **{p.Summary}** {(p.IsRemainder ? "_No quotes are needed, when providing this parameter._" : "")}" )) ); await ReplyAsync($"I got this information about command `{commandAlias}`:", embed: embed.Build()); } [Command("types")] [Name("Type help")] [Priority(1)] [Summary("Shows information about avaivable types for command paramters.")] [NoHelp] public async Task TypeHelp() { await ReplyAsync($"There are following avaivable types for command input: \r\n" + $"***String*** - The most basic text input, must be qouted if there is space inside. Ex: `\"This is a string\"`; `ThisCanBeUsedAlsoAsString`\r\n" + $"***Number*** - Just a simple number. Ex: `1`; `-2`; `1523`\r\n" + $"***User*** - Mention or ID of user. Ex: `360710685186850826`; `Skull132#1984`; {Context.Client.CurrentUser.Mention}\r\n" + $"***Event*** - ID of event. Just positive numbers 🙂.\r\n" + $"***EventRole*** - ID of event's role. Also positive numbers 😊.\r\n" + $"***EventParticipactionType*** - What type you want. Ex: `Quick`; `Detailed`"); } } } }