Better help part 1

This commit is contained in:
Karolis2011
2019-06-19 23:59:48 +03:00
parent 9ac6343406
commit b5702faa31
3 changed files with 113 additions and 20 deletions

View File

@@ -0,0 +1,32 @@
using Discord;
using Discord.Commands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventBot.Misc
{
public static class Extensions
{
public static ContextType GetContextType(this ICommandContext context)
{
ContextType type = 0;
if (context.Channel is IGuildChannel)
type |= ContextType.Guild;
if (context.Channel is IDMChannel)
type |= ContextType.DM;
if (context.Channel is IGroupChannel)
type |= ContextType.Group;
return type;
}
public static bool IsContextType(this ICommandContext context, ContextType type) => (context.GetContextType() & type) != 0;
public static string FormatCallHelpString(this CommandInfo command)
{
return $"{command.Aliases[0]} {string.Join(" ", command.Parameters.Select(p => p.IsOptional ? $"[{p.Name}]" : $"<{p.Name}>"))}";
}
}
}

View File

@@ -7,6 +7,8 @@ using System.Threading.Tasks;
using System.Linq; using System.Linq;
using EventBot.Attributes; using EventBot.Attributes;
using EventBot.Services; using EventBot.Services;
using Discord.Addons.Interactive;
using EventBot.Misc;
namespace EventBot.Modules namespace EventBot.Modules
{ {
@@ -22,6 +24,7 @@ namespace EventBot.Modules
[RequireOwner(Group = "Permission")] [RequireOwner(Group = "Permission")]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[Command("prefix")] [Command("prefix")]
[Name("Configure prefix")]
[Summary("Gets prefix.")] [Summary("Gets prefix.")]
public async Task PrefixCommand() public async Task PrefixCommand()
{ {
@@ -38,6 +41,7 @@ namespace EventBot.Modules
[RequireOwner(Group = "Permission")] [RequireOwner(Group = "Permission")]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[Command("prefix")] [Command("prefix")]
[Name("Configure prefix")]
[Summary("Sets prefix.")] [Summary("Sets prefix.")]
public async Task PrefixCommand( public async Task PrefixCommand(
[Summary("New prefix to set")] string newPrefix) [Summary("New prefix to set")] string newPrefix)
@@ -50,8 +54,9 @@ namespace EventBot.Modules
await ReplyAsync($"Prefix has been set to `{guildConfig.Prefix}`"); await ReplyAsync($"Prefix has been set to `{guildConfig.Prefix}`");
} }
[Group("help")] [Group("help")]
public class HelpModule : ModuleBase<SocketCommandContext> public class HelpModule : InteractiveBase<SocketCommandContext>
{ {
private readonly CommandService _commands; private readonly CommandService _commands;
@@ -61,23 +66,47 @@ namespace EventBot.Modules
} }
[Command] [Command]
[Name("Help")]
[Summary("Lists all commands with there descriptions.")] [Summary("Lists all commands with there descriptions.")]
public async Task DefaultHelpAsync() public async Task DefaultHelpAsync()
{ {
var embed = new EmbedBuilder() var pagedCommands = _commands.Commands
.WithTitle("Command list") .OrderBy(c => c.Aliases[0])
.WithColor(Color.DarkBlue) .Where(c => c.Attributes
.WithCurrentTimestamp() .Select(a => {
.WithFields(_commands.Commands switch (a)
.Where(c => c.Attributes.Where(a => a is NoHelpAttribute || (a is RequireContextAttribute requireContext)).Count() == 0)
.Select(c =>
new EmbedFieldBuilder()
{ {
Name = $"`{string.Join(", ", c.Aliases)} {string.Join(" ", c.Parameters.Select(p => p.IsOptional ? $"[{p.Name}]" : $"<{p.Name}>"))}`", case NoHelpAttribute _:
Value = c.Summary return false;
}) case RequireContextAttribute rc:
); return Context.IsContextType(rc.Contexts);
await Context.User.SendMessageAsync(embed: embed.Build()); 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 / 20)
.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);
} }
} }
} }

View File

