public string GetProfile(long discordGuildId, long osuUserId) { using DBContext c = new DBContext(); SeasonPlayerCardCache cc = c.SeasonPlayerCardCache.FirstOrDefault(p => p.OsuUserId == osuUserId && p.DiscordGuildId == discordGuildId); if (cc == null) { return(new ApiResponse(System.Net.HttpStatusCode.NotFound, "User not found")); } return(new ApiObject <PlayerCard>(cc)); }
/// <summary> /// Clears the cache of a player /// </summary> /// <param name="osuUserId">Osu User Id</param> /// <param name="c">DB Context</param> /// <param name="guildId">Discord Guild Id</param> /// <returns>Empty Cache</returns> public static SeasonPlayerCardCache ClearPlayerCache(long osuUserId, DBContext c, long guildId) { if (c == null) { throw new ArgumentNullException(nameof(c)); } SeasonPlayerCardCache cardCache = c.SeasonPlayerCardCache.FirstOrDefault(cc => cc.OsuUserId == osuUserId && cc.DiscordGuildId == guildId); if (cardCache == null) { cardCache = c.SeasonPlayerCardCache.Add(new SeasonPlayerCardCache() { OsuUserId = osuUserId, AverageAccuracy = 0, AverageCombo = 0, AverageMisses = 0, AveragePerformance = 0, AverageScore = 0, LastUpdated = DateTime.UtcNow, MatchMvps = 0, OverallRating = 0, TeamName = "null", Username = "******", DiscordGuildId = 0, }).Entity; c.SaveChanges(); return(cardCache); } cardCache.AverageAccuracy = 0; cardCache.AverageCombo = 0; cardCache.AverageMisses = 0; cardCache.AveragePerformance = 0; cardCache.AverageScore = 0; cardCache.LastUpdated = DateTime.UtcNow; cardCache.MatchMvps = 0; cardCache.OverallRating = 0; cardCache.TeamName = "null"; cardCache.Username = "******"; cardCache.DiscordGuildId = 0; cardCache = c.SeasonPlayerCardCache.Update(cardCache).Entity; c.SaveChanges(); return(cardCache); }
private static void OnPlayerProfile(DiscordHandler client, CommandEventArg args) { try { using DBContext c = new DBContext(); (string, long)userParsed = TryParseIdOrUsernameString(args.Parameters); long osuUserId = -1; if (userParsed.Item1 != null) { osuUserId = c.SeasonPlayer.FirstOrDefault(sp => sp.LastOsuUsername.Equals(userParsed.Item1, StringComparison.CurrentCultureIgnoreCase) && sp.DiscordGuildId == (long)args.Guild.Id).OsuUserId; } else if (userParsed.Item2 != -1) { osuUserId = userParsed.Item2; } if (osuUserId == -1) { client.SendSimpleEmbed(args.Channel, "Could not find player " + osuUserId).ConfigureAwait(false); return; } SeasonPlayerCardCache spcc = GetPlayer(args.Guild, osuUserId); if (spcc == null) { client.SendSimpleEmbed(args.Channel, "Could not find player " + osuUserId).ConfigureAwait(false); return; } args.Channel.SendMessageAsync(embed: GetPlayerEmbed(spcc.Username, spcc.TeamName, spcc.OsuUserId, spcc.AverageAccuracy, (int)spcc.AverageScore, spcc.AverageMisses, (int)spcc.AverageCombo, spcc.AveragePerformance, spcc.MatchMvps, spcc.OverallRating)); } catch (Exception) { client.SendSimpleEmbed(args.Channel, "Profile not found").ConfigureAwait(false); } }
/// <summary> /// Refreshes or adds a cache for a player /// </summary> /// <param name="osuUserId">Osu User Id</param> /// <param name="c">DB Context</param> /// <param name="guildId">Discord Guild Id</param> /// <param name="getOverallRatingAction">Function to calculate the overall rating</param> public static void ForceRefreshPlayerCache(long osuUserId, DBContext c, long guildId, Func <SeasonPlayer, DBContext, double> getOverallRatingAction) { if (c == null) { throw new ArgumentNullException(nameof(c)); } else if (getOverallRatingAction == null) { throw new ArgumentNullException(nameof(getOverallRatingAction)); } SeasonPlayerCardCache cardCache = ClearPlayerCache(osuUserId, c, guildId); SeasonPlayer player = c.SeasonPlayer.FirstOrDefault(p => p.OsuUserId == osuUserId && p.DiscordGuildId == guildId); if (player == null) { return; } List <SeasonResult> results = c.SeasonResult.Where(sr => sr.DiscordGuildId == guildId).ToList(); if (results.Count == 0) { c.SeasonPlayerCardCache.Remove(cardCache); c.SaveChanges(); return; } List <long> resultIds = results.Select(r => r.Id).ToList(); List <SeasonScore> scores = c.SeasonScore.Where(s => s.SeasonPlayerId == player.Id).ToList(); scores = scores.Where(s => resultIds.Contains(s.SeasonResultId)).ToList(); cardCache.DiscordGuildId = guildId; foreach (SeasonScore score in scores) { cardCache.AverageAccuracy += score.Accuracy; cardCache.AverageCombo += score.MaxCombo; cardCache.AverageMisses += score.CountMiss; cardCache.AverageScore += score.Score; cardCache.AveragePerformance += score.GeneralPerformanceScore; if (score.HighestGeneralPerformanceScore) { cardCache.MatchMvps++; } } if (cardCache.AverageAccuracy > 0) { cardCache.AverageAccuracy /= scores.Count; } if (cardCache.AverageCombo > 0) { cardCache.AverageCombo /= scores.Count; } if (cardCache.AverageMisses > 0) { cardCache.AverageMisses /= scores.Count; } if (cardCache.AverageScore > 0) { cardCache.AverageScore /= scores.Count; } if (cardCache.AveragePerformance > 0) { cardCache.AveragePerformance /= scores.Count; cardCache.OverallRating = getOverallRatingAction(player, c); } cardCache.LastUpdated = DateTime.UtcNow; cardCache.TeamName = player.TeamName; cardCache.Username = player.LastOsuUsername ?? "not found"; c.SeasonPlayerCardCache.Update(cardCache); c.SaveChanges(); }