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 ); }