mirror of
https://github.com/TeamOctolings/Octobot.git
synced 2025-04-19 16:33:36 +03:00
Merge branch 'master' into 201-no-more-bots-message-in-log-channel
This commit is contained in:
commit
c947aa6b3d
23 changed files with 139 additions and 163 deletions
|
@ -1022,7 +1022,7 @@ resharper_convert_to_constant_local_highlighting = warning
|
||||||
resharper_convert_to_lambda_expression_highlighting = warning
|
resharper_convert_to_lambda_expression_highlighting = warning
|
||||||
resharper_convert_to_local_function_highlighting = warning
|
resharper_convert_to_local_function_highlighting = warning
|
||||||
resharper_convert_to_null_coalescing_compound_assignment_highlighting = warning
|
resharper_convert_to_null_coalescing_compound_assignment_highlighting = warning
|
||||||
resharper_convert_to_primary_constructor_highlighting = warning
|
resharper_convert_to_primary_constructor_highlighting = none
|
||||||
resharper_convert_to_static_class_highlighting = warning
|
resharper_convert_to_static_class_highlighting = warning
|
||||||
resharper_convert_to_using_declaration_highlighting = warning
|
resharper_convert_to_using_declaration_highlighting = warning
|
||||||
resharper_convert_type_check_pattern_to_null_check_highlighting = warning
|
resharper_convert_type_check_pattern_to_null_check_highlighting = warning
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
|
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
|
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
|
<PackageReference Include="Remora.Commands" Version="10.0.5" />
|
||||||
<PackageReference Include="Remora.Discord.Caching" Version="37.0.0" />
|
<PackageReference Include="Remora.Discord.Caching" Version="37.0.0" />
|
||||||
<PackageReference Include="Remora.Discord.Extensions" Version="5.3.2" />
|
<PackageReference Include="Remora.Discord.Extensions" Version="5.3.2" />
|
||||||
<PackageReference Include="Remora.Discord.Hosting" Version="6.0.7" />
|
<PackageReference Include="Remora.Discord.Hosting" Version="6.0.7" />
|
||||||
|
|
|
@ -24,7 +24,7 @@ Veemo! I'm a general-purpose bot for moderation (formerly known as Boyfriend) wr
|
||||||
|
|
||||||
## Running Octobot
|
## Running Octobot
|
||||||
|
|
||||||
1. Install [.NET 7 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)
|
1. Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0)
|
||||||
2. Go to the [Discord Developer Portal](https://discord.com/developers), create a new application and get a bot token. Don't forget to also enable all intents!
|
2. Go to the [Discord Developer Portal](https://discord.com/developers), create a new application and get a bot token. Don't forget to also enable all intents!
|
||||||
3. Clone this repository and open `Octobot` folder.
|
3. Clone this repository and open `Octobot` folder.
|
||||||
```
|
```
|
||||||
|
|
|
@ -99,6 +99,6 @@ public class AboutCommandGroup : CommandGroup
|
||||||
.WithImageUrl("https://cdn.mctaylors.ru/octobot-banner.png")
|
.WithImageUrl("https://cdn.mctaylors.ru/octobot-banner.png")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ public class BanCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserAlreadyBanned, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserAlreadyBanned, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var interactionResult
|
var interactionResult
|
||||||
|
@ -132,7 +132,7 @@ public class BanCommandGroup : CommandGroup
|
||||||
var errorEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
var errorEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder = new StringBuilder().AppendBulletPointLine(string.Format(Messages.DescriptionActionReason, reason));
|
var builder = new StringBuilder().AppendBulletPointLine(string.Format(Messages.DescriptionActionReason, reason));
|
||||||
|
@ -158,12 +158,7 @@ public class BanCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!dmEmbed.IsDefined(out var dmBuilt))
|
await _channelApi.CreateMessageWithEmbedResultAsync(dmChannel.ID, embedResult: dmEmbed, ct: ct);
|
||||||
{
|
|
||||||
return Result.FromError(dmEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: ct);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var banResult = await _guildApi.CreateGuildBanAsync(
|
var banResult = await _guildApi.CreateGuildBanAsync(
|
||||||
|
@ -190,7 +185,7 @@ public class BanCommandGroup : CommandGroup
|
||||||
return Result.FromError(logResult.Error);
|
return Result.FromError(logResult.Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -255,7 +250,7 @@ public class BanCommandGroup : CommandGroup
|
||||||
var errorEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserNotBanned, bot)
|
var errorEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserNotBanned, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var unbanResult = await _guildApi.RemoveGuildBanAsync(
|
var unbanResult = await _guildApi.RemoveGuildBanAsync(
|
||||||
|
@ -281,6 +276,6 @@ public class BanCommandGroup : CommandGroup
|
||||||
return Result.FromError(logResult.Error);
|
return Result.FromError(logResult.Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ public class ClearCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.NoMessagesToClear, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.NoMessagesToClear, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var title = author is not null
|
var title = author is not null
|
||||||
|
@ -146,6 +146,6 @@ public class ClearCommandGroup : CommandGroup
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(title, bot)
|
var embed = new EmbedBuilder().WithSmallTitle(title, bot)
|
||||||
.WithColour(ColorsList.Green).Build();
|
.WithColour(ColorsList.Green).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,6 @@ public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ public class KickCommandGroup : CommandGroup
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, CancellationToken);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: CancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await KickUserAsync(executor, target, reason, guild, channelId, data, bot, CancellationToken);
|
return await KickUserAsync(executor, target, reason, guild, channelId, data, bot, CancellationToken);
|
||||||
|
@ -126,7 +126,7 @@ public class KickCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var dmChannelResult = await _userApi.CreateDMAsync(target.ID, ct);
|
var dmChannelResult = await _userApi.CreateDMAsync(target.ID, ct);
|
||||||
|
@ -140,12 +140,7 @@ public class KickCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!dmEmbed.IsDefined(out var dmBuilt))
|
await _channelApi.CreateMessageWithEmbedResultAsync(dmChannel.ID, embedResult: dmEmbed, ct: ct);
|
||||||
{
|
|
||||||
return Result.FromError(dmEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: ct);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var kickResult = await _guildApi.RemoveGuildMemberAsync(
|
var kickResult = await _guildApi.RemoveGuildMemberAsync(
|
||||||
|
@ -171,6 +166,6 @@ public class KickCommandGroup : CommandGroup
|
||||||
string.Format(Messages.UserKicked, target.GetTag()), target)
|
string.Format(Messages.UserKicked, target.GetTag()), target)
|
||||||
.WithColour(ColorsList.Green).Build();
|
.WithColour(ColorsList.Green).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, CancellationToken);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: CancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await MuteUserAsync(executor, target, reason, duration, guildId, data, channelId, bot, CancellationToken);
|
return await MuteUserAsync(executor, target, reason, duration, guildId, data, channelId, bot, CancellationToken);
|
||||||
|
@ -124,7 +124,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var until = DateTimeOffset.UtcNow.Add(duration); // >:)
|
var until = DateTimeOffset.UtcNow.Add(duration); // >:)
|
||||||
|
@ -151,7 +151,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
string.Format(Messages.UserMuted, target.GetTag()), target)
|
string.Format(Messages.UserMuted, target.GetTag()), target)
|
||||||
.WithColour(ColorsList.Green).Build();
|
.WithColour(ColorsList.Green).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Result> SelectMuteMethodAsync(
|
private async Task<Result> SelectMuteMethodAsync(
|
||||||
|
@ -202,7 +202,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
.WithDescription(Messages.DurationRequiredForTimeOuts)
|
.WithDescription(Messages.DurationRequiredForTimeOuts)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var muteResult = await _guildApi.ModifyGuildMemberAsync(
|
var muteResult = await _guildApi.ModifyGuildMemberAsync(
|
||||||
|
@ -266,7 +266,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, CancellationToken);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: CancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await RemoveMuteAsync(executor, target, reason, guildId, data, channelId, bot, CancellationToken);
|
return await RemoveMuteAsync(executor, target, reason, guildId, data, channelId, bot, CancellationToken);
|
||||||
|
@ -289,7 +289,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var guildMemberResult = await _guildApi.GetGuildMemberAsync(guildId, target.ID, ct);
|
var guildMemberResult = await _guildApi.GetGuildMemberAsync(guildId, target.ID, ct);
|
||||||
|
@ -307,7 +307,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserNotMuted, bot)
|
var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserNotMuted, bot)
|
||||||
.WithColour(ColorsList.Red).Build();
|
.WithColour(ColorsList.Red).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var removeMuteRoleAsync =
|
var removeMuteRoleAsync =
|
||||||
|
@ -337,7 +337,7 @@ public class MuteCommandGroup : CommandGroup
|
||||||
string.Format(Messages.UserUnmuted, target.GetTag()), target)
|
string.Format(Messages.UserUnmuted, target.GetTag()), target)
|
||||||
.WithColour(ColorsList.Green).Build();
|
.WithColour(ColorsList.Green).Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Result> RemoveMuteRoleAsync(
|
private async Task<Result> RemoveMuteRoleAsync(
|
||||||
|
|
|
@ -97,6 +97,6 @@ public class PingCommandGroup : CommandGroup
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,19 +26,21 @@ namespace Octobot.Commands;
|
||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
public class RemindCommandGroup : CommandGroup
|
public class RemindCommandGroup : CommandGroup
|
||||||
{
|
{
|
||||||
private readonly ICommandContext _context;
|
private readonly IInteractionCommandContext _context;
|
||||||
private readonly IFeedbackService _feedback;
|
private readonly IFeedbackService _feedback;
|
||||||
private readonly GuildDataService _guildData;
|
private readonly GuildDataService _guildData;
|
||||||
private readonly IDiscordRestUserAPI _userApi;
|
private readonly IDiscordRestUserAPI _userApi;
|
||||||
|
private readonly IDiscordRestInteractionAPI _interactionApi;
|
||||||
|
|
||||||
public RemindCommandGroup(
|
public RemindCommandGroup(
|
||||||
ICommandContext context, GuildDataService guildData, IFeedbackService feedback,
|
IInteractionCommandContext context, GuildDataService guildData, IFeedbackService feedback,
|
||||||
IDiscordRestUserAPI userApi)
|
IDiscordRestUserAPI userApi, IDiscordRestInteractionAPI interactionApi)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
_guildData = guildData;
|
_guildData = guildData;
|
||||||
_feedback = feedback;
|
_feedback = feedback;
|
||||||
_userApi = userApi;
|
_userApi = userApi;
|
||||||
|
_interactionApi = interactionApi;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -72,10 +74,10 @@ public class RemindCommandGroup : CommandGroup
|
||||||
var data = await _guildData.GetData(guildId, CancellationToken);
|
var data = await _guildData.GetData(guildId, CancellationToken);
|
||||||
Messages.Culture = GuildSettings.Language.Get(data.Settings);
|
Messages.Culture = GuildSettings.Language.Get(data.Settings);
|
||||||
|
|
||||||
return await ListRemindersAsync(data.GetOrCreateMemberData(executorId), executor, bot, CancellationToken);
|
return await ListRemindersAsync(data.GetOrCreateMemberData(executorId), guildId, executor, bot, CancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task<Result> ListRemindersAsync(MemberData data, IUser executor, IUser bot, CancellationToken ct)
|
private Task<Result> ListRemindersAsync(MemberData data, Snowflake guildId, IUser executor, IUser bot, CancellationToken ct)
|
||||||
{
|
{
|
||||||
if (data.Reminders.Count == 0)
|
if (data.Reminders.Count == 0)
|
||||||
{
|
{
|
||||||
|
@ -83,7 +85,7 @@ public class RemindCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
|
@ -92,7 +94,8 @@ public class RemindCommandGroup : CommandGroup
|
||||||
var reminder = data.Reminders[i];
|
var reminder = data.Reminders[i];
|
||||||
builder.AppendBulletPointLine(string.Format(Messages.ReminderPosition, Markdown.InlineCode((i + 1).ToString())))
|
builder.AppendBulletPointLine(string.Format(Messages.ReminderPosition, Markdown.InlineCode((i + 1).ToString())))
|
||||||
.AppendSubBulletPointLine(string.Format(Messages.ReminderText, Markdown.InlineCode(reminder.Text)))
|
.AppendSubBulletPointLine(string.Format(Messages.ReminderText, Markdown.InlineCode(reminder.Text)))
|
||||||
.AppendSubBulletPointLine(string.Format(Messages.ReminderTime, Markdown.Timestamp(reminder.At)));
|
.AppendSubBulletPointLine(string.Format(Messages.ReminderTime, Markdown.Timestamp(reminder.At)))
|
||||||
|
.AppendSubBulletPointLine(string.Format(Messages.DescriptionActionJumpToMessage, $"https://discord.com/channels/{guildId.Value}/{reminder.ChannelId}/{reminder.MessageId}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(
|
var embed = new EmbedBuilder().WithSmallTitle(
|
||||||
|
@ -101,8 +104,7 @@ public class RemindCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Cyan)
|
.WithColour(ColorsList.Cyan)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
embed, ct);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -139,25 +141,29 @@ public class RemindCommandGroup : CommandGroup
|
||||||
return await AddReminderAsync(@in, text, data, channelId, executor, CancellationToken);
|
return await AddReminderAsync(@in, text, data, channelId, executor, CancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task<Result> AddReminderAsync(
|
private async Task<Result> AddReminderAsync(TimeSpan @in, string text, GuildData data,
|
||||||
TimeSpan @in, string text, GuildData data,
|
|
||||||
Snowflake channelId, IUser executor, CancellationToken ct = default)
|
Snowflake channelId, IUser executor, CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
var remindAt = DateTimeOffset.UtcNow.Add(@in);
|
|
||||||
var memberData = data.GetOrCreateMemberData(executor.ID);
|
var memberData = data.GetOrCreateMemberData(executor.ID);
|
||||||
|
var remindAt = DateTimeOffset.UtcNow.Add(@in);
|
||||||
|
var responseResult = await _interactionApi.GetOriginalInteractionResponseAsync(_context.Interaction.ApplicationID, _context.Interaction.Token, ct);
|
||||||
|
if (!responseResult.IsDefined(out var response))
|
||||||
|
{
|
||||||
|
return (Result)responseResult;
|
||||||
|
}
|
||||||
|
|
||||||
memberData.Reminders.Add(
|
memberData.Reminders.Add(
|
||||||
new Reminder
|
new Reminder
|
||||||
{
|
{
|
||||||
At = remindAt,
|
At = remindAt,
|
||||||
Channel = channelId.Value,
|
ChannelId = channelId.Value,
|
||||||
Text = text
|
Text = text,
|
||||||
|
MessageId = response.ID.Value
|
||||||
});
|
});
|
||||||
|
|
||||||
var builder = new StringBuilder().AppendBulletPointLine(string.Format(
|
var builder = new StringBuilder()
|
||||||
Messages.ReminderText, Markdown.InlineCode(text)))
|
.AppendBulletPointLine(string.Format(Messages.ReminderText, Markdown.InlineCode(text)))
|
||||||
.AppendBulletPoint(string.Format(Messages.ReminderTime, Markdown.Timestamp(remindAt)));
|
.AppendBulletPoint(string.Format(Messages.ReminderTime, Markdown.Timestamp(remindAt)));
|
||||||
|
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(
|
var embed = new EmbedBuilder().WithSmallTitle(
|
||||||
string.Format(Messages.ReminderCreated, executor.GetTag()), executor)
|
string.Format(Messages.ReminderCreated, executor.GetTag()), executor)
|
||||||
.WithDescription(builder.ToString())
|
.WithDescription(builder.ToString())
|
||||||
|
@ -165,7 +171,7 @@ public class RemindCommandGroup : CommandGroup
|
||||||
.WithFooter(string.Format(Messages.ReminderPosition, memberData.Reminders.Count))
|
.WithFooter(string.Format(Messages.ReminderPosition, memberData.Reminders.Count))
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -208,7 +214,7 @@ public class RemindCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var reminder = data.Reminders[index];
|
var reminder = data.Reminders[index];
|
||||||
|
@ -224,7 +230,6 @@ public class RemindCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Green)
|
.WithColour(ColorsList.Green)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
embed, ct);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(errorEmbed, ct);
|
return _feedback.SendContextualEmbedResultAsync(errorEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
footer.Append($"{Messages.Page} {page}/{totalPages} ");
|
footer.Append($"{Messages.Page} {page}/{totalPages} ");
|
||||||
|
@ -149,7 +149,7 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithFooter(footer.ToString())
|
.WithFooter(footer.ToString())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -207,7 +207,7 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
|
@ -230,7 +230,7 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Green)
|
.WithColour(ColorsList.Green)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -284,7 +284,7 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Green)
|
.WithColour(ColorsList.Green)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Result> ResetAllSettingsAsync(JsonNode cfg, IUser bot,
|
private async Task<Result> ResetAllSettingsAsync(JsonNode cfg, IUser bot,
|
||||||
|
@ -305,6 +305,6 @@ public class SettingsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Green)
|
.WithColour(ColorsList.Green)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,7 +163,7 @@ public class ToolsCommandGroup : CommandGroup
|
||||||
.WithFooter($"ID: {target.ID.ToString()}")
|
.WithFooter($"ID: {target.ID.ToString()}")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return await _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Color AppendGuildInformation(Color color, IGuildMember guildMember, StringBuilder builder)
|
private static Color AppendGuildInformation(Color color, IGuildMember guildMember, StringBuilder builder)
|
||||||
|
@ -312,7 +312,7 @@ public class ToolsCommandGroup : CommandGroup
|
||||||
.WithFooter($"ID: {guild.ID.ToString()}")
|
.WithFooter($"ID: {guild.ID.ToString()}")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -389,7 +389,7 @@ public class ToolsCommandGroup : CommandGroup
|
||||||
.WithColour(embedColor)
|
.WithColour(embedColor)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly TimestampStyle[] AllStyles =
|
private static readonly TimestampStyle[] AllStyles =
|
||||||
|
@ -459,6 +459,6 @@ public class ToolsCommandGroup : CommandGroup
|
||||||
.WithColour(ColorsList.Blue)
|
.WithColour(ColorsList.Blue)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
return _feedback.SendContextualEmbedResultAsync(embed, ct);
|
return _feedback.SendContextualEmbedResultAsync(embed, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,5 +4,6 @@ public struct Reminder
|
||||||
{
|
{
|
||||||
public DateTimeOffset At { get; init; }
|
public DateTimeOffset At { get; init; }
|
||||||
public string Text { get; init; }
|
public string Text { get; init; }
|
||||||
public ulong Channel { get; init; }
|
public ulong ChannelId { get; init; }
|
||||||
|
public ulong MessageId { get; init; }
|
||||||
}
|
}
|
||||||
|
|
29
src/Extensions/ChannelApiExtensions.cs
Normal file
29
src/Extensions/ChannelApiExtensions.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
using OneOf;
|
||||||
|
using Remora.Discord.API.Abstractions.Objects;
|
||||||
|
using Remora.Discord.API.Abstractions.Rest;
|
||||||
|
using Remora.Discord.API.Objects;
|
||||||
|
using Remora.Rest.Core;
|
||||||
|
using Remora.Results;
|
||||||
|
|
||||||
|
namespace Octobot.Extensions;
|
||||||
|
|
||||||
|
public static class ChannelApiExtensions
|
||||||
|
{
|
||||||
|
public static async Task<Result> CreateMessageWithEmbedResultAsync(this IDiscordRestChannelAPI channelApi,
|
||||||
|
Snowflake channelId, Optional<string> message = default, Optional<string> nonce = default,
|
||||||
|
Optional<bool> isTextToSpeech = default, Optional<Result<Embed>> embedResult = default,
|
||||||
|
Optional<IAllowedMentions> allowedMentions = default, Optional<IMessageReference> messageRefenence = default,
|
||||||
|
Optional<IReadOnlyList<IMessageComponent>> components = default,
|
||||||
|
Optional<IReadOnlyList<Snowflake>> stickerIds = default,
|
||||||
|
Optional<IReadOnlyList<OneOf<FileData, IPartialAttachment>>> attachments = default,
|
||||||
|
Optional<MessageFlags> flags = default, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
if (!embedResult.IsDefined() || !embedResult.Value.IsDefined(out var embed))
|
||||||
|
{
|
||||||
|
return Result.FromError(embedResult.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Result)await channelApi.CreateMessageAsync(channelId, message, nonce, isTextToSpeech, new[] { embed },
|
||||||
|
allowedMentions, messageRefenence, components, stickerIds, attachments, flags, ct);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using Remora.Discord.API.Objects;
|
using Remora.Discord.API.Objects;
|
||||||
|
using Remora.Discord.Commands.Feedback.Messages;
|
||||||
using Remora.Discord.Commands.Feedback.Services;
|
using Remora.Discord.Commands.Feedback.Services;
|
||||||
using Remora.Results;
|
using Remora.Results;
|
||||||
|
|
||||||
|
@ -7,13 +8,14 @@ namespace Octobot.Extensions;
|
||||||
public static class FeedbackServiceExtensions
|
public static class FeedbackServiceExtensions
|
||||||
{
|
{
|
||||||
public static async Task<Result> SendContextualEmbedResultAsync(
|
public static async Task<Result> SendContextualEmbedResultAsync(
|
||||||
this IFeedbackService feedback, Result<Embed> embedResult, CancellationToken ct = default)
|
this IFeedbackService feedback, Result<Embed> embedResult,
|
||||||
|
FeedbackMessageOptions? options = null, CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
if (!embedResult.IsDefined(out var embed))
|
if (!embedResult.IsDefined(out var embed))
|
||||||
{
|
{
|
||||||
return Result.FromError(embedResult);
|
return Result.FromError(embedResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (Result)await feedback.SendContextualEmbedAsync(embed, ct: ct);
|
return (Result)await feedback.SendContextualEmbedAsync(embed, options, ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,17 +92,19 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.WithColour(ColorsList.Blue)
|
.WithColour(ColorsList.Blue)
|
||||||
.Build();
|
.Build();
|
||||||
if (!embed.IsDefined(out var built))
|
|
||||||
{
|
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built }, ct: ct);
|
GuildSettings.PrivateFeedbackChannel.Get(cfg), embedResult: embed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Result> SendDataLoadFailed(IGuild guild, GuildData data, IUser bot, CancellationToken ct)
|
private async Task<Result> SendDataLoadFailed(IGuild guild, GuildData data, IUser bot, CancellationToken ct)
|
||||||
{
|
{
|
||||||
|
var channelResult = await _utility.GetEmergencyFeedbackChannel(guild, data, ct);
|
||||||
|
if (!channelResult.IsDefined(out var channel))
|
||||||
|
{
|
||||||
|
return Result.FromError(channelResult);
|
||||||
|
}
|
||||||
|
|
||||||
var errorEmbed = new EmbedBuilder()
|
var errorEmbed = new EmbedBuilder()
|
||||||
.WithSmallTitle(Messages.DataLoadFailedTitle, bot)
|
.WithSmallTitle(Messages.DataLoadFailedTitle, bot)
|
||||||
.WithDescription(Messages.DataLoadFailedDescription)
|
.WithDescription(Messages.DataLoadFailedDescription)
|
||||||
|
@ -110,18 +112,7 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!errorEmbed.IsDefined(out var errorBuilt))
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
channel, embedResult: errorEmbed, ct: ct);
|
||||||
return Result.FromError(errorEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var channelResult = await _utility.GetEmergencyFeedbackChannel(guild, data, ct);
|
|
||||||
if (!channelResult.IsDefined(out var channel))
|
|
||||||
{
|
|
||||||
return Result.FromError(channelResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
|
||||||
channel, embeds: new[] { errorBuilt }, ct: ct);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,13 +72,9 @@ public class GuildMemberJoinedResponder : IResponder<IGuildMemberAdd>
|
||||||
.WithTimestamp(gatewayEvent.JoinedAt)
|
.WithTimestamp(gatewayEvent.JoinedAt)
|
||||||
.WithColour(ColorsList.Green)
|
.WithColour(ColorsList.Green)
|
||||||
.Build();
|
.Build();
|
||||||
if (!embed.IsDefined(out var built))
|
|
||||||
{
|
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
GuildSettings.PublicFeedbackChannel.Get(cfg), embeds: new[] { built },
|
GuildSettings.PublicFeedbackChannel.Get(cfg), embedResult: embed,
|
||||||
allowedMentions: Octobot.NoMentions, ct: ct);
|
allowedMentions: Octobot.NoMentions, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,13 +98,9 @@ public class MessageDeletedResponder : IResponder<IMessageDelete>
|
||||||
.WithTimestamp(message.Timestamp)
|
.WithTimestamp(message.Timestamp)
|
||||||
.WithColour(ColorsList.Red)
|
.WithColour(ColorsList.Red)
|
||||||
.Build();
|
.Build();
|
||||||
if (!embed.IsDefined(out var built))
|
|
||||||
{
|
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built },
|
GuildSettings.PrivateFeedbackChannel.Get(cfg), embedResult: embed,
|
||||||
allowedMentions: Octobot.NoMentions, ct: ct);
|
allowedMentions: Octobot.NoMentions, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,13 +112,9 @@ public class MessageEditedResponder : IResponder<IMessageUpdate>
|
||||||
.WithTimestamp(timestamp.Value)
|
.WithTimestamp(timestamp.Value)
|
||||||
.WithColour(ColorsList.Yellow)
|
.WithColour(ColorsList.Yellow)
|
||||||
.Build();
|
.Build();
|
||||||
if (!embed.IsDefined(out var built))
|
|
||||||
{
|
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built },
|
GuildSettings.PrivateFeedbackChannel.Get(cfg), embedResult: embed,
|
||||||
allowedMentions: Octobot.NoMentions, ct: ct);
|
allowedMentions: Octobot.NoMentions, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
@ -114,7 +115,7 @@ public sealed partial class MemberUpdateService : BackgroundService
|
||||||
|
|
||||||
for (var i = data.Reminders.Count - 1; i >= 0; i--)
|
for (var i = data.Reminders.Count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
var reminderTickResult = await TickReminderAsync(data.Reminders[i], user, data, ct);
|
var reminderTickResult = await TickReminderAsync(data.Reminders[i], user, data, guildId, ct);
|
||||||
failedResults.AddIfFailed(reminderTickResult);
|
failedResults.AddIfFailed(reminderTickResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,30 +218,29 @@ public sealed partial class MemberUpdateService : BackgroundService
|
||||||
[GeneratedRegex("[^0-9A-Za-zА-Яа-яЁё]")]
|
[GeneratedRegex("[^0-9A-Za-zА-Яа-яЁё]")]
|
||||||
private static partial Regex IllegalChars();
|
private static partial Regex IllegalChars();
|
||||||
|
|
||||||
private async Task<Result> TickReminderAsync(Reminder reminder, IUser user, MemberData data, CancellationToken ct)
|
private async Task<Result> TickReminderAsync(Reminder reminder, IUser user, MemberData data, Snowflake guildId,
|
||||||
|
CancellationToken ct)
|
||||||
{
|
{
|
||||||
if (DateTimeOffset.UtcNow < reminder.At)
|
if (DateTimeOffset.UtcNow < reminder.At)
|
||||||
{
|
{
|
||||||
return Result.FromSuccess();
|
return Result.FromSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var builder = new StringBuilder()
|
||||||
|
.AppendBulletPointLine(string.Format(Messages.DescriptionReminder, Markdown.InlineCode(reminder.Text)))
|
||||||
|
.AppendBulletPointLine(string.Format(Messages.DescriptionActionJumpToMessage, $"https://discord.com/channels/{guildId.Value}/{reminder.ChannelId}/{reminder.MessageId}"));
|
||||||
|
|
||||||
var embed = new EmbedBuilder().WithSmallTitle(
|
var embed = new EmbedBuilder().WithSmallTitle(
|
||||||
string.Format(Messages.Reminder, user.GetTag()), user)
|
string.Format(Messages.Reminder, user.GetTag()), user)
|
||||||
.WithDescription(
|
.WithDescription(builder.ToString())
|
||||||
string.Format(Messages.DescriptionReminder, Markdown.InlineCode(reminder.Text)))
|
|
||||||
.WithColour(ColorsList.Magenta)
|
.WithColour(ColorsList.Magenta)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!embed.IsDefined(out var built))
|
var messageResult = await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
reminder.ChannelId.ToSnowflake(), Mention.User(user), embedResult: embed, ct: ct);
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var messageResult = await _channelApi.CreateMessageAsync(
|
|
||||||
reminder.Channel.ToSnowflake(), Mention.User(user), embeds: new[] { built }, ct: ct);
|
|
||||||
if (!messageResult.IsSuccess)
|
if (!messageResult.IsSuccess)
|
||||||
{
|
{
|
||||||
return Result.FromError(messageResult);
|
return messageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
data.Reminders.Remove(reminder);
|
data.Reminders.Remove(reminder);
|
||||||
|
|
|
@ -215,10 +215,6 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.WithColour(ColorsList.White)
|
.WithColour(ColorsList.White)
|
||||||
.Build();
|
.Build();
|
||||||
if (!embed.IsDefined(out var built))
|
|
||||||
{
|
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var roleMention = !GuildSettings.EventNotificationRole.Get(settings).Empty()
|
var roleMention = !GuildSettings.EventNotificationRole.Get(settings).Empty()
|
||||||
? Mention.Role(GuildSettings.EventNotificationRole.Get(settings))
|
? Mention.Role(GuildSettings.EventNotificationRole.Get(settings))
|
||||||
|
@ -231,8 +227,8 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
URL: $"https://discord.com/events/{scheduledEvent.GuildID}/{scheduledEvent.ID}"
|
URL: $"https://discord.com/events/{scheduledEvent.GuildID}/{scheduledEvent.ID}"
|
||||||
);
|
);
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
GuildSettings.EventNotificationChannel.Get(settings), roleMention, embeds: new[] { built },
|
GuildSettings.EventNotificationChannel.Get(settings), roleMention, embedResult: embed,
|
||||||
components: new[] { new ActionRowComponent(new[] { button }) }, ct: ct);
|
components: new[] { new ActionRowComponent(new[] { button }) }, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,14 +313,9 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!startedEmbed.IsDefined(out var startedBuilt))
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
|
||||||
return Result.FromError(startedEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
|
||||||
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
||||||
content, embeds: new[] { startedBuilt }, ct: ct);
|
content, embedResult: startedEmbed, ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Result> SendScheduledEventCompletedMessage(ScheduledEventData eventData, GuildData data,
|
private async Task<Result> SendScheduledEventCompletedMessage(ScheduledEventData eventData, GuildData data,
|
||||||
|
@ -348,14 +339,9 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!completedEmbed.IsDefined(out var completedBuilt))
|
var createResult = await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
|
||||||
return Result.FromError(completedEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var createResult = (Result)await _channelApi.CreateMessageAsync(
|
|
||||||
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
||||||
embeds: new[] { completedBuilt }, ct: ct);
|
embedResult: completedEmbed, ct: ct);
|
||||||
if (createResult.IsSuccess)
|
if (createResult.IsSuccess)
|
||||||
{
|
{
|
||||||
data.ScheduledEvents.Remove(eventData.Id);
|
data.ScheduledEvents.Remove(eventData.Id);
|
||||||
|
@ -380,13 +366,8 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
.WithCurrentTimestamp()
|
.WithCurrentTimestamp()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!embed.IsDefined(out var built))
|
var createResult = await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
GuildSettings.EventNotificationChannel.Get(data.Settings), embedResult: embed, ct: ct);
|
||||||
return Result.FromError(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var createResult = (Result)await _channelApi.CreateMessageAsync(
|
|
||||||
GuildSettings.EventNotificationChannel.Get(data.Settings), embeds: new[] { built }, ct: ct);
|
|
||||||
if (createResult.IsSuccess)
|
if (createResult.IsSuccess)
|
||||||
{
|
{
|
||||||
data.ScheduledEvents.Remove(eventData.Id);
|
data.ScheduledEvents.Remove(eventData.Id);
|
||||||
|
@ -445,14 +426,9 @@ public sealed class ScheduledEventUpdateService : BackgroundService
|
||||||
.WithColour(ColorsList.Default)
|
.WithColour(ColorsList.Default)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!earlyResult.IsDefined(out var earlyBuilt))
|
return await _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
{
|
|
||||||
return Result.FromError(earlyResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Result)await _channelApi.CreateMessageAsync(
|
|
||||||
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
GuildSettings.EventNotificationChannel.Get(data.Settings),
|
||||||
content,
|
content,
|
||||||
embeds: new[] { earlyBuilt }, ct: ct);
|
embedResult: earlyResult, ct: ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,26 +226,19 @@ public sealed class UtilityService : IHostedService
|
||||||
.WithColour(color)
|
.WithColour(color)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
if (!logEmbed.IsDefined(out var logBuilt))
|
|
||||||
{
|
|
||||||
return Result.FromError(logEmbed);
|
|
||||||
}
|
|
||||||
|
|
||||||
var builtArray = new[] { logBuilt };
|
|
||||||
|
|
||||||
// Not awaiting to reduce response time
|
// Not awaiting to reduce response time
|
||||||
if (isPublic && publicChannel != channelId)
|
if (isPublic && publicChannel != channelId)
|
||||||
{
|
{
|
||||||
_ = _channelApi.CreateMessageAsync(
|
_ = _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
publicChannel, embeds: builtArray,
|
publicChannel, embedResult: logEmbed,
|
||||||
ct: ct);
|
ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (privateChannel != publicChannel
|
if (privateChannel != publicChannel
|
||||||
&& privateChannel != channelId)
|
&& privateChannel != channelId)
|
||||||
{
|
{
|
||||||
_ = _channelApi.CreateMessageAsync(
|
_ = _channelApi.CreateMessageWithEmbedResultAsync(
|
||||||
privateChannel, embeds: builtArray,
|
privateChannel, embedResult: logEmbed,
|
||||||
ct: ct);
|
ct: ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue