diff --git a/app/features/core/streams/streams.server.ts b/app/features/core/streams/streams.server.ts index e8ce4f301..b08f72c42 100644 --- a/app/features/core/streams/streams.server.ts +++ b/app/features/core/streams/streams.server.ts @@ -21,6 +21,7 @@ export type SidebarStream = { subtitle: string; startsAt: number; tier: TournamentTierNumber | null; + membersPerTeam?: number; tentativeTier?: number; peakXp?: number; twitchUsername?: string; @@ -31,7 +32,6 @@ export function getLiveTournamentStreams(): SidebarStream[] { for (const tournament of RunningTournaments.all) { if (tournament.isLeagueDivision) continue; - if (tournament.minMembersPerTeam < 4) continue; streams.push({ id: `tournament-${tournament.ctx.id}`, @@ -41,6 +41,7 @@ export function getLiveTournamentStreams(): SidebarStream[] { subtitle: deriveCurrentRound(tournament), startsAt: dateToDatabaseTimestamp(tournament.ctx.startTime), tier: tournament.ctx.tier, + membersPerTeam: tournament.minMembersPerTeam, }); } diff --git a/app/features/sidebar/core/StreamRanking.ts b/app/features/sidebar/core/StreamRanking.ts index 10c53c358..270bc079d 100644 --- a/app/features/sidebar/core/StreamRanking.ts +++ b/app/features/sidebar/core/StreamRanking.ts @@ -25,14 +25,28 @@ export function rank( return [...live, ...upcoming].map((rs) => rs.stream); } +const SMALL_TOURNAMENT_PENALTY = 4; + export function tournamentTierToScore( tier: TournamentTierNumber | null, + membersPerTeam?: number, ): number { - return tier ?? 9; + const base = tier ?? 9; + const isSmallTeamSize = (membersPerTeam ?? 4) < 4; + + return Math.min(9, base + (isSmallTeamSize ? SMALL_TOURNAMENT_PENALTY : 0)); } -export function upcomingTournamentTierToScore(tier: number): number { - return Math.min(9, tier + 4); +export function upcomingTournamentTierToScore( + tier: number, + membersPerTeam?: number, +): number { + const isSmallTeamSize = (membersPerTeam ?? 4) < 4; + + return Math.min( + 9, + tier + 4 + (isSmallTeamSize ? SMALL_TOURNAMENT_PENALTY : 0), + ); } export function sendouQTierToScore(tier: { diff --git a/app/features/sidebar/core/sidebar.server.ts b/app/features/sidebar/core/sidebar.server.ts index 7f1de2cfc..bd37a3fdd 100644 --- a/app/features/sidebar/core/sidebar.server.ts +++ b/app/features/sidebar/core/sidebar.server.ts @@ -152,7 +152,10 @@ async function combinedStreams(): Promise { for (const stream of tournamentStreams) { ranked.push({ stream, - score: StreamRanking.tournamentTierToScore(stream.tier), + score: StreamRanking.tournamentTierToScore( + stream.tier, + stream.membersPerTeam, + ), }); } @@ -215,7 +218,8 @@ async function combinedStreams(): Promise { if (event.startTime < nowTimestamp) continue; if (event.startTime > threeDaysFromNow) continue; if (event.hidden) continue; - if ((event.minMembersPerTeam ?? 4) < 4) continue; + + const membersPerTeam = event.minMembersPerTeam ?? 4; ranked.push({ stream: { @@ -226,9 +230,13 @@ async function combinedStreams(): Promise { subtitle: "", startsAt: event.startTime, tier: (event.tier as TournamentTierNumber) ?? null, + membersPerTeam, tentativeTier: event.tentativeTier ?? undefined, }, - score: StreamRanking.upcomingTournamentTierToScore(effectiveTier), + score: StreamRanking.upcomingTournamentTierToScore( + effectiveTier, + membersPerTeam, + ), }); }