using Discord; using System.Diagnostics; namespace RegexBot.Modules.ModCommands.Commands; [DebuggerDisplay("Command definition '{Label}'")] abstract class CommandConfig(ModCommands module, JObject config) { public string Label { get; } = config[nameof(Label)]!.Value()!; public string Command { get; } = config[nameof(Command)]!.Value()!; protected ModCommands Module { get; } = module; public abstract Task Invoke(SocketGuild g, SocketMessage msg); protected const string FailDefault = "An unknown error occurred. Notify the bot operator."; protected const string TargetNotFound = ":x: **Unable to find the given user.**"; protected abstract string DefaultUsageMsg { get; } /// /// Sends out the default usage message () within an embed. /// An optional message can be included, for uses such as notifying users of incorrect usage. /// /// Target channel for sending the message. /// The message to send alongside the default usage message. protected async Task SendUsageMessageAsync(ISocketMessageChannel target, string? message = null) { if (DefaultUsageMsg == null) throw new InvalidOperationException("DefaultUsage was not defined."); var usageEmbed = new EmbedBuilder() { Title = "Usage", Description = DefaultUsageMsg }; await target.SendMessageAsync(message ?? "", embed: usageEmbed.Build()); } internal static readonly char[] separator = [' ']; /// /// For the given message's content, assumes its message is a command and returns its parameters /// as an array of substrings. /// /// The incoming message to process. /// The number of parameters to expect. /// A string array with 0 to maxParams - 1 elements. protected static string[] SplitToParams(SocketMessage msg, int maxParams) => msg.Content.Split(separator, maxParams, StringSplitOptions.RemoveEmptyEntries); }