Skip to main content

SeasonHub

WebSocket hub for season operations. Read operations are available to all authenticated users; management operations require Admin role.

Endpoint: /seasonHub

Authorization: All methods require authentication. Admin methods require Admin role.

Methods

Subscriptions

JoinSeasonGroup

Join a season group to receive updates for that season.

public async Task JoinSeasonGroup(string seasonId)

LeaveSeasonGroup

Leave a season group.

public async Task LeaveSeasonGroup(string seasonId)

JoinAllSeasonsGroup

Join the global seasons group to receive all season events.

public async Task JoinAllSeasonsGroup()

LeaveAllSeasonsGroup

Leave the global seasons group.

public async Task LeaveAllSeasonsGroup()

Read Operations

GetAllSeasons

Get all seasons (permanent and temporary).

public async Task<IReadOnlyList<Season>> GetAllSeasons()

Returns: Season[]

{
seasonId: string;
name: string;
description?: string;
status: SeasonStatus;
isPermanent: boolean;
targetSeasonId?: string; // Where characters migrate to
startedAt?: string;
endsAt?: string;
}

GetCurrentSeason

Get the currently active temporary season.

public async Task<Season?> GetCurrentSeason()

GetSeason

Get a specific season by ID.

public async Task<Season?> GetSeason(string seasonId)

Admin Operations

CreateSeason

Create a new season. Broadcasts to all season subscribers.

[Authorize(Roles = "Admin")]
public async Task<Season> CreateSeason(
string seasonId,
string name,
string? description,
bool isPermanent,
string? targetSeasonId,
DateTimeOffset? endsAt)

Parameters:

NameTypeDescription
seasonIdstringUnique season identifier
namestringDisplay name
descriptionstring?Optional description
isPermanentbooleanPermanent league (no end date)
targetSeasonIdstring?Migration target when season ends
endsAtDateTimeOffset?End date (for temp seasons)

EndSeason

End a season and trigger migration.

[Authorize(Roles = "Admin")]
public async Task EndSeason(string seasonId)

UpdateSeasonStatus

Update a season's status.

[Authorize(Roles = "Admin")]
public async Task UpdateSeasonStatus(string seasonId, SeasonStatus status)

Migration Operations

GetMigrationStatus

Get migration status for a season.

public async Task<MigrationStatus> GetMigrationStatus(string seasonId)

StartMigration

Start migration for a season.

[Authorize(Roles = "Admin")]
public async Task StartMigration(string seasonId)

MigrateCharacter

Migrate a specific character.

public async Task MigrateCharacter(Guid characterId, string fromSeasonId)

CancelMigration

Cancel an in-progress migration.

[Authorize(Roles = "Admin")]
public async Task CancelMigration(string seasonId)

SeasonStatus Enum

enum SeasonStatus {
Upcoming = 0, // Not yet started
Active = 1, // Characters can be created
Ending = 2, // Ending soon, no new characters
Ended = 3, // Finished, migration in progress
Migrated = 4 // All characters migrated
}

Season Lifecycle

Event Notifications

Subscribe to season events:

connection.on("SeasonEvent", (event) => {
console.log(`Season ${event.seasonId}: ${event.eventType}`);
});

await connection.invoke("JoinAllSeasonsGroup");

Event Types:

EventDescription
SeasonCreatedNew season created
SeasonStatusChangedSeason status updated
SeasonEndedSeason ended, migration starting
MigrationStartedCharacter migration began
MigrationCompletedAll characters migrated