Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        /// <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();
        }