Beispiel #1
0
        public static void CheckInactives(List <ClanMember> currentPlayers)
        {
            foreach (var player in currentPlayers)
            {
                var lastSeen = DateTime.Parse(StandardizeDateTime(player.LastSeen));
                var numDays  = DateTime.UtcNow.Subtract(lastSeen).Days;

                if (numDays > 3)
                {
                    FlagHelper.FlagPlayer(player.Name, $"Inactive for {numDays} days");
                }
            }
        }
Beispiel #2
0
        public static async Task DoWork(string apiToken, string sendGridToken)
        {
            Helper.Init(apiToken, sendGridToken);

            var currentPlayers = await ApiHelper.GetClanPlayers(Helper.HttpClient);

            string raceStats = await Helper.GetRiverRaceStats(currentPlayers);

            Helper.CheckInactives(currentPlayers);

            var results = raceStats + "\n\n" + FlagHelper.ToResults();
            await Helper.EmailResults(results);

            Helper.Dispose();
        }
Beispiel #3
0
        public static async Task <string> GetRiverRaceStats(List <ClanMember> currentPlayers)
        {
            var riverRaceLog = await ApiHelper.GetRiverRaceLog(HttpClient);

            var currentRiverRace = await ApiHelper.GetCurrentRiverRace(HttpClient);

            // Use player tag to uniquely identify.
            var pointsAccumulated = new Dictionary <string, int>();
            var racesParticipated = new Dictionary <string, int>();
            var racesMissed       = new Dictionary <string, int>();

            var allResults = riverRaceLog.Items.SelectMany(i => i.Standings.Where(s => s.Clan.Tag == ApiHelper.CLAN_TAG)).ToList();

            // Include the current race if we have already finished it.
            if (!string.IsNullOrEmpty(currentRiverRace.Clan.FinishTime))
            {
                allResults.Add(currentRiverRace);
            }

            // Accumulate stats across past races.
            foreach (var raceResult in allResults)
            {
                foreach (var participant in raceResult.Clan.Participants)
                {
                    // Skip if they aren't still in the clan.
                    if (!currentPlayers.Any(p => p.Tag == participant.Tag))
                    {
                        continue;
                    }

                    var points = participant.Fame + participant.RepairPoints;

                    // Track total points gained.
                    if (pointsAccumulated.ContainsKey(participant.Tag))
                    {
                        pointsAccumulated[participant.Tag] += points;
                    }
                    else
                    {
                        pointsAccumulated[participant.Tag] = points;
                    }

                    // Track number of races participated (for averaging points).
                    if (racesParticipated.ContainsKey(participant.Tag))
                    {
                        racesParticipated[participant.Tag]++;
                    }
                    else
                    {
                        racesParticipated[participant.Tag] = 1;
                    }

                    // Track inactive races.
                    if (points == 0)
                    {
                        if (racesMissed.ContainsKey(participant.Tag))
                        {
                            racesMissed[participant.Tag]++;
                        }
                        else
                        {
                            racesMissed[participant.Tag] = 1;
                        }
                    }
                }
            }

            // Flag any players that missed races.
            foreach (var kvp in racesMissed)
            {
                var player = currentPlayers.FirstOrDefault(predicate => predicate.Tag == kvp.Key);
                if (player != null)
                {
                    FlagHelper.FlagPlayer(player.Name, $"Didn't participate in {kvp.Value} of {allResults.Count} recent river races");
                }
            }

            // Create the results.
            string result = $"--- Avg Points in Last {allResults.Count} River Races ---\n";

            var sortedByAveragePoints = pointsAccumulated.Select(kvp => new
            {
                Tag     = kvp.Key,
                Total   = kvp.Value,
                Average = (float)kvp.Value / racesParticipated[kvp.Key]
            })
                                        .OrderByDescending(i => i.Average).ToList();

            foreach (var kvp in sortedByAveragePoints)
            {
                var player = currentPlayers.FirstOrDefault(predicate => predicate.Tag == kvp.Tag);
                if (player != null)
                {
                    result += $"{player.Name}: {kvp.Average:0.00} ({kvp.Total} / {racesParticipated[kvp.Tag]})\n";
                }
            }

            return(result);
        }