private void CalculateWinsAndLosses(HearthStatsDbContext context, Expression <Func <ArenaSession, bool> > filter)
        {
            var arenas = context.ArenaSessions.Where(filter);

            if (!arenas.Any())
            {
                WinsAndLosses.Add(new StatModel("Wins", 0));
                WinsAndLosses.Add(new StatModel("Losses", 0));
                return;
            }

            float total  = arenas.Sum(a => a.Wins + a.Losses);
            float wins   = arenas.Sum(a => a.Wins);
            float losses = arenas.Sum(a => a.Losses);

            WinsAndLosses.Clear();
            if (total <= 0)
            {
                WinsAndLosses.Add(new StatModel("Wins", 0));
                WinsAndLosses.Add(new StatModel("Losses", 0));
                return;
            }

            WinsAndLosses.Add(new StatModel(string.Format("Wins: {0}", wins), wins / total * 100));
            WinsAndLosses.Add(new StatModel(string.Format("Losses: {0}", losses), losses / total * 100));
        }
Ejemplo n.º 2
0
        private void CalculateHeroesPlayed(HearthStatsDbContext context, Expression <Func <GameResult, bool> > filter)
        {
            var games = context.Games;

            heroesPlayed.Clear();
            opponentHeroesPlayed.Clear();
            var total = games.Where(filter).Count();

            if (total == 0)
            {
                return;
            }
            var heroestats = games
                             .Where(filter)
                             .GroupBy(x => x.Hero)
                             .Where(x => x.Any())
                             .Select(
                x => new
            {
                x.Key,
                x.Key.ClassName,
                Count = x.Count()
            }).ToList();

            var oppheroestats = games
                                .Where(filter)
                                .GroupBy(x => x.OpponentHero)
                                .Where(x => x.Any())
                                .Select(
                x => new
            {
                x.Key,
                x.Key.ClassName,
                Count = x.Count()
            }).ToList();

            heroesPlayed.IsNotifying = false;
            foreach (var hero in heroestats)
            {
                // float count = games.Where(filter).Count(x => x.Hero != null && x.Hero.Key == hero.Key);
                if (hero.Count > 0)
                {
                    heroesPlayed.Add(new StatModel(string.Format("{0}: {1}", hero.ClassName, hero.Count), (float)hero.Count / total * 100, hero.Key.GetBrush()));
                }
            }
            heroesPlayed.IsNotifying = true;
            heroesPlayed.Refresh();

            opponentHeroesPlayed.IsNotifying = false;
            foreach (var hero in oppheroestats)
            {
                //count = games.Where(filter).Count(x => x.OpponentHero != null && x.OpponentHero.Key == hero.Key);
                if (hero.Count > 0)
                {
                    opponentHeroesPlayed.Add(new StatModel(string.Format("{0}: {1}", hero.ClassName, hero.Count), (float)hero.Count / total * 100, hero.Key.GetBrush()));
                }
            }
            opponentHeroesPlayed.IsNotifying = true;
            opponentHeroesPlayed.Refresh();
        }
        private void CalculateHeroesPlayed(HearthStatsDbContext context, Expression <Func <ArenaSession, bool> > filter)
        {
            var arenas = context.ArenaSessions.Where(filter);

            heroesPlayed.IsNotifying = false;
            heroesPlayed.Clear();

            var total = arenas.Count();

            if (total == 0)
            {
                return;
            }

            var heroestats = arenas.GroupBy(x => x.Hero).Where(x => x.Any()).Select(
                x => new
            {
                x.Key,
                x.Key.ClassName,
                Count = x.Count()
            }).ToList();

            foreach (var hero in heroestats)
            {
                if (hero.Count > 0)
                {
                    heroesPlayed.Add(new StatModel(string.Format("{0}: {1}", hero.ClassName, hero.Count), (float)hero.Count / total * 100, hero.Key.GetBrush()));
                }
            }

            heroesPlayed.IsNotifying = true;
            heroesPlayed.Refresh();
        }
Ejemplo n.º 4
0
        private void InitializeDatabase()
        {
            // Only seed when needed
            var dataDir = (string)AppDomain.CurrentDomain.GetData("DataDirectory");
            var seedFile = Path.Combine(dataDir, "db.seed");
            int currentSeed = 0;
            if (File.Exists(seedFile))
            {
                int.TryParse(File.ReadAllText(seedFile), out currentSeed);
            }
            if (currentSeed < Configuration.SeedVersion)
            {
                using (var context = new HearthStatsDbContext())
                {
                    new DbInitializer().InitializeDatabase(context);
                }

                File.WriteAllText(seedFile, Configuration.SeedVersion.ToString(CultureInfo.InvariantCulture));
            }
            else
            {
                Task.Run(
                    () =>
                    {
                        using (var context = new HearthStatsDbContext())
                        {
                        }
                    });
            }
        }
