Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        /// <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();
        }