public async Task OnlyPublishesOnceForSecondGameweekWhenFirstGameweekIsCurrent() { var fakeSettingsClient = A.Fake <IGlobalSettingsClient>(); var gameweek1 = new Gameweek { IsCurrent = true, IsNext = false, Deadline = new DateTime(2021, 8, 15, 10, 0, 0) }; var gameweek2 = new Gameweek { IsCurrent = false, IsNext = true, Deadline = new DateTime(2021, 8, 22, 10, 0, 0) }; var globalSettings = new GlobalSettings { Gameweeks = new List <Gameweek> { gameweek1, gameweek2 } }; A.CallTo(() => fakeSettingsClient.GetGlobalSettings()).Returns(globalSettings); var session = new TestableMessageSession(); var dontCareLogger = A.Fake <ILogger <NearDeadLineMonitor> >(); var dateTimeUtils = new DateTimeUtils { NowUtcOverride = new DateTime(2021, 8, 21, 10, 0, 0) }; var handler = new NearDeadLineMonitor(fakeSettingsClient, dateTimeUtils, session, dontCareLogger); await handler.EveryMinuteTick(); Assert.Single(session.PublishedMessages); Assert.IsType <TwentyFourHoursToDeadline>(session.PublishedMessages[0].Message); }
private bool IsFirstGameweekChangingToCurrent(Gameweek fetchedCurrent) { var isFirstGameweekBeginning = _storedCurrent.Id == 1 && fetchedCurrent.Id == 1; var isFirstGameweekChangeToCurrent = _storedCurrent.IsCurrent == false && fetchedCurrent.IsCurrent; return(isFirstGameweekBeginning && isFirstGameweekChangeToCurrent); }
public static string GetTopThreeGameweekEntries(ClassicLeague league, Gameweek gameweek) { var topThree = league.Standings.Entries .GroupBy(e => e.EventTotal) .OrderByDescending(g => g.Key) .Take(3) .ToArray(); if (!topThree.Any()) { return(null); } var sb = new StringBuilder(); sb.Append("Top three this gameweek was:\n"); for (var i = 0; i < topThree.Length; i++) { var group = topThree[i]; foreach (var entry in group) { sb.Append($"{Formatter.RankEmoji(i)} {entry.GetEntryLink(gameweek.Id)} - {entry.EventTotal}\n"); } } return(sb.ToString()); }
public async Task Process() { _logger.LogDebug($"Channel: {_options.Value.Channel} & League: {_options.Value.LeagueId}"); var gameweeks = await _gwClient.GetGameweeks(); var fetchedCurrent = gameweeks.FirstOrDefault(gw => gw.IsCurrent); if (_storedCurrent == null) { _logger.LogDebug("Initial fetch executed."); _storedCurrent = fetchedCurrent; if (fetchedCurrent != null) { await DoStuffWhenInitialGameweekHasJustBegun(fetchedCurrent.Id); } } if (fetchedCurrent == null) { _logger.LogDebug("No gw marked as current"); return; } _logger.LogDebug($"Stored: {_storedCurrent.Id} & Fetched: {fetchedCurrent.Id}"); if (fetchedCurrent.Id > _storedCurrent.Id) { await DoStuffWhenNewGameweekHaveJustBegun(fetchedCurrent.Id); } _storedCurrent = fetchedCurrent; await DoStuffWithinCurrentGameweek(_storedCurrent.Id, _storedCurrent.IsFinished); }
private Gameweek AddOrUpdateGameweek(MatchViewModel matchModel) { var gameweek = data.Gameweeks.All().FirstOrDefault(g => g.Name == matchModel.Gameweek); int gamewekIndex = matchModel.Gameweek.LastIndexOf(' '); int gameweekNumber = int.Parse(matchModel.Gameweek.Substring(gamewekIndex + 1)); var previousGameweek = data.Gameweeks.GetById(gameweekNumber - 1); if (previousGameweek != null) { startDate = previousGameweek.EndDate; } if (gameweek == null) { var newGameweek = new Gameweek() { Id = gameweekNumber, Name = matchModel.Gameweek, StartDate = startDate, EndDate = matchModel.MatchDate.AddDays(1) }; data.Gameweeks.Add(newGameweek); data.SaveChanges(); gameweek = data.Gameweeks.GetById(newGameweek.Id); } else { gameweek.StartDate = startDate; gameweek.EndDate = matchModel.MatchDate.AddDays(1); } return(gameweek); }
public static string GetWorstGameweekEntry(ClassicLeague league, Gameweek gameweek, bool includeExternalLinks = true) { var worst = league.Standings.Entries.OrderBy(e => e.EventTotal).FirstOrDefault(); string entryOrEntryLink = includeExternalLinks? worst.GetEntryLink(gameweek.Id) : worst?.EntryName; return(worst == null ? null : $"💩 {entryOrEntryLink} only got {worst.EventTotal} points. Wow."); }
public static string GetStandings(ClassicLeague league, Gameweek gameweek, bool includeExternalLinks = true) { var sb = new StringBuilder(); var sortedByRank = league.Standings.Entries.OrderBy(x => x.Rank); var numPlayers = league.Standings.Entries.Count; if (gameweek == null) { sb.Append("No current gameweek!"); return(sb.ToString()); } sb.Append($"⭐️ *Here's the current standings after {gameweek.Name}* ⭐ \n\n"); foreach (var player in sortedByRank) { var arrow = GetRankChangeEmoji(player, numPlayers, gameweek.Id); string entryOrLink = includeExternalLinks ? player.GetEntryLink(gameweek.Id) : player.EntryName; sb.Append($"\n{player.Rank}. {entryOrLink} - {player.Total} {arrow}"); } return(sb.ToString()); }
public async Task EveryOtherMinuteTick(CancellationToken token) { GlobalSettings globalSettings; try { globalSettings = await _gwClient.GetGlobalSettings(); } catch (Exception e) when(LogError(e)) { return; } var gameweeks = globalSettings.Gameweeks; var fetchedCurrent = gameweeks.FirstOrDefault(gw => gw.IsCurrent); if (_storedCurrent == null) { _logger.LogDebug("Executing initial fetch"); _storedCurrent = fetchedCurrent; if (fetchedCurrent != null) { await _mediator.Publish(new GameweekMonitoringStarted(fetchedCurrent), token); } } if (fetchedCurrent == null) { _logger.LogDebug("No gw marked as current"); return; } _logger.LogDebug($"Stored: {_storedCurrent.Id} & Fetched: {fetchedCurrent.Id}"); if (IsChangeToNewGameweek(fetchedCurrent) || IsFirstGameweekChangingToCurrent(fetchedCurrent)) { await _session.Publish(new FplBot.Messaging.Contracts.Events.v1.GameweekJustBegan(new (fetchedCurrent.Id))); await _mediator.Publish(new GameweekJustBegan(fetchedCurrent), token); } else if (IsChangeToFinishedGameweek(fetchedCurrent)) { await _session.Publish(new FplBot.Messaging.Contracts.Events.v1.GameweekFinished(new (fetchedCurrent.Id))); await _mediator.Publish(new GameweekFinished(fetchedCurrent), token); } else { if (!_storedCurrent.IsFinished) { await _mediator.Publish(new GameweekCurrentlyOnGoing(_storedCurrent), token); } else { await _mediator.Publish(new GameweekCurrentlyFinished(_storedCurrent), token); } } _storedCurrent = fetchedCurrent; }
public FixtureMapperTests() { var autoFixture = new AutoFixture.Fixture(); _competition = autoFixture.Create <Data.Models.Competition>(); _gameweek = autoFixture.Create <Gameweek>(); _homeTeam = autoFixture.Create <Data.Models.Team>(); _awayTeam = autoFixture.Create <Data.Models.Team>(); _source = autoFixture.Create <MatchResponse>(); var mapper = new FixtureMapper(this, this, this); _result = mapper.MapAsync(_source).Result; }
public void UpdateFixtures(List <string> fixtures) { startDate = startSeason; List <Match> gameweekMatches = new List <Match>(); string gameweek = fixtures[0]; for (int i = 1; i < fixtures.Count; i += 4) { string[] dateParts = fixtures[i].Split(' '); string dateAsString = string.Format("{0} {1} {2} {3}", dateParts[0], dateParts[1], startSeason.Year, dateParts[2]); DateTime matchDate = DateTime.ParseExact(dateAsString, "dd MMM yyyy HH:mm", CultureInfo.InvariantCulture); matchDate = matchDate < startDate?matchDate.AddYears(1) : matchDate; string host = ConvertTeamName(fixtures[i + 1]); string visitor = ConvertTeamName(fixtures[i + 3]); var matchModel = new MatchViewModel() { Host = host, Visitor = visitor, Gameweek = gameweek, MatchDate = matchDate }; if (fixtures[i + 2] != "v") { string[] result = fixtures[i + 2].Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); matchModel.HostScore = int.Parse(result[0]); matchModel.VisitorScore = int.Parse(result[1]); } Match match = AddOrUpdateMatch(matchModel); if (match != null) { this.data.SaveChanges(); gameweekMatches.Add(match); } } Gameweek currentGameweek = data.Gameweeks.All().FirstOrDefault(g => g.Name == gameweek); List <int> gameweekMatchesIds = gameweekMatches.Select(g => g.Id).ToList(); data.Matches.DeleteRange(m => m.GameweekId == currentGameweek.Id && !gameweekMatchesIds.Contains(m.Id)); data.SaveChanges(); }
public void FormatGameweekFinished_ShoudReturnCorrectMessage( int globalAverage, int entryScore1, int entryScore2, int entryScore3, string expectedMessage) { // Arrange var gameweek = new Gameweek { Name = "Gameweek 1", AverageScore = globalAverage }; var league = new ClassicLeague { Standings = new ClassicLeagueStandings { Entries = new[] { new ClassicLeagueEntry { EventTotal = entryScore1 }, new ClassicLeagueEntry { EventTotal = entryScore2 }, new ClassicLeagueEntry { EventTotal = entryScore3 } } } }; // Act var message = Formatter.FormatGameweekFinished(gameweek, league); // Assert Assert.Equal(expectedMessage, message); }
public static string GetStandings(ClassicLeague league, Gameweek gameweek) { var sb = new StringBuilder(); var sortedByRank = league.Standings.Entries.OrderBy(x => x.Rank); var numPlayers = league.Standings.Entries.Count; if (gameweek == null) { sb.Append("No current gameweek!"); return(sb.ToString()); } sb.Append($":star: *Here's the current standings after {gameweek.Name}* :star: \n\n"); foreach (var player in sortedByRank) { var arrow = GetRankChangeEmoji(player, numPlayers); sb.Append($"{player.Rank}. {player.GetEntryLink(gameweek.Id)} - {player.Total} {arrow} \n"); } return(sb.ToString()); }
private static string TextToSend(Gameweek gameweek, ICollection <Fixture> fixtures, ICollection <Team> teams, int tzOffset) { var textToSend = $":information_source: <https://fantasy.premierleague.com/fixtures/{gameweek.Id}|{gameweek.Name.ToUpper()}>"; textToSend += $"\nDeadline: {gameweek.Deadline.WithOffset(tzOffset):yyyy-MM-dd HH:mm}\n"; var groupedByDay = fixtures.GroupBy(f => f.KickOffTime.Value.Date); foreach (var group in groupedByDay) { textToSend += $"\n{group.Key.WithOffset(tzOffset):dddd}"; foreach (var fixture in group) { var homeTeam = teams.First(t => t.Id == fixture.HomeTeamId); var awayTeam = teams.First(t => t.Id == fixture.AwayTeamId); var fixtureKickOffTime = fixture.KickOffTime.Value.WithOffset(tzOffset); textToSend += $"\n•{fixtureKickOffTime:HH:mm} {homeTeam.ShortName}-{awayTeam.ShortName}"; } textToSend += "\n"; } return(textToSend); }
private bool IsChangeToFinishedGameweek(Gameweek fetchedCurrent) { return(fetchedCurrent.Id == _storedCurrent.Id && !_storedCurrent.IsFinished && fetchedCurrent.IsFinished); }
private bool IsChangeToNewGameweek(Gameweek fetchedCurrent) { return(fetchedCurrent.Id > _storedCurrent.Id); }
public static string GetWorstGameweekEntry(ClassicLeague league, Gameweek gameweek) { var worst = league.Standings.Entries.OrderBy(e => e.EventTotal).FirstOrDefault(); return(worst == null ? null : $":poop: {worst.GetEntryLink(gameweek.Id)} only got {worst.EventTotal} points. Wow."); }
public void GetTopThreeGameweekEntriesTests_ShoudReturnCorrectMessage() { // Arrange var gameweek = new Gameweek { Name = "1", Id = 1 }; var league = new ClassicLeague { Standings = new ClassicLeagueStandings { Entries = new[] { new ClassicLeagueEntry { EventTotal = 50, Total = 1337, Entry = 1, EntryName = "K" }, new ClassicLeagueEntry { EventTotal = 90, Total = 500, Entry = 2, EntryName = "L" }, new ClassicLeagueEntry { EventTotal = 90, Total = 500, Entry = 3, EntryName = "La" }, new ClassicLeagueEntry { EventTotal = 10, Total = 42, Entry = 4, EntryName = "M" }, new ClassicLeagueEntry { EventTotal = 10, Total = 43, Entry = 5, EntryName = "J" }, new ClassicLeagueEntry { EventTotal = 5, Total = 43, Entry = 6, EntryName = "X" } } } }; // Act var message = Formatter.GetTopThreeGameweekEntries(league, gameweek); // Assert Assert.Equal("Top three this gameweek was:\n" + ":first_place_medal: <https://fantasy.premierleague.com/entry/2/event/1|L> - 90\n" + ":first_place_medal: <https://fantasy.premierleague.com/entry/3/event/1|La> - 90\n" + ":second_place_medal: <https://fantasy.premierleague.com/entry/1/event/1|K> - 50\n" + ":third_place_medal: <https://fantasy.premierleague.com/entry/4/event/1|M> - 10\n" + ":third_place_medal: <https://fantasy.premierleague.com/entry/5/event/1|J> - 10\n", message); }
public void GetWorstGameweekEntryTests_ShoudReturnCorrectMessage() { // Arrange var gameweek = new Gameweek { Name = "1", Id = 1 }; var league = new ClassicLeague { Standings = new ClassicLeagueStandings { Entries = new[] { new ClassicLeagueEntry { EventTotal = 50, Total = 1337, Entry = 1, EntryName = "K" }, new ClassicLeagueEntry { EventTotal = 90, Total = 500, Entry = 2, EntryName = "L" }, new ClassicLeagueEntry { EventTotal = 90, Total = 500, Entry = 3, EntryName = "La" }, new ClassicLeagueEntry { EventTotal = 10, Total = 42, Entry = 4, EntryName = "M" }, new ClassicLeagueEntry { EventTotal = 10, Total = 43, Entry = 5, EntryName = "J" }, new ClassicLeagueEntry { EventTotal = 5, Total = 43, Entry = 6, EntryName = "X" } } } }; // Act var message = Formatter.GetWorstGameweekEntry(league, gameweek); // Assert Assert.Equal("💩 <https://fantasy.premierleague.com/entry/6/event/1|X> only got 5 points. Wow.", message); }