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