Exemplo n.º 1
0
        private IEnumerable <IGrouping <long, IChallengeObject> > GetPersonalDictionary(GranularityModel granularity,
                                                                                        out string titlePrefix)
        {
            switch (granularity.GranularityType)
            {
            case GranularityType.SingleDate:
            case GranularityType.MultiDate:
            {
                if (granularity.SelectedDate is null)
                {
                    granularity.SelectedDate = YobotApiSource.DateList.LastOrDefault();
                }
                if (granularity.StartDate is null)
                {
                    granularity.StartDate = YobotApiSource.DateList.FirstOrDefault();
                }
                if (granularity.EndDate is null)
                {
                    granularity.EndDate = YobotApiSource.DateList.LastOrDefault();
                }

                var grouped = Challenges
                              .GroupBy(k => k.ChallengeTime.AddHours(-5).Date);
                List <IChallengeObject> challengeModels;
                if (granularity.GranularityType == GranularityType.SingleDate && granularity.SelectedDate != null)
                {
                    var selectedDay    = granularity.SelectedDate.Value;
                    var singleDateData = grouped.First(k => k.Key == selectedDay.Date);
                    challengeModels = singleDateData.ToList();

                    titlePrefix = selectedDay.ToString("M月d日");
                }
                else if (granularity.GranularityType == GranularityType.MultiDate &&
                         granularity.StartDate != null &&
                         granularity.EndDate != null)
                {
                    var startDate     = granularity.StartDate.Value;
                    var endDate       = granularity.EndDate.Value;
                    var multiDateData = grouped
                                        .Where(k => k.Key >= startDate && k.Key <= endDate);
                    challengeModels = multiDateData.SelectMany(k => k).ToList();
                    titlePrefix     = $"{startDate:M月d日} - {endDate:M月d日}";
                }
                else
                {
                    throw new ArgumentOutOfRangeException();
                }

                var personsDic = challengeModels.GroupBy(k => k.QQId);
                return(personsDic);
            }

            case GranularityType.Total:
                break;

            case GranularityType.SingleRound:
            case GranularityType.MultiRound:
            {
                if (granularity.SelectedRound is null)
                {
                    granularity.SelectedRound = YobotApiSource.RoundList.LastOrDefault();
                }
                if (granularity.StartRound is null)
                {
                    granularity.StartRound = YobotApiSource.RoundList.FirstOrDefault();
                }
                if (granularity.EndRound is null)
                {
                    granularity.EndRound = YobotApiSource.RoundList.LastOrDefault();
                }

                var grouped = Challenges
                              .GroupBy(k => k.Cycle);
                List <IChallengeObject> challengeModels;
                if (granularity.GranularityType == GranularityType.SingleRound &&
                    granularity.SelectedRound != null)
                {
                    var selectedRound  = granularity.SelectedRound.Value;
                    var singleDateData = grouped.First(k => k.Key == selectedRound);
                    challengeModels = singleDateData.ToList();

                    titlePrefix = selectedRound + "周目";
                }
                else if (granularity.GranularityType == GranularityType.MultiRound &&
                         granularity.StartRound != null &&
                         granularity.EndRound != null)
                {
                    var startRound    = granularity.StartRound.Value;
                    var endRound      = granularity.EndRound.Value;
                    var multiDateData = grouped
                                        .Where(k => k.Key >= startRound && k.Key <= endRound);
                    challengeModels = multiDateData.SelectMany(k => k).ToList();
                    titlePrefix     = $"{startRound}周目 - {endRound}周目";
                }
                else
                {
                    throw new ArgumentOutOfRangeException();
                }

                var personsDic = challengeModels.GroupBy(k => k.QQId);
                return(personsDic);
            }

            default:
                throw new ArgumentOutOfRangeException();
            }

            throw new ArgumentOutOfRangeException();
        }
Exemplo n.º 2
0
        public async Task <CartesianChartConfigModel> PersonalDivideByChallengeTimesDayComparision(
            GranularityModel granularity)
        {
            var personsGrouping = GetPersonalDictionary(granularity, out var titlePrefix);

            var list = new List <PersonalDamageModel>();

            foreach (var kvp in personsGrouping)
            {
                var qqId = kvp.Key;

                var byDate = kvp.GroupBy(k => k.ChallengeTime.AddHours(-5).Date);
                // multi date support

                var damageModel = new PersonalDamageModel
                {
                    Name    = $"{await QQService.GetQqNickNameAsync(qqId)} ({qqId})",
                    Damages = new List <int> {
                        0, 0, 0, 0, 0, 0
                    }
                };

                foreach (var grouping in byDate)
                {
                    int i = 0;
                    foreach (var challengeModel in grouping)
                    {
                        if (challengeModel.IsContinue)
                        {
                            if (i % 2 == 0)
                            {
                                i++;
                            }
                            damageModel.Damages[i] += challengeModel.Damage;
                        }
                        else
                        {
                            if (i % 2 != 0)
                            {
                                i++;
                            }
                            damageModel.Damages[i] += challengeModel.Damage;
                        }

                        i++;
                    }
                }

                list.Add(damageModel);
            }

            list = list.OrderBy(k => k.Damages.Sum()).ToList();

            var configModel = GetSharedConfigModel(titlePrefix, list);

            for (int i = 0; i < 6; i++)
            {
                var challengeIndex = i / 2 + 1;
                configModel.SeriesCollection.Add(new StackedRowSeries
                {
                    Title      = i % 2 == 0 ? $"第{challengeIndex}刀" : $"第{challengeIndex}刀(补偿刀)",
                    Values     = new ChartValues <int>(list.Select(k => k.Damages[i]).ToList()),
                    DataLabels = true
                });
            }

            ConfigAxises(configModel);

            return(configModel);
        }
Exemplo n.º 3
0
        public async Task <CartesianChartConfigModel> PersonalDivideByBossRoundComparision(GranularityModel granularity)
        {
            var personsGrouping = GetPersonalDictionary(granularity, out var titlePrefix);

            var personBossDic = personsGrouping.ToDictionary(k => k.Key,
                                                             k =>
            {
                var dic = new Dictionary <int, int>();
                foreach (var challengeModel in k)
                {
                    if (dic.ContainsKey(challengeModel.BossNum))
                    {
                        dic[challengeModel.BossNum] += challengeModel.Damage;
                    }
                    else
                    {
                        dic.Add(challengeModel.BossNum, challengeModel.Damage);
                    }
                }

                return(dic);
            });

            var list = new List <PersonalDamageModel>();

            foreach (var kvp in personBossDic)
            {
                var cycleModel = new PersonalDamageModel
                {
                    Name = $"{await QQService.GetQqNickNameAsync(kvp.Key)} ({kvp.Key})"
                };

                for (int i = 0; i < 5; i++)
                {
                    var bossNum    = cycleModel.Damages.Count + 1;
                    var bossDamage = kvp.Value.ContainsKey(bossNum) ? kvp.Value[bossNum] : 0L;
                    cycleModel.Damages.Add((int)bossDamage);
                }

                list.Add(cycleModel);
            }

            list = list.OrderBy(k => k.Damages.Sum()).ToList();

            var configModel = GetSharedConfigModel(titlePrefix, list);

            for (int i = 0; i < 5; i++)
            {
                configModel.SeriesCollection.Add(new StackedRowSeries
                {
                    Title      = $"BOSS {i + 1}",
                    Values     = new ChartValues <int>(list.Select(k => k.Damages[i]).ToList()),
                    DataLabels = true
                });
            }

            ConfigAxises(configModel);

            return(configModel);
        }