private static string GenerateDescription(CompetitionRound competitionRound) { switch (competitionRound.CompetitionRoundTypeID) { case CompetitionRoundTypes.LeagueMatches: return($"Game {competitionRound.GameNumber}"); case CompetitionRoundTypes.Prelims: return($"Prelim"); case CompetitionRoundTypes.Rounds123: return($"Round {competitionRound.GameNumber}"); case CompetitionRoundTypes.Last16: return($"Last 16"); case CompetitionRoundTypes.QuarterFinals: return($"Quarter Final"); case CompetitionRoundTypes.SemiFinals: return($"Semi Final"); case CompetitionRoundTypes.Final: return($"Final"); default: throw new ArgumentOutOfRangeException(); } }
public static TeamCompetitionRoundDto AssembleTeamDto(this CompetitionRound competitionRound) { return(new TeamCompetitionRoundDto { ID = competitionRound.ID, Notes = competitionRound.Notes, GameNumber = competitionRound.GameNumber, CompetitionRoundTypeID = competitionRound.CompetitionRoundTypeID, Description = GenerateDescription(competitionRound) }); }
public override IList <ScoreboardSummaryEntry> GetPeerTeams(CompetitionRound round, CompleteScoreboardSummary divisionScoreboard, ScoreboardSummaryEntry teamDetails) { // make a clone because we'll mutate this later divisionScoreboard = divisionScoreboard.Clone().WithFilter(teamDetails.Division, null); if (teamDetails.Division == Division.MiddleSchool) { // middle school doesn't have tiers or categories return(divisionScoreboard.TeamList); } // open/service if ((teamDetails.Division == Division.Open && round > CompetitionRound.Round2) || (teamDetails.Division == Division.AllService && round == CompetitionRound.Round3)) { // In open past R2, tier matters, but that's it // In all service R3, category doesn't* matter, just tier // See issue #14 return(divisionScoreboard.WithFilter(teamDetails.Division, teamDetails.Tier).TeamList); } // open/service, service: category matters; open: no tiers if (teamDetails.Division == Division.Open) { // unknown round - if our candidate team has a tier, filter by tier, otherwise return the whole division if (round == 0 && teamDetails.Tier != null) { return(divisionScoreboard.WithFilter(teamDetails.Division, teamDetails.Tier).TeamList); } // either R1 or R2 // safe to return the whole division as a peer list return(divisionScoreboard.TeamList); } // all-service round where category matters ("R0" we default to factoring in category) // filter by tier, where available if (round > CompetitionRound.Round2) { divisionScoreboard.WithFilter(Division.AllService, teamDetails.Tier); } // just need to filter the list by category if (teamDetails.Category == null) { // silent fail return(divisionScoreboard.TeamList); } // there might be some A.S. teams whose categories we don't know // they get treated as not-my-problem, that is, not part of my category return(divisionScoreboard.TeamList.Where(t => t.Category == teamDetails.Category).ToIList()); }
public static CompetitionRoundDto AssembleDto(this CompetitionRound competitionRound) { if (competitionRound is PlayerCompetitionRound playerCompetitionRound) { return(AssemblePlayerDto(playerCompetitionRound)); } if (competitionRound is TeamCompetitionRound teamCompetitionRound) { return(AssembleTeamDto(teamCompetitionRound)); } throw new ArgumentOutOfRangeException(); }
public override ScoreboardFilterInfo GetPeerFilter(CompetitionRound round, ScoreboardSummaryEntry teamDetails) { if (teamDetails.Division == Division.MiddleSchool) { // middle school doesn't have tiers or categories return(new ScoreboardFilterInfo(Division.MiddleSchool, null)); } // open/service if ((teamDetails.Division == Division.Open && round > CompetitionRound.Round2) || (teamDetails.Division == Division.AllService && round == CompetitionRound.Round3)) { // In open past R2, tier matters, but that's it // In all service R3, category doesn't* matter, just tier // See issue #14 return(new ScoreboardFilterInfo(teamDetails.Division, teamDetails.Tier)); } // open/service, service: category matters; open: no tiers if (teamDetails.Division == Division.Open) { // unknown round - if our candidate team has a tier, filter by tier, otherwise return the whole division if (round == 0 && teamDetails.Tier != null) { return(new ScoreboardFilterInfo(teamDetails.Division, teamDetails.Tier)); } // either R1 or R2 // safe to return the whole division as a peer list return(new ScoreboardFilterInfo(Division.Open, null)); } // all-service round where category matters ("R0" we default to factoring in category) Tier?tierFilter = null; // filter by tier, where available if (round > CompetitionRound.Round2) { tierFilter = teamDetails.Tier; } // there might be some A.S. teams whose categories we don't know // they get treated as not-my-problem, that is, not part of my category // unknown category -> null -> no filtering on that, a good enough fallback return(new ScoreboardFilterInfo(Division.AllService, tierFilter, teamDetails.Category, null)); }
public override double GetCiscoPointsPossible(CompetitionRound round, Division division, Tier?tier) { // http://www.uscyberpatriot.org/competition/competition-challenges-by-round switch (round) { case CompetitionRound.Round1: return(division == Division.MiddleSchool ? 0 : 20); case CompetitionRound.Round2: return(division == Division.MiddleSchool ? 0 : 30); case CompetitionRound.Round3: return(division == Division.MiddleSchool ? 30 : 100); case CompetitionRound.Semifinals: return(division == Division.MiddleSchool ? 30 : 100); } throw new ArgumentException("Unknown round."); }
public virtual TeamDetailRankingInformation GetRankingInformation(CompetitionRound round, CompleteScoreboardSummary divisionScoreboard, ScoreboardSummaryEntry teamInfo) { divisionScoreboard = divisionScoreboard.Clone().WithFilter(teamInfo.Division, null); // may be equal to division scoreboard, that's fine var tierScoreboard = divisionScoreboard.Clone().WithFilter(teamInfo.Division, teamInfo.Tier); var peers = GetPeerTeams(round, divisionScoreboard, teamInfo); var summaryComparer = BuildSummaryComparer(teamInfo.TeamId); return(new TeamDetailRankingInformation() { TeamId = teamInfo.TeamId, Peers = peers, PeerIndex = peers.IndexOfWhere(summaryComparer), PeerCount = peers.Count, DivisionIndex = divisionScoreboard.TeamList.IndexOfWhere(summaryComparer), DivisionCount = divisionScoreboard.TeamList.Count, TierIndex = tierScoreboard.TeamList.IndexOfWhere(summaryComparer), TierCount = tierScoreboard.TeamList.Count }); }
public abstract double GetCiscoPointsPossible(CompetitionRound round, Division division, Tier?tier);
public abstract IList <ScoreboardSummaryEntry> GetPeerTeams(CompetitionRound round, CompleteScoreboardSummary divisionScoreboard, ScoreboardSummaryEntry teamInfo);
ScoreboardFilterInfo ICompetitionRoundLogicService.GetPeerFilter(CompetitionRound round, ScoreboardSummaryEntry teamInfo) => underlyingService.GetPeerFilter(round, teamInfo);
double ICompetitionRoundLogicService.GetCiscoPointsPossible(CompetitionRound round, Division division, Tier?tier) => underlyingService.GetCiscoPointsPossible(round, division, tier);
public PreconfiguredRoundPassthroughCompetitionRoundLogicService(CompetitionRound round, ICompetitionRoundLogicService underlying) { preconfiguredRound = round; underlyingService = underlying; }
public async Task Initialise(Entities.Competition competition, CompetitionStage stage, CompetitionEvent competitionEvent, CompetitionRound round, ITeamFixtureModel teamFixture) { this.Competition = competition; this.CompetitionStage = stage; this.CompetitionEvent = competitionEvent; this.CompetitionRound = round; this.Fixture = teamFixture; }
public abstract ScoreboardFilterInfo GetPeerFilter(CompetitionRound round, ScoreboardSummaryEntry teamInfo);
public static async Task <string> SerializeAsync(CompleteScoreboardSummary summary, IDictionary <TeamId, ScoreboardDetails> teamDetails, CompetitionRound round = 0) { StreamWriter sw = null; StreamReader sr = null; try { using (var memStr = new MemoryStream()) { sw = new StreamWriter(memStr); sr = new StreamReader(memStr); // write await SerializeAsync(sw, summary, teamDetails, round).ConfigureAwait(false); // read memStr.Position = 0; return(await sr.ReadToEndAsync().ConfigureAwait(false)); } } finally { sw?.Dispose(); sr?.Dispose(); } }
public override double GetCiscoPointsPossible(CompetitionRound round, Division division, Tier?tier) { throw new NotImplementedException("CP-X Cisco totals are not implemented."); }
public void Initialise(Entities.Competition competition, CompetitionStage stage, CompetitionEvent competitionEvent, CompetitionRound round, IPlayerFixtureModel playerFixture) { this.Competition = competition; this.CompetitionStage = stage; this.CompetitionEvent = competitionEvent; this.CompetitionRound = round; this.PlayerFixture = playerFixture; }
public static async Task SerializeAsync(TextWriter target, CompleteScoreboardSummary summary, IDictionary <TeamId, ScoreboardDetails> teamDetails, CompetitionRound round = 0) { using (JsonWriter jw = new JsonTextWriter(target)) { jw.CloseOutput = false; // write await jw.WriteStartObjectAsync().ConfigureAwait(false); await jw.WritePropertyNameAsync("summary").ConfigureAwait(false); var serializer = JsonSerializer.CreateDefault(); // serialize serializer.Serialize(jw, summary); await jw.WritePropertyNameAsync("teams").ConfigureAwait(false); serializer.Serialize(jw, teamDetails); await jw.WritePropertyNameAsync("round").ConfigureAwait(false); await jw.WriteValueAsync((int)round).ConfigureAwait(false); await jw.WriteEndObjectAsync().ConfigureAwait(false); await jw.FlushAsync().ConfigureAwait(false); } }