@@ -24,8 +24,10 @@ namespace EventBot.Modules
} }
[Command("join")] [Command("join")]
[Alias("j")]
[Name("Join event")]
[Summary("Joins latest or specified event with specified event role.")] [Summary("Joins latest or specified event with specified event role.")]
public async Task JoinAsync( public async Task JoinEvent(
[Summary("Role emote or role ID to join the most recent event.")] string emoteOrId, [Summary("Role emote or role ID to join the most recent event.")] string emoteOrId,
[Summary("Extra information that might be needed by organizers.")] string extraInformation = null, [Summary("Extra information that might be needed by organizers.")] string extraInformation = null,
[Summary("Optional event ID, used to join an event that started before the most recent one.")] Event @event = null) [Summary("Optional event ID, used to join an event that started before the most recent one.")] Event @event = null)
@@ -64,8 +66,9 @@ namespace EventBot.Modules
} }
[Command("config logchannel")] [Command("config logchannel")]
[Name("Configure logging channel")]
[Summary("Sets logging channel for role changes.")] [Summary("Sets logging channel for role changes.")]
public async Task SetRoleChannelAsync( public async Task ConfigureEventLogChannel(
[Summary("Channel to use for logging.")] IChannel channel) [Summary("Channel to use for logging.")] IChannel channel)
{ {
var guild = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id); var guild = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id);
@@ -79,8 +82,9 @@ namespace EventBot.Modules
} }
[Command("config partrole")] [Command("config partrole")]
[Name("Configure participant role")]
[Summary("Sets discord role to assign when the user selects a role.")] [Summary("Sets discord role to assign when the user selects a role.")]
public async Task SetParticipationRole( public async Task ConfigureEventParticipantRole(
[Summary("Role to assign.")] IRole role) [Summary("Role to assign.")] IRole role)
{ {
var guild = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id); var guild = _database.GuildConfigs.FirstOrDefault(g => g.GuildId == Context.Guild.Id);
@@ -94,8 +98,10 @@ namespace EventBot.Modules
} }
[Command("new")] [Command("new")]
[Alias("add", "create")]
[Name("Create event")]
[Summary("Creates a new event.")] [Summary("Creates a new event.")]
public async Task NewEvent( public async Task CreateEvent(
[Summary("Title for the event.")] string title, [Summary("Title for the event.")] string title,
[Summary("Description for the event.")] string description, [Summary("Description for the event.")] string description,
[Summary("Type of event registration.")] Event.EventParticipactionType type = Event.EventParticipactionType.Quick) [Summary("Type of event registration.")] Event.EventParticipactionType type = Event.EventParticipactionType.Quick)
@@ -117,6 +123,7 @@ namespace EventBot.Modules
} }
[Command("update title")] [Command("update title")]
[Name("Update event's title")]
[Summary("Updates the event's title.")] [Summary("Updates the event's title.")]
public async Task UpdateEventTitle( public async Task UpdateEventTitle(
[Summary("Title for the event.")] string title, [Summary("Title for the event.")] string title,
@@ -134,6 +141,8 @@ namespace EventBot.Modules
await _events.UpdateEventMessage(@event); await _events.UpdateEventMessage(@event);
} }
[Command("update description")] [Command("update description")]
[Alias("update desc")]
[Name("Update event's description")]
[Summary("Updates the event's description.")] [Summary("Updates the event's description.")]
public async Task UpdateEventDescription( public async Task UpdateEventDescription(
[Summary("Description for the event.")] string description, [Summary("Description for the event.")] string description,
@@ -152,6 +161,7 @@ namespace EventBot.Modules
} }
[Command("update type")] [Command("update type")]
[Name("Update event's type")]
[Summary("Updates the event type.")] [Summary("Updates the event type.")]
public async Task UpdateEventType( public async Task UpdateEventType(
[Summary("Type of event registration.")] Event.EventParticipactionType type, [Summary("Type of event registration.")] Event.EventParticipactionType type,
@@ -175,6 +185,8 @@ namespace EventBot.Modules
[Command("role new")] [Command("role new")]
[Alias("role add", "role create")]
[Name("Add role")]
[Summary("Adds a new role to the event.")] [Summary("Adds a new role to the event.")]
public async Task NewEventRole( public async Task NewEventRole(
[Summary("Title of the role.")] string title, [Summary("Title of the role.")] string title,
@@ -211,7 +223,8 @@ namespace EventBot.Modules
} }
[Command("role update title")] [Command("role update title")]
[Summary("Updates the role's title")] [Name("Update role's title")]
[Summary("Updates the role's title.")]
public async Task UpdateEventRoleTitle( public async Task UpdateEventRoleTitle(
[Summary("Which role to update.")] EventRole eventRole, [Summary("Which role to update.")] EventRole eventRole,
[Summary("The new title for the role.")][Remainder] string title) [Summary("The new title for the role.")][Remainder] string title)
@@ -227,7 +240,9 @@ namespace EventBot.Modules
await _events.UpdateEventMessage(eventRole.Event); await _events.UpdateEventMessage(eventRole.Event);
} }
[Command("role update desc")] [Command("role update description")]
[Alias("role update desc")]
[Name("Update role's description")]
[Summary("Updates the role's description.")] [Summary("Updates the role's description.")]
public async Task UpdateEventRoleDescription( public async Task UpdateEventRoleDescription(
[Summary("Which role to update.")] EventRole eventRole, [Summary("Which role to update.")] EventRole eventRole,
@@ -245,6 +260,7 @@ namespace EventBot.Modules
} }
[Command("role update slots")] [Command("role update slots")]
[Name("Update role's slots")]
[Summary("Updates a role's maximum participants count.")] [Summary("Updates a role's maximum participants count.")]
public async Task UpdateEventRoleMaxParticipants( public async Task UpdateEventRoleMaxParticipants(
[Summary("Which role to update.")] EventRole eventRole, [Summary("Which role to update.")] EventRole eventRole,
@@ -263,6 +279,7 @@ namespace EventBot.Modules
[Command("role update emote")] [Command("role update emote")]
[Name("Update role's role")]
[Summary("Updates a role's emote.")] [Summary("Updates a role's emote.")]
public async Task UpdateEventRoleEmote( public async Task UpdateEventRoleEmote(
[Summary("Which role to update.")] EventRole eventRole, [Summary("Which role to update.")] EventRole eventRole,
@@ -286,6 +303,8 @@ namespace EventBot.Modules
} }
[Command()] [Command()]
[Alias("info")]
[Name("Event info")]
[Summary("Get info about event.")] [Summary("Get info about event.")]
public async Task EventInfo( public async Task EventInfo(
[Summary("Event ID of event you wish to know more of.")] Event @event = null) [Summary("Event ID of event you wish to know more of.")] Event @event = null)
@@ -316,6 +335,8 @@ namespace EventBot.Modules
} }
[Priority(1)] [Priority(1)]
[Command("role")] [Command("role")]
[Alias("role info")]
[Name("Role info")]
[Summary("Gets info about a role.")] [Summary("Gets info about a role.")]
public async Task EventRoleInfo( public async Task EventRoleInfo(
[Summary("Role you wish to have more info about.")] EventRole eventRole) [Summary("Role you wish to have more info about.")] EventRole eventRole)
@@ -339,6 +360,8 @@ namespace EventBot.Modules
} }
[Command("open")] [Command("open")]
[Alias("start", "begin")]
[Name("Open event")]
[Summary("Open registration for event here.")] [Summary("Open registration for event here.")]
public async Task EventOpen( public async Task EventOpen(
[Summary("Event to open")] Event @event = null) [Summary("Event to open")] Event @event = null)
@@ -371,6 +394,8 @@ namespace EventBot.Modules
} }
[Command("close")] [Command("close")]
[Alias("stop", "end")]
[Name("Close event")]
[Summary("Closes event registration.")] [Summary("Closes event registration.")]
public async Task EventClose( public async Task EventClose(
[Summary("Event to close")] Event @event = null) [Summary("Event to close")] Event @event = null)
@@ -391,6 +416,8 @@ namespace EventBot.Modules
} }
[Command("finalize")] [Command("finalize")]
[Alias("archive")]
[Name("Archive event")]
[Summary("Archives event and reverts all role additions. This is irreversable.")] [Summary("Archives event and reverts all role additions. This is irreversable.")]
public async Task EventFinilize( public async Task EventFinilize(
[Summary("Event to finilize")] Event @event = null) [Summary("Event to finilize")] Event @event = null)
@@ -416,6 +443,8 @@ namespace EventBot.Modules
} }
[Command("list")] [Command("list")]
[Alias("all")]
[Name("Lists events")]
[Summary("Lists all prevous events that took on this server.")] [Summary("Lists all prevous events that took on this server.")]
public async Task EventArchive() public async Task EventArchive()
{ {
@@ -448,6 +477,7 @@ namespace EventBot.Modules
} }
[Command("participant add")] [Command("participant add")]
[Name("Add participant")]
[Summary("Add user to event role. Acts like join command.")] [Summary("Add user to event role. Acts like join command.")]
public async Task EventParticipantAdd( public async Task EventParticipantAdd(
[Summary("User ID or discord mention.")] IUser user, [Summary("User ID or discord mention.")] IUser user,
@@ -476,6 +506,8 @@ namespace EventBot.Modules
} }
[Command("participant remove")] [Command("participant remove")]
[Alias("participant delete")]
[Name("Remove participant")]
[Summary("Remove participant from event role.")] [Summary("Remove participant from event role.")]
public async Task EventParticipantRemove( public async Task EventParticipantRemove(
[Summary("User that is participating's ID or discord mention.")] IUser user, [Summary("User that is participating's ID or discord mention.")] IUser user,