/// <summary> /// Clears the cache of a team /// </summary> /// <param name="teamName">Team Name</param> /// <param name="c">DB Context</param> /// <param name="guildId">Discord Guild Id</param> /// <returns>Empty Cache</returns> public static SeasonTeamCardCache ClearTeamCache(string teamName, DBContext c, long guildId) { if (c == null) { throw new ArgumentNullException(nameof(c)); } SeasonTeamCardCache stcc = c.SeasonTeamCardCache.FirstOrDefault(stcc => stcc.TeamName.Equals(teamName, StringComparison.CurrentCultureIgnoreCase) && stcc.DiscordGuildId == guildId); if (stcc == null) { stcc = new SeasonTeamCardCache() { AverageAccuracy = 0, AverageCombo = 0, AverageGeneralPerformanceScore = 0, AverageScore = 0, AverageMisses = 0, AverageOverallRating = 0, DiscordGuildId = guildId, LastUpdated = DateTime.MinValue, MVPName = "", TeamName = "", TotalMatchMVPs = 0 }; stcc = c.SeasonTeamCardCache.Add(stcc).Entity; c.SaveChanges(); return(stcc); } stcc.AverageAccuracy = 0; stcc.AverageCombo = 0; stcc.AverageGeneralPerformanceScore = 0; stcc.AverageScore = 0; stcc.AverageMisses = 0; stcc.AverageOverallRating = 0; stcc.DiscordGuildId = guildId; stcc.LastUpdated = DateTime.MinValue; stcc.MVPName = ""; stcc.TeamName = ""; stcc.TotalMatchMVPs = 0; stcc = c.SeasonTeamCardCache.Update(stcc).Entity; c.SaveChanges(); return(stcc); }
private static void OnTeamProfile(DiscordHandler client, CommandEventArg args) { (string, long)userParsed = TryParseIdOrUsernameString(args.Parameters); string teamName = userParsed.Item1; SeasonTeamCardCache stcc = GetTeam(args.Guild, teamName); if (stcc == null) { client.SendSimpleEmbed(args.Channel, "Could not find team " + teamName).ConfigureAwait(false); return; } args.Channel.SendMessageAsync(embed: GetTeamEmbed(stcc.TeamName, stcc.AverageAccuracy, (int)stcc.AverageScore, stcc.AverageMisses, (int)stcc.AverageCombo, stcc.AverageGeneralPerformanceScore, stcc.TotalMatchMVPs, stcc.AverageOverallRating, stcc.TeamRating, stcc.MVPName)); }
public string GetTeamProfile(long discordGuildId, string teamName) { if (string.IsNullOrEmpty(teamName)) { return(new ApiResponse(System.Net.HttpStatusCode.BadRequest, "Teamname cannot be empty")); } using DBContext c = new DBContext(); SeasonTeamCardCache cc = c.SeasonTeamCardCache.FirstOrDefault(t => t.TeamName.Equals(teamName, StringComparison.CurrentCultureIgnoreCase) && t.DiscordGuildId == discordGuildId); if (cc == null) { return(new ApiResponse(System.Net.HttpStatusCode.NotFound, "Team not found")); } return(new ApiObject <TeamCard>(cc)); }
/// <summary> /// Refreshes or adds a cache for a player /// </summary> /// <param name="teamName">Team Name</param> /// <param name="c">DB Context</param> /// <param name="guildId">Discord Guild Id</param> public static void ForceRefreshTeamCache(string teamName, DBContext c, long guildId) { if (c == null) { throw new ArgumentNullException(nameof(c)); } SeasonTeamCardCache stcc = ClearTeamCache(teamName, c, guildId); List <SeasonResult> results = c.SeasonResult.Where(r => r.DiscordGuildId == guildId && r.LosingTeam.Equals(teamName, StringComparison.CurrentCultureIgnoreCase) || r.WinningTeam.Equals(teamName, StringComparison.CurrentCultureIgnoreCase)).ToList(); if (results.Count == 0) { c.SeasonTeamCardCache.Remove(stcc); c.SaveChanges(); return; } return; Dictionary <long, int> userMvps = new Dictionary <long, int>(); double avgAcc = 0, avgScore = 0, avgMisses = 0, avgCombo = 0, avgRating = 0, avgGPS = 0, matchMVPs = 0; int counter = 0; for (int r = 0; r < results.Count; r++) { List <SeasonScore> scores = c.SeasonScore.Where(s => s.SeasonResultId == results[r].Id && s.TeamName.Equals(teamName, StringComparison.CurrentCultureIgnoreCase)).ToList(); if (scores.Count == 0) { continue; } double /*acc = 0, score = 0, misses = 0, combo = 0, gps = 0,*/ mvps = 0; for (int s = 0; s < scores.Count; s++) { if (!userMvps.Keys.Contains(scores[s].SeasonPlayerId)) { userMvps.Add(scores[s].SeasonPlayerId, scores[s].HighestGeneralPerformanceScore ? 1 : 0); } else if (scores[s].HighestGeneralPerformanceScore) { userMvps[scores[s].SeasonPlayerId]++; } avgAcc += scores[s].Accuracy; avgScore += scores[s].Score; avgMisses += scores[s].CountMiss; avgCombo += scores[s].MaxCombo; avgGPS += scores[s].GeneralPerformanceScore; if (scores[s].HighestGeneralPerformanceScore) { mvps++; } } avgAcc /= scores.Count; avgScore /= scores.Count; avgMisses /= scores.Count; avgCombo /= scores.Count; avgGPS /= scores.Count; matchMVPs += mvps; counter++; } avgAcc /= counter; avgScore /= counter; avgCombo /= counter; avgGPS /= counter; List <SeasonPlayer> players = c.SeasonPlayer.Where(p => p.DiscordGuildId == guildId && userMvps.Keys.Contains(p.Id)).ToList(); List <SeasonPlayerCardCache> cardCaches = c.SeasonPlayerCardCache.Where(spcc => spcc.DiscordGuildId == guildId).ToList() .Where(spcc => players.Any(p => p.OsuUserId == spcc.OsuUserId)).ToList(); for (int i = 0; i < cardCaches.Count; i++) { avgRating += cardCaches[i].OverallRating; } avgRating /= cardCaches.Count; stcc.TeamName = teamName; stcc.TotalMatchMVPs = (int)matchMVPs; stcc.AverageOverallRating = avgRating; stcc.AverageGeneralPerformanceScore = avgGPS; stcc.AverageAccuracy = avgAcc; stcc.AverageScore = avgScore; stcc.AverageMisses = avgMisses; stcc.AverageCombo = avgCombo; long playerId = userMvps.FirstOrDefault(m => m.Value == userMvps.Max(mp => mp.Value)).Key; long osuUserId = players.FirstOrDefault(p => p.Id == playerId).OsuUserId; stcc.MVPName = cardCaches.FirstOrDefault(cc => cc.OsuUserId == osuUserId)?.Username ?? "null"; stcc.TeamRating = avgRating + (0.25 * matchMVPs) + (avgGPS / 2); stcc.LastUpdated = DateTime.UtcNow; c.SeasonTeamCardCache.Update(stcc); c.SaveChanges(); }