542f15f2d6
PR Checks / test-and-build (pull_request) Successful in 13m48s
- Extract CreateSessionHandler, ListSessionsHandler, DeleteSessionHandler, ExportCalendarHandler, HandleRescheduleTimeInputHandler, HandleRescheduleVoteHandler to GmRelay.Shared - Add IPlatformMessenger methods: SendScheduleAsync, UpdateScheduleAsync, SendGroupMessageAsync with actions, CreateThreadAsync, DeleteThreadAsync - Rewrite Telegram Bot wrappers as thin adapters delegating to shared handlers - Rewrite DiscordRescheduleVoteHandler to use shared HandleRescheduleVoteHandler - Update UpdateRouter with explicit type aliases for ambiguous handler names - Add contract and source-inspection tests for extracted handlers - Bump version 3.1.1 → 3.2.0 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
using GmRelay.DiscordBot.Rendering;
|
|
using GmRelay.Shared.Features.Sessions.RescheduleSession;
|
|
using GmRelay.Shared.Platform;
|
|
using NetCord.Rest;
|
|
|
|
namespace GmRelay.DiscordBot.Features.Sessions;
|
|
|
|
public sealed record DiscordRescheduleVoteInput(
|
|
Guid OptionId,
|
|
ulong UserId,
|
|
string InteractionId,
|
|
string GuildId,
|
|
string ChannelId,
|
|
string MessageId);
|
|
|
|
public sealed class DiscordRescheduleVoteHandler(
|
|
GmRelay.Shared.Features.Sessions.RescheduleSession.HandleRescheduleVoteHandler sharedHandler,
|
|
RestClient restClient,
|
|
ILogger<DiscordRescheduleVoteHandler> logger)
|
|
{
|
|
public async Task<string> HandleAsync(DiscordRescheduleVoteInput input, CancellationToken ct)
|
|
{
|
|
var command = new HandleRescheduleVoteCommand(
|
|
input.OptionId,
|
|
new PlatformUser(PlatformKind.Discord, input.UserId.ToString(), string.Empty, null),
|
|
new PlatformGroup(PlatformKind.Discord, input.GuildId, string.Empty, input.ChannelId),
|
|
input.InteractionId,
|
|
new PlatformMessageRef(PlatformKind.Discord, input.ChannelId, null, input.MessageId));
|
|
|
|
var result = await sharedHandler.HandleAsync(command, ct);
|
|
|
|
if (!result.Success)
|
|
{
|
|
return result.ReplyText!;
|
|
}
|
|
|
|
var (embed, actionRow) = DiscordRescheduleVotingRenderer.Render(
|
|
result.Title!,
|
|
result.CurrentScheduledAt,
|
|
result.VotingDeadlineAt,
|
|
result.Options,
|
|
result.Participants,
|
|
result.Votes);
|
|
|
|
var channelIdUlong = ulong.Parse(input.ChannelId);
|
|
var messageIdUlong = ulong.Parse(input.MessageId);
|
|
|
|
try
|
|
{
|
|
await restClient.ModifyMessageAsync(channelIdUlong, messageIdUlong, options =>
|
|
{
|
|
options.Embeds = new[] { embed };
|
|
options.Components = new[] { actionRow };
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogWarning(ex, "Failed to update Discord vote message for proposal {ProposalId}", result.ProposalId);
|
|
}
|
|
|
|
return result.ReplyText!;
|
|
}
|
|
}
|