Beispiel #1
0
    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);
        }
Beispiel #3
0
        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());
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
    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.");
    }
Beispiel #7
0
    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;
    }
Beispiel #9
0
        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();
        }
Beispiel #11
0
    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);
    }
Beispiel #12
0
        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);
 }
Beispiel #16
0
        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);
        }
Beispiel #18
0
    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);
    }