Ejemplo n.º 5
0
        private void CalculateHeroesWinrate(HearthStatsDbContext context, List <GameResult> allGames)
        {
            var heroGroups = allGames.GroupBy(x => x.Hero);

            foreach (var heroGroup in heroGroups)
            {
                var weekGroups = heroGroup
                                 .Select(
                    g => new
                {
                    Game = g,
                    Year = g.Started.Year,
                    Week =
                        CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(g.Started, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday),
                    Date = g.Started.Date
                })
                                 // .GroupBy(x => new { x.Date })
                                 // .OrderBy(x => x.Key.Date)
                                 .GroupBy(x => new { x.Year, x.Week })
                                 .OrderBy(x => x.Key.Year).ThenBy(x => x.Key.Week)
                                 .Select(
                    (g, i) => new
                {
                    WeekGroup    = g,
                    WeekNum      = i + 1,
                    Year         = g.Key.Year,
                    CalendarWeek = g.Key.Week,
                    //Date = g.Key.Date,
                    Wins   = g.Sum(x => x.Game.Victory ? 1 : 0),
                    Losses = g.Sum(x => x.Game.Victory ? 0 : 1),
                    Total  = g.Count()
                });
                var winrateDataPoints = new List <DateValue>();
                foreach (var weekGroup in weekGroups)
                {
                    winrateDataPoints.Add(
                        new DateValue(FirstDateOfWeek(weekGroup.Year, weekGroup.CalendarWeek), weekGroup.Wins / (double)weekGroup.Total));
                    // winrateDataPoints.Add(new DateValue(weekGroup.Date, weekGroup.Wins / (double)weekGroup.Total));
                }
                var color = heroGroup.Key.GetColor();
                PlotModel.Series.Add(
                    new LineSeries()
                {
                    Title        = heroGroup.Key.ClassName,
                    ItemsSource  = winrateDataPoints,
                    MarkerStroke = OxyColors.Black,
                    MarkerType   = MarkerType.Circle,
                    DataFieldX   = "Date",
                    DataFieldY   = "Value",
                    Smooth       = true,
                    Color        = OxyColor.FromArgb(color.A, color.R, color.G, color.B)
                });
            }
        }
Ejemplo n.º 6
0
        private void CalculateWinsAndLosses(HearthStatsDbContext context, Expression <Func <GameResult, bool> > filter)
        {
            var   games    = context.Games;
            float total    = games.Where(filter).Count();
            float winsC    = games.Where(filter).Count(x => x.Victory && !x.GoFirst);
            float lossesC  = games.Where(filter).Count(x => !x.Victory && !x.GoFirst);
            float winsNC   = games.Where(filter).Count(x => x.Victory && x.GoFirst);
            float lossesNC = games.Where(filter).Count(x => !x.Victory && x.GoFirst);
            var   wins     = winsC + winsNC;
            var   losses   = lossesC + lossesNC;

            WinsAndLosses.Clear();
            Wins.Clear();
            Losses.Clear();
            WithCoin.Clear();
            WithoutCoin.Clear();
            if (total <= 0)
            {
                WinsAndLosses.Add(new StatModel("Wins", 0));
                WinsAndLosses.Add(new StatModel("Losses", 0));
                Wins.Add(new StatModel("Coin", 0));
                Wins.Add(new StatModel("No coin", 0));
                Losses.Add(new StatModel("Coin", 0));
                Losses.Add(new StatModel("No coin", 0));
                WithCoin.Add(new StatModel("Losses", 0));
                WithCoin.Add(new StatModel("Losses", 0));
                WithoutCoin.Add(new StatModel("Losses", 0));
                WithoutCoin.Add(new StatModel("Losses", 0));

                return;
            }

            WinsAndLosses.Add(new StatModel(string.Format("Wins: {0}", wins), wins / total * 100));
            WinsAndLosses.Add(new StatModel(string.Format("Losses: {0}", losses), losses / total * 100));

            Wins.Add(new StatModel(string.Format("Coin: {0}", winsC), winsC / wins * 100));
            Wins.Add(new StatModel(string.Format("No coin: {0}", winsNC), winsNC / wins * 100));

            Losses.Add(new StatModel(string.Format("Coin: {0}", lossesC), lossesC / losses * 100));
            Losses.Add(new StatModel(string.Format("No coin: {0}", lossesNC), lossesNC / losses * 100));

            WithCoin.Add(new StatModel(string.Format("Wins: {0}", winsC), winsC / (winsC + lossesC) * 100));
            WithCoin.Add(new StatModel(string.Format("Losses: {0}", lossesC), lossesC / (winsC + lossesC) * 100));

            WithoutCoin.Add(new StatModel(string.Format("Wins: {0}", winsNC), winsNC / (winsNC + lossesNC) * 100));
            WithoutCoin.Add(new StatModel(string.Format("Losses: {0}", lossesNC), lossesNC / (winsNC + lossesNC) * 100));
        }
