feat(discord): add DiscordPlatformMessenger IPlatformMessenger implementation
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,71 @@
|
|||||||
|
using GmRelay.DiscordBot.Rendering;
|
||||||
|
using GmRelay.Shared.Platform;
|
||||||
|
using GmRelay.Shared.Rendering;
|
||||||
|
using NetCord;
|
||||||
|
using NetCord.Rest;
|
||||||
|
|
||||||
|
namespace GmRelay.DiscordBot.Infrastructure.Discord;
|
||||||
|
|
||||||
|
public sealed class DiscordPlatformMessenger(RestClient restClient) : IPlatformMessenger
|
||||||
|
{
|
||||||
|
public async Task<PlatformMessageRef> SendScheduleAsync(PlatformScheduleMessage message, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var (embeds, actionRows) = DiscordSessionBatchRenderer.Render(message.View);
|
||||||
|
|
||||||
|
var channelId = ulong.Parse(message.Group.ExternalChannelId
|
||||||
|
?? message.Group.ExternalGroupId);
|
||||||
|
|
||||||
|
var msg = await restClient.SendMessageAsync(
|
||||||
|
channelId,
|
||||||
|
new MessageProperties()
|
||||||
|
.WithEmbeds(embeds)
|
||||||
|
.WithComponents(actionRows));
|
||||||
|
|
||||||
|
return new PlatformMessageRef(
|
||||||
|
PlatformKind.Discord,
|
||||||
|
message.Group.ExternalGroupId,
|
||||||
|
null,
|
||||||
|
msg.Id.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateScheduleAsync(PlatformScheduleMessage message, CancellationToken ct)
|
||||||
|
{
|
||||||
|
if (message.ExistingMessage is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var (embeds, actionRows) = DiscordSessionBatchRenderer.Render(message.View);
|
||||||
|
|
||||||
|
var channelId = ulong.Parse(message.Group.ExternalChannelId
|
||||||
|
?? message.Group.ExternalGroupId);
|
||||||
|
var messageId = ulong.Parse(message.ExistingMessage.ExternalMessageId);
|
||||||
|
|
||||||
|
await restClient.ModifyMessageAsync(
|
||||||
|
channelId,
|
||||||
|
messageId,
|
||||||
|
options =>
|
||||||
|
{
|
||||||
|
options.Embeds = embeds;
|
||||||
|
options.Components = actionRows;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SendGroupMessageAsync(PlatformGroup group, string htmlText, CancellationToken ct)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SendPrivateMessageAsync(PlatformPrivateMessage message, CancellationToken ct)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task AnswerInteractionAsync(PlatformInteractionReply reply, CancellationToken ct)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SendCalendarFileAsync(PlatformCalendarFile file, CancellationToken ct)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using GmRelay.DiscordBot.Infrastructure.Discord;
|
||||||
|
using GmRelay.Shared.Platform;
|
||||||
|
using GmRelay.Shared.Rendering;
|
||||||
|
|
||||||
|
namespace GmRelay.Bot.Tests.Discord;
|
||||||
|
|
||||||
|
public sealed class DiscordPlatformMessengerTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Constructor_ShouldAcceptRestClient()
|
||||||
|
{
|
||||||
|
var constructor = typeof(DiscordPlatformMessenger).GetConstructor(new[] { typeof(NetCord.Rest.RestClient) });
|
||||||
|
Assert.NotNull(constructor);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void DiscordPlatformMessenger_ShouldImplementIPlatformMessenger()
|
||||||
|
{
|
||||||
|
Assert.True(typeof(IPlatformMessenger).IsAssignableFrom(typeof(DiscordPlatformMessenger)));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user