mirror of
https://github.com/TeamOctolings/Octobot.git
synced 2025-04-20 00:43:36 +03:00
This PR does numerous things to reduce method complexity: - Created an extension method `FeedbackService#SendContextualEmbedResultAsync`, which directly takes a `Result<Embed>` and checks it once in the extension method instead of multiple times in all commands; - Split the command methods for `/ban` and `/unban` into 2 parts: `Execute(Un)Ban` and `(Un)BanUserAsync`. The former will check all the needed results and will pass the outputs into the latter; - Extracted the method for logging an action into Private- and PublicFeedbackChannels. It now resides in UtilityService. Right now, only `/ban` and `/unban` make use of that method; - Created an extension method `Snowflake#EmptyOrEqualTo`, that combines the task of checking if a Snowflake is empty and checking if that Snowflake is equal to another Snowflake. Similar changes will be made to other command groups in future PRs. This is not done here to make the reviewing process easier. Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
78 lines
3.1 KiB
C#
78 lines
3.1 KiB
C#
using System.ComponentModel;
|
|
using System.Text;
|
|
using Boyfriend.Data;
|
|
using Boyfriend.Services;
|
|
using JetBrains.Annotations;
|
|
using Remora.Commands.Attributes;
|
|
using Remora.Commands.Groups;
|
|
using Remora.Discord.API.Abstractions.Rest;
|
|
using Remora.Discord.Commands.Attributes;
|
|
using Remora.Discord.Commands.Conditions;
|
|
using Remora.Discord.Commands.Contexts;
|
|
using Remora.Discord.Commands.Feedback.Services;
|
|
using Remora.Discord.Extensions.Embeds;
|
|
using Remora.Discord.Extensions.Formatting;
|
|
using Remora.Results;
|
|
|
|
namespace Boyfriend.Commands;
|
|
|
|
/// <summary>
|
|
/// Handles the command to show information about this bot: /about.
|
|
/// </summary>
|
|
[UsedImplicitly]
|
|
public class AboutCommandGroup : CommandGroup {
|
|
private static readonly string[] Developers = { "Octol1ttle", "mctaylors", "neroduckale" };
|
|
private readonly ICommandContext _context;
|
|
private readonly GuildDataService _dataService;
|
|
private readonly FeedbackService _feedbackService;
|
|
private readonly IDiscordRestUserAPI _userApi;
|
|
|
|
public AboutCommandGroup(
|
|
ICommandContext context, GuildDataService dataService,
|
|
FeedbackService feedbackService, IDiscordRestUserAPI userApi) {
|
|
_context = context;
|
|
_dataService = dataService;
|
|
_feedbackService = feedbackService;
|
|
_userApi = userApi;
|
|
}
|
|
|
|
/// <summary>
|
|
/// A slash command that shows information about this bot.
|
|
/// </summary>
|
|
/// <returns>
|
|
/// A feedback sending result which may or may not have succeeded.
|
|
/// </returns>
|
|
[Command("about")]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[RequireContext(ChannelContext.Guild)]
|
|
[Description("Shows Boyfriend's developers")]
|
|
[UsedImplicitly]
|
|
public async Task<Result> SendAboutBotAsync() {
|
|
if (!_context.TryGetContextIDs(out var guildId, out _, out _))
|
|
return Result.FromError(
|
|
new ArgumentNullError(nameof(_context), "Unable to retrieve necessary IDs from command context"));
|
|
|
|
var currentUserResult = await _userApi.GetCurrentUserAsync(CancellationToken);
|
|
if (!currentUserResult.IsDefined(out var currentUser))
|
|
return Result.FromError(currentUserResult);
|
|
|
|
var cfg = await _dataService.GetSettings(guildId.Value, CancellationToken);
|
|
Messages.Culture = GuildSettings.Language.Get(cfg);
|
|
|
|
var builder = new StringBuilder().AppendLine(Markdown.Bold(Messages.AboutTitleDevelopers));
|
|
foreach (var dev in Developers)
|
|
builder.AppendLine($"@{dev} — {$"AboutDeveloper@{dev}".Localized()}");
|
|
|
|
builder.AppendLine()
|
|
.AppendLine(Markdown.Bold(Messages.AboutTitleWiki))
|
|
.AppendLine("https://github.com/TeamOctolings/Boyfriend/wiki");
|
|
|
|
var embed = new EmbedBuilder().WithSmallTitle(Messages.AboutBot, currentUser)
|
|
.WithDescription(builder.ToString())
|
|
.WithColour(ColorsList.Cyan)
|
|
.WithImageUrl("https://cdn.upload.systems/uploads/JFAaX5vr.png")
|
|
.Build();
|
|
|
|
return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken);
|
|
}
|
|
}
|