Skip to main content
The QualifierRoom entity represents a lobby in the qualifier stage where players compete individually on a standardized map pool. Unlike elimination matches, qualifiers allow multiple participants and don’t have teams.

Class Definition

Namespace: ss.Internal.Management.Server.AutoRef Table: qualifier_rooms Source: /home/daytona/workspace/source/ss.Integrated.Management.Server/Database/Models.cs:193
[Table("qualifier_rooms")]
public class QualifierRoom
{
    // Properties...
}

Properties

Id
string
required
The unique identifier for the qualifier lobby.Column: id (Primary Key)
RoundId
int
required
Foreign key reference to the Round that defines the qualifier rules and map pool.Column: round_idRelationship: Many-to-one with Round
StartTime
DateTime
required
The scheduled start time for this qualifier lobby in UTC.Column: start_time
RefereeId
int?
The ID of the referee assigned to manage this lobby. Nullable if not yet assigned.Column: referee_idRelationship: Many-to-one with RefereeInfo
RequestedBy
int?
The ID of the user who requested this specific qualifier time slot.Used for custom/requested qualifier lobbies rather than pre-scheduled ones.Column: requested_byRelationship: Many-to-one with User
Approved
bool?
Approval status for requested qualifier lobbies.
  • true: Request approved, lobby is active
  • false: Request denied
  • null: Pending review
Column: is_approved
The numerical ID of the Bancho Match History.Used to construct the URL: https://osu.ppy.sh/community/matches/{MpLinkId}Column: mp_link_id
Referee
RefereeInfo
Navigation property to the RefereeInfo entity assigned to manage this lobby.
[ForeignKey("RefereeId")]
public virtual RefereeInfo Referee { get; set; }
Round
Round
Navigation property to the Round entity that defines the qualifier rules and map pool.
[ForeignKey("RoundId")]
public virtual Round Round { get; set; }
RequestUser
User
Navigation property to the User who requested this qualifier lobby.
[ForeignKey("RequestedBy")]
public virtual User RequestUser { get; set; }

Usage Examples

Creating a Scheduled Qualifier Lobby

var qualifierLobby = new QualifierRoom
{
    Id = "Q1-SAT-1400",
    RoundId = 1,  // Qualifiers round
    StartTime = new DateTime(2026, 3, 15, 14, 0, 0, DateTimeKind.Utc),
    RefereeId = 5,
    Approved = true
};

context.QualifierRooms.Add(qualifierLobby);
await context.SaveChangesAsync();

Player-Requested Qualifier Lobby

var requestedLobby = new QualifierRoom
{
    Id = "Q-REQ-123",
    RoundId = 1,
    StartTime = new DateTime(2026, 3, 16, 18, 30, 0, DateTimeKind.Utc),
    RequestedBy = 42,
    Approved = null  // Pending approval
};

context.QualifierRooms.Add(requestedLobby);
await context.SaveChangesAsync();

Approving a Request

var lobby = await context.QualifierRooms
    .FirstOrDefaultAsync(q => q.Id == "Q-REQ-123");

lobby.Approved = true;
lobby.RefereeId = 5;  // Assign a referee

await context.SaveChangesAsync();

Querying Qualifier Lobbies

// Get all approved lobbies for a specific date
var date = new DateTime(2026, 3, 15);
var lobbies = await context.QualifierRooms
    .Include(q => q.Round)
    .Include(q => q.Referee)
    .Include(q => q.RequestUser)
        .ThenInclude(u => u.OsuData)
    .Where(q => q.StartTime.Date == date.Date && q.Approved == true)
    .OrderBy(q => q.StartTime)
    .ToListAsync();

foreach (var lobby in lobbies)
{
    Console.WriteLine($"{lobby.StartTime:HH:mm} - {lobby.Id}");
    Console.WriteLine($"  Referee: {lobby.Referee?.DisplayName ?? "TBD"}");
    if (lobby.RequestedBy.HasValue)
    {
        Console.WriteLine($"  Requested by: {lobby.RequestUser.DisplayName}");
    }
}

Finding Players Assigned to a Lobby

var players = await context.Players
    .Include(p => p.User)
        .ThenInclude(u => u.OsuData)
    .Where(p => p.QualifierRoomId == "Q1-SAT-1400")
    .ToListAsync();

Console.WriteLine($"Players in lobby Q1-SAT-1400:");
foreach (var player in players)
{
    Console.WriteLine($"- {player.User.DisplayName}");
}

Workflow

Pre-scheduled Lobbies

  1. Tournament staff create qualifier lobbies with set times
  2. Players select a lobby that fits their availability
  3. Player records are updated with QualifierRoomId
  4. Referee joins at the scheduled time

Player-requested Lobbies

  1. Player requests a custom time slot via RequestedBy
  2. Request is created with Approved = null
  3. Staff review and either:
    • Approve: Set Approved = true and assign RefereeId
    • Deny: Set Approved = false
  4. If approved, player is assigned to the lobby
  • Round - Defines the qualifier map pool and rules
  • Player - Links players to their assigned qualifier lobby
  • RefereeInfo - Lobby referee
  • User - Player who requested the lobby
  • ScoreResults - Individual scores from the qualifier lobby

Build docs developers (and LLMs) love