Read ME update Updating tile of role will update revelant channels and roles. Added command examples. Fixese leaks
158 lines
6.8 KiB
C#
158 lines
6.8 KiB
C#
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<SocketCommandContext>
|
|
{
|
|
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<SocketCommandContext>
|
|
{
|
|
|
|
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 / 15)
|
|
.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._" : "")}" ))
|
|
);
|
|
var examples = command.Attributes.Where(a => a is ExampleAttribute).Select(a => ((ExampleAttribute)a).Use).ToArray();
|
|
if (examples.Length != 0)
|
|
embed.AddField("Examples", $"```{string.Join("\r\n", examples)}```");
|
|
|
|
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`");
|
|
}
|
|
}
|
|
}
|
|
}
|