8f0f2ef7e7
Moves the game-creation wizard state machine, view builder, and platform-neutral contracts (callback data, step names, storage exception, club option, step limits) from GmRelay.Bot to GmRelay.Shared. Telegram continues to work through a new TelegramWizardMessenger implementing IWizardMessenger and a WizardInteractionMapper that converts Update → WizardInteraction. Wires the new platform column on wizard_drafts (V032 migration) and switches chat/owner/thread/message ids to TEXT so the same table can hold Discord snowflakes later. - GameCreationWizard: now in Shared, takes IWizardMessenger + IWizardDraftRepository, dispatches on WizardInteraction. - New IWizardMessenger contract with Edit/Send/Answer/GetOwnerClubs (returns string ids so Telegram longs and Discord snowflakes both fit). - New WizardStepViewBuilder in Shared returns (text, IReadOnlyList<WizardAction>); TelegramWizardMessenger renders actions into InlineKeyboardMarkup via a new Bot-side ToInlineKeyboard helper. - New WizardInteractionMapper in Bot (5-case test) converts Telegram Update to WizardInteraction. - WizardDraft gains a Platform column; ChatId/MessageThreadId/OwnerId/ DraftMessageId switched to string. V032 migrates existing rows and rebuilds the owner lookup index on (platform, owner_id). - All existing wizard / create-session tests updated to the new contract (HandleInteractionAsync + WizardInteraction). Wizard callback-data format preserved. - dotnet build clean, dotnet format --verify-no-changes clean, all 101 wizard tests pass.
52 lines
1.6 KiB
C#
52 lines
1.6 KiB
C#
using System;
|
|
|
|
namespace GmRelay.Shared.Features.Sessions.CreateSession.Wizard;
|
|
|
|
public sealed class WizardDraft
|
|
{
|
|
public Guid Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Stable string id of the chat/guild/channel this draft lives in.
|
|
/// Stored as <c>TEXT</c> to fit both Telegram's <c>long</c> chat ids
|
|
/// and Discord's snowflakes.
|
|
/// </summary>
|
|
public string ChatId { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Optional thread/topic id within the chat. Telegram's
|
|
/// <c>message_thread_id</c>, Discord's thread snowflake, <c>null</c>
|
|
/// when the chat has no sub-thread concept.
|
|
/// </summary>
|
|
public string? MessageThreadId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Platform-specific user id of the wizard owner. Telegram uses
|
|
/// <c>long</c>, Discord uses snowflakes — both fit in a string.
|
|
/// </summary>
|
|
public string OwnerId { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Which messenger platform owns this draft. Defaults to
|
|
/// <c>"Telegram"</c> for backward compatibility with pre-V032 rows.
|
|
/// </summary>
|
|
public string Platform { get; set; } = "Telegram";
|
|
|
|
public string Step { get; set; } = string.Empty;
|
|
|
|
public string PayloadJson { get; set; } = "{}";
|
|
|
|
/// <summary>
|
|
/// Id of the message that the wizard last edited. Stored as
|
|
/// <c>TEXT</c> to fit both Telegram's <c>int32</c> ids and Discord's
|
|
/// 64-bit snowflakes.
|
|
/// </summary>
|
|
public string? DraftMessageId { get; set; }
|
|
|
|
public DateTimeOffset CreatedAt { get; set; }
|
|
|
|
public DateTimeOffset UpdatedAt { get; set; }
|
|
|
|
public DateTimeOffset ExpiresAt { get; set; }
|
|
}
|