39132be4e8
PR Checks / test-and-build (pull_request) Successful in 6m6s
Move neutral join/leave handlers into GmRelay.Shared so Telegram and Discord share capacity, waitlist, duplicate-click, and schedule-update behavior. Add Discord component routing for join_session and leave_session buttons with deferred ephemeral replies and serialized schedule message updates. Bump version to 2.5.0 and update Discord docs. Refs #29
65 lines
2.2 KiB
C#
65 lines
2.2 KiB
C#
using GmRelay.Shared.Features.Sessions.CreateSession;
|
|
using GmRelay.Shared.Platform;
|
|
|
|
namespace GmRelay.DiscordBot.Features.Sessions;
|
|
|
|
public sealed record DiscordSessionInteractionInput(
|
|
Guid SessionId,
|
|
string InteractionId,
|
|
string GuildId,
|
|
string ChannelId,
|
|
string MessageId,
|
|
ulong UserId,
|
|
string Username,
|
|
string? DisplayName);
|
|
|
|
public static class DiscordSessionInteractionMapper
|
|
{
|
|
public static bool TryParseCustomId(string customId, string expectedAction, out Guid sessionId)
|
|
{
|
|
sessionId = default;
|
|
|
|
var parts = customId.Split(':', 2);
|
|
return parts.Length == 2
|
|
&& string.Equals(parts[0], expectedAction, StringComparison.Ordinal)
|
|
&& Guid.TryParse(parts[1], out sessionId);
|
|
}
|
|
|
|
public static JoinSessionCommand CreateJoinCommand(DiscordSessionInteractionInput input) =>
|
|
new(
|
|
SessionId: input.SessionId,
|
|
User: CreateUser(input),
|
|
InteractionId: input.InteractionId,
|
|
Group: CreateGroup(input),
|
|
ScheduleMessage: CreateMessageRef(input));
|
|
|
|
public static LeaveSessionCommand CreateLeaveCommand(DiscordSessionInteractionInput input) =>
|
|
new(
|
|
SessionId: input.SessionId,
|
|
User: CreateUser(input),
|
|
InteractionId: input.InteractionId,
|
|
Group: CreateGroup(input),
|
|
ScheduleMessage: CreateMessageRef(input));
|
|
|
|
private static PlatformUser CreateUser(DiscordSessionInteractionInput input) =>
|
|
new(
|
|
PlatformKind.Discord,
|
|
input.UserId.ToString(System.Globalization.CultureInfo.InvariantCulture),
|
|
string.IsNullOrWhiteSpace(input.DisplayName) ? input.Username : input.DisplayName,
|
|
input.Username);
|
|
|
|
private static PlatformGroup CreateGroup(DiscordSessionInteractionInput input) =>
|
|
new(
|
|
PlatformKind.Discord,
|
|
input.GuildId,
|
|
input.GuildId,
|
|
input.ChannelId);
|
|
|
|
private static PlatformMessageRef CreateMessageRef(DiscordSessionInteractionInput input) =>
|
|
new(
|
|
PlatformKind.Discord,
|
|
input.GuildId,
|
|
null,
|
|
input.MessageId);
|
|
}
|