Ejemplo n.º 7
0
        private void GetStatsSince(HearthStatsDbContext context, DateTime start, out decimal numGames, out decimal numWon, out decimal numLoss)
        {
            GameMode gameMode;
            var      filterGameMode = Enum.TryParse(LatestGamesViewModel.FilterGameMode, out gameMode);
            var      heroId         = Guid.Empty;
            var      filterHero     = LatestGamesViewModel.FilterHero != null && !String.IsNullOrEmpty(LatestGamesViewModel.FilterHero.Key);

            if (filterHero)
            {
                heroId = LatestGamesViewModel.FilterHero.Id;
            }
            var oppHeroId     = Guid.Empty;
            var filterOppHero = LatestGamesViewModel.FilterOpponentHero != null && !String.IsNullOrEmpty(LatestGamesViewModel.FilterOpponentHero.Key);

            if (filterOppHero)
            {
                oppHeroId = LatestGamesViewModel.FilterOpponentHero.Id;
            }
            var deckId     = Guid.Empty;
            var filterDeck = LatestGamesViewModel.FilterDeck != null && !String.IsNullOrEmpty(LatestGamesViewModel.FilterDeck.Key);

            if (filterDeck)
            {
                deckId = LatestGamesViewModel.FilterDeck.Id;
            }

            numGames = context.Games.Count(
                x => x.Started > start &&
                (!filterGameMode || (filterGameMode && x.GameMode == gameMode)) &&
                (!filterHero || (filterHero && x.Hero.Id == heroId)) &&
                (!filterOppHero || (filterOppHero && x.OpponentHero.Id == oppHeroId)) &&
                (!filterDeck || (filterDeck && x.Deck.Id == deckId)));
            numWon = context.Games.Count(
                x => x.Started > start && x.Victory &&
                (!filterGameMode || (filterGameMode && x.GameMode == gameMode)) &&
                (!filterHero || (filterHero && x.Hero.Id == heroId)) &&
                (!filterOppHero || (filterOppHero && x.OpponentHero.Id == oppHeroId)) &&
                (!filterDeck || (filterDeck && x.Deck.Id == deckId)));
            numLoss = context.Games.Count(
                x => x.Started > start && !x.Victory &&
                (!filterGameMode || (filterGameMode && x.GameMode == gameMode)) &&
                (!filterHero || (filterHero && x.Hero.Id == heroId)) &&
                (!filterOppHero || (filterOppHero && x.OpponentHero.Id == oppHeroId)) &&
                (!filterDeck || (filterDeck && x.Deck.Id == deckId)));
        }
        private void CalculateWinRatios(HearthStatsDbContext context, Expression <Func <ArenaSession, bool> > filter)
        {
            var arenas = context.ArenaSessions.Where(filter);
            // float total = results.Sum(a => a.Games.Count);
            float wins2  = arenas.Count(a => a.Wins <= 2);
            float wins3  = arenas.Count(a => a.Wins == 3);
            float wins4  = arenas.Count(a => a.Wins >= 4 && a.Wins <= 6);
            float wins7  = arenas.Count(a => a.Wins >= 7 && a.Wins <= 11);
            float wins12 = arenas.Count(a => a.Wins == 12);

            WinRatios.IsNotifying = false;
            WinRatios.Clear();
            WinRatios.Add(new StatModel("0-2", wins2));
            WinRatios.Add(new StatModel("3", wins3));
            WinRatios.Add(new StatModel("4-6", wins4));
            WinRatios.Add(new StatModel("7-11", wins7));
            WinRatios.Add(new StatModel("12", wins12));
            WinRatios.IsNotifying = true;
            WinRatios.Refresh();
        }
Ejemplo n.º 9
0
        private void CalculateRatios(HearthStatsDbContext context)
        {
            var     now   = DateTime.Now;
            var     start = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
            decimal numGames;
            decimal numWon;
            decimal numLoss;

            GetStatsSince(context, start, out numGames, out numWon, out numLoss);

            if (numGames > 0)
            {
                TodayRatioWin  = Math.Round((numWon / numGames) * 100, 0);
                TodayRatioLoss = Math.Round((numLoss / numGames) * 100, 0);
            }
            else
            {
                TodayRatioWin  = 0;
                TodayRatioLoss = 0;
            }

            start = now.StartOfWeek(DayOfWeek.Monday);
            GetStatsSince(context, start, out numGames, out numWon, out numLoss);
            if (numGames > 0)
            {
                ThisWeekRatioWin  = Math.Round((numWon / numGames) * 100, 0);
                ThisWeekRatioLoss = Math.Round((numLoss / numGames) * 100, 0);
            }
            else
            {
                ThisWeekRatioWin  = 0;
                ThisWeekRatioLoss = 0;
            }

            start = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
            GetStatsSince(context, start, out numGames, out numWon, out numLoss);
            if (numGames > 0)
            {
                ThisMonthRatioWin  = Math.Round((numWon / numGames) * 100, 0);
                ThisMonthRatioLoss = Math.Round((numLoss / numGames) * 100, 0);
            }
            else
            {
                ThisMonthRatioWin  = 0;
                ThisMonthRatioLoss = 0;
            }

            start = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
            start = start.AddDays(-7);
            GetStatsSince(context, start, out numGames, out numWon, out numLoss);
            if (numGames > 0)
            {
                Last7DaysRatioWin  = Math.Round((numWon / numGames) * 100, 0);
                Last7DaysRatioLoss = Math.Round((numLoss / numGames) * 100, 0);
            }
            else
            {
                Last7DaysRatioWin  = 0;
                Last7DaysRatioLoss = 0;
            }

            start = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
            start = start.AddDays(-30);
            GetStatsSince(context, start, out numGames, out numWon, out numLoss);
            if (numGames > 0)
            {
                Last30DaysRatioWin  = Math.Round((numWon / numGames) * 100, 0);
                Last30DaysRatioLoss = Math.Round((numLoss / numGames) * 100, 0);
            }
            else
            {
                Last30DaysRatioWin  = 0;
                Last30DaysRatioLoss = 0;
            }
        }
Ejemplo n.º 10
0
        private void CalculateWinrate(HearthStatsDbContext context, List <GameResult> allGames)
        {
            var weekGroups = allGames
                             .Select(
                g => new
            {
                Game = g, g.Started.Year,
                Week =
                    CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(g.Started, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday),
                g.Started.Date
            })
                             // .GroupBy(x => new { x.Date })
                             // .OrderBy(x => x.Key.Date)
                             .GroupBy(x => new { x.Year, x.Week })
                             .OrderBy(x => x.Key.Year).ThenBy(x => x.Key.Week)
                             .Select(
                (g, i) => new
            {
                WeekGroup    = g,
                WeekNum      = i + 1, g.Key.Year,
                CalendarWeek = g.Key.Week,
                //Date = g.Key.Date,
                Wins   = g.Sum(x => x.Game.Victory ? 1 : 0),
                Losses = g.Sum(x => x.Game.Victory ? 0 : 1),
                Total  = g.Count()
            });
            var dayGroups = allGames
                            .Select(
                g => new
            {
                Game = g, g.Started.Date
            })
                            // .GroupBy(x => new { x.Date })
                            // .OrderBy(x => x.Key.Date)
                            .GroupBy(x => x.Date)
                            .OrderBy(x => x.Key)
                            .Select(
                (g, i) => new
            {
                WeekGroup = g, g.Key.Date,
                Wins      = g.Sum(x => x.Game.Victory ? 1 : 0),
                Losses    = g.Sum(x => x.Game.Victory ? 0 : 1),
                Total     = g.Count()
            });
            var winrateDataPoints    = new List <DateValue>();
            var winrateAvgDataPoints = new List <DateValue>();

            foreach (var weekGroup in weekGroups)
            {
                winrateDataPoints.Add(new DateValue(FirstDateOfWeek(weekGroup.Year, weekGroup.CalendarWeek), weekGroup.Wins / (double)weekGroup.Total));
            }
            foreach (var dayGroup in dayGroups)
            {
                winrateAvgDataPoints.Add(new DateValue(dayGroup.Date, dayGroup.Wins / (double)dayGroup.Total));
            }

            PlotModel.Series.Add(
                new LineSeries
            {
                Title        = "Win ratio per week",
                ItemsSource  = winrateDataPoints,
                MarkerStroke = OxyColors.Black,
                MarkerType   = MarkerType.Circle,
                DataFieldX   = "Date",
                DataFieldY   = "Value",
                Smooth       = true
            });

            PlotModel.Series.Add(
                new LineSeries
            {
                Title        = "Moving average over 7 days",
                ItemsSource  = MovingAverage(winrateAvgDataPoints, 7),
                MarkerStroke = OxyColors.Black,
                MarkerType   = MarkerType.Circle,
                DataFieldX   = "Date",
                DataFieldY   = "Value",
                Smooth       = true
            });
        }