public static async Task <FoldingStatus> GetFoldingStats(string teamId)
        {
            FoldingStatus stats  = null;
            var           client = new HttpClient();

            try {
                var response = await client.GetAsync($"https://stats.foldingathome.org/api/team/{teamId}");

                var currentDate     = DateTime.UtcNow;
                var monthlyStatsURI = $"https://stats.foldingathome.org/api/teams-monthly?search_type=exact&team={teamId}&month={currentDate.Month}&year={currentDate.Year}";

                var statsJson = await response.Content.ReadAsStringAsync();

                response.Dispose();
                stats = JsonConvert.DeserializeObject <FoldingStatus>(statsJson);

                var monthlyStatsResponse = await client.GetAsync(monthlyStatsURI);

                string monthlyStatsJson = await monthlyStatsResponse.Content.ReadAsStringAsync();

                monthlyStatsResponse.Dispose();

                var monthlyStats = JObject.Parse(monthlyStatsJson);
                stats.MonthlyRank   = (int)monthlyStats.SelectToken("results[0].rank");
                stats.RetrievalTime = DateTime.UtcNow;
            } catch (Exception) {
                throw;
            } finally {
                client.Dispose();
            }
            return(stats);
        }
        public async Task GetFoldingStats(CommandContext context)
        {
            await context.TriggerTypingAsync();

            FoldingStatus stats = await FoldingModule.GetFoldingStats("265832");

            if (stats != null)
            {
                await context.RespondAsync(
                    $"```University of Bayes F@H Statistics {stats.Last:yyyy-MM-dd HH:mm:ss}\n" +
                    $"Current rank: {stats.Rank:N0} overall\n" +
                    $"Monthly rank: {stats.MonthlyRank:N0}\n" +
                    $"Team credit: {stats.Credit:N0}\n" +
                    $"WUs folded: {stats.WorkUnits:N0}\n" +
                    $"Team members: {stats.Donors.Count:N0}\n" +
                    $"Average credit per WU: {stats.Credit / stats.WorkUnits:N0}\n" +
                    "```<https://stats.foldingathome.org/team/265832>"
                    );
            }
            else
            {
                await context.RespondAsync("Error trying to fetch the F@H stats.");
            }
        }
        public async Task PostUpdate()
        {
            foreach (var item in this._config.GuildConfigs.Where(y => !string.IsNullOrEmpty(y.Value.FoldingTeam)))
            {
                FoldingStatus stats = null;
                try {
                    stats = await GetFoldingStats(item.Value.FoldingTeam);
                } catch (Exception ex) {
                    await this._client.Guilds[item.Key].Channels[item.Value.FoldingChannel].SendMessageAsync(
                        "[Encountered an error trying to get statistics.]"
                        );
                    this._client.Logger.LogError(LogEvent.Folding, ex, $"Could not retrieve F@H data.");
                    return;
                }
                bool hasPreviousValue = false;

                var header       = $"```{stats.Name} F@H Statistics {stats.Last:yyyy-MM-dd HH:mm:ss}";
                var teamCredit   = $"Team credit: {stats.Credit:N0}";
                var currentRank  = $"Current rank: {stats.Rank:N0} overall";
                var monthlyRank  = $"Monthly rank: {stats.MonthlyRank:N0}";
                var workUnits    = $"WUs folded: {stats.WorkUnits:N0}";
                var members      = $"Team members: {stats.Donors.Count:N0}";
                var creditsPerWU = $"Average credit per WU: {stats.Credit / stats.WorkUnits:N0}";
                var footer       = $"```<https://stats.foldingathome.org/team/{item.Value.FoldingTeam}>";

                if (this._previousStats.ContainsKey(stats.Team))
                {
                    var prevStatus = this._previousStats[stats.Team];
                    hasPreviousValue = true;
                    teamCredit      += $" ({stats.Credit - prevStatus.Credit:+#;-#;+0})";
                    currentRank     += $" ({stats.Rank - prevStatus.Rank:+#;-#;+0})";
                    monthlyRank     += $" ({stats.MonthlyRank - prevStatus.MonthlyRank:+#;-#;+0})";
                    workUnits       += $" ({stats.WorkUnits - prevStatus.WorkUnits:+#;-#;+0})";
                    members         += $" ({stats.Donors.Count - prevStatus.Donors.Count:+#;-#;+0})";
                }

                try {
                    await this._client.Guilds[item.Key].Channels[item.Value.FoldingChannel].SendMessageAsync(
                        header + "\n" +
                        teamCredit + "\n" +
                        currentRank + "\n" +
                        monthlyRank + "\n" +
                        workUnits + "\n" +
                        members + "\n" +
                        creditsPerWU + "\n" +
                        footer
                        );
                } catch (Exception ex) {
                    this._client.Logger.LogError(LogEvent.Folding, ex, $"Could not post F@H update.");
                }
                if (!hasPreviousValue)
                {
                    this._previousStats.Add(stats.Team, stats);
                }
                else
                {
                    this._previousStats[stats.Team] = stats;
                }
            }
            JsonUtility.Serialize(
                Path.Join(this._config.ConfigDirectory, "foldingdata.json"),
                this._previousStats
                );
        }