Пример #1
0
        public Status(ILogger <Status> logger, DBService db, DSoptions options, OnTheFlyScan onthefly, DecodeReplays decode, DSrest rest)
        {
            _logger   = logger;
            _options  = options;
            _onthefly = onthefly;
            _db       = db;
            _decode   = decode;
            _rest     = rest;

            _logger.LogInformation("Start.");
            foreach (var ent in DSdata.Config.Replays)
            {
                string reppath = ent;
                if (reppath.EndsWith("/") || reppath.EndsWith("\\"))
                {
                    reppath.Remove(reppath.Length - 1);
                }
                var    plainTextBytes = Encoding.UTF8.GetBytes(reppath);
                MD5    md5            = new MD5CryptoServiceProvider();
                string reppath_md5    = BitConverter.ToString(md5.ComputeHash(plainTextBytes));
                ReplayFolder[reppath] = reppath_md5;
            }
            //ScanReplayFolders();

            //if (isFirstRun && File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\sc2dsstats_web\\data.json")) {
            //    BulkInsertOldData();
            //}

            if (DSdata.Config.OnTheFlyScan)
            {
                _onthefly.Start(this);
            }
        }
Пример #2
0
 public async Task ChangeOption(DSoptions _options)
 {
     if (_options.Chart.type == "bar")
     {
         ChartJsoptionsBar chartoptions = _options.Chart.options as ChartJsoptionsBar;
         chartoptions.scales.yAxes.First().ticks.beginAtZero = _options.BeginAtZero;
         var schartoptions = JsonConvert.SerializeObject(chartoptions);
         await ChartJSInterop.ChangeOptions(_jsRuntime, schartoptions);
     }
 }
Пример #3
0
        public void Init(DSReplay replay, DSoptions _options)
        {
            DSPlayer pl = null;

            if (DSdata.Config.Players.Any())
            {
                List <string> activePlayers = _options.Players.Where(x => x.Value == true).Select(s => s.Key).ToList();
                pl = replay.DSPlayer.Where(x => activePlayers.Contains(x.NAME)).FirstOrDefault();
            }
            else
            {
                pl = replay.DSPlayer.Where(x => x.NAME.Length == 64).FirstOrDefault();
            }



            Id       = $"ID {replay.ID} - {replay.GAMETIME.ToString("yyyy/MM/dd")}";
            Duration = "Duration " + (TimeSpan.FromSeconds(replay.DURATION).Hours > 0 ? TimeSpan.FromSeconds(replay.DURATION).ToString(@"hh\:mm\:ss") + " h" : TimeSpan.FromSeconds(replay.DURATION).ToString(@"mm\:ss") + " min");
            if (pl != null)
            {
                Player = "Player #" + pl.REALPOS;
            }
            MVP  = "MVP #" + replay.DSPlayer.Where(x => x.KILLSUM == replay.MAXKILLSUM).First().REALPOS;
            Mode = "Mode: " + replay.GAMEMODE.Substring(8);



            BreakpointMid        = new Dictionary <string, double>(DSdata.BreakpointMid);
            BreakpointMid["ALL"] = replay.DURATION * 22.4;
            SetMid(replay, _options.GameBreakpoint);
            _options.GameBreakpoint = "ALL";
            foreach (DSPlayer bpl in replay.DSPlayer)
            {
                HashSet <string> ups = new HashSet <string>();
                Upgrades[bpl.REALPOS] = new Dictionary <string, HashSet <string> >();
                Units[bpl.REALPOS]    = new Dictionary <string, Dictionary <string, int> >();
                List <string> bpdelete = new List <string>();
                foreach (var ent in BreakpointMid.OrderBy(o => o.Value))
                {
                    if (ent.Value > BreakpointMid["ALL"])
                    {
                        bpdelete.Add(ent.Key);
                        continue;
                    }
                    ups.UnionWith(GetUpgrades(bpl.Breakpoints.FirstOrDefault(f => f.Breakpoint == ent.Key)).ToHashSet());
                    Upgrades[bpl.REALPOS][ent.Key] = new HashSet <string>(ups);
                    Units[bpl.REALPOS][ent.Key]    = new Dictionary <string, int>(GetUnits(bpl.Breakpoints.FirstOrDefault(f => f.Breakpoint == ent.Key)));
                }
                foreach (string dkey in bpdelete)
                {
                    BreakpointMid.Remove(dkey);
                }
            }
        }
Пример #4
0
        public async Task ChartHandler(DSoptions _options, string thisHandle = null)
        {
            await GetChartBase(_options);

            // rebuild chart

            // add dataset

            // remove dataset

            // change chart options (player, beginatzero)
        }
Пример #5
0
        public ChartJsoptions GetOptions(DSoptions _options)
        {
            ChartJsoptions chartoptions = new ChartJsoptions();


            if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy")
            {
                ChartJsoptionsradar radaroptions = new ChartJsoptionsradar();
                radaroptions.title.text      = _options.Mode + " " + _options.Time;
                radaroptions.legend.position = "bottom";
                if (_options.Player == true)
                {
                    radaroptions.title.text = "Player " + radaroptions.title.text;
                }
                chartoptions = radaroptions;
            }
            else
            {
                ChartJsoptionsBar baroptions = new ChartJsoptionsBar();
                chartoptions = baroptions;

                ChartJSoptionsScalesY yAxes = new ChartJSoptionsScalesY();
                string startdate            = _options.Startdate.ToString("yyyy-MM-dd");
                string enddate = _options.Enddate.ToString("yyyy-MM-dd");
                if (_options.Enddate == DateTime.MinValue)
                {
                    enddate = DateTime.UtcNow.ToString("yyyy-MM-dd");
                }
                yAxes.scaleLabel.labelString = "% - " + startdate + " - " + enddate + " - " + IsDefaultFilter(_options);
                if (_options.BeginAtZero == true)
                {
                    yAxes.ticks.beginAtZero = true;
                }

                if (_options.Mode == "Timeline")
                {
                    baroptions.elements.point = new ChartJSoptionsElementsPoint();
                }

                chartoptions.scales.yAxes.Add(yAxes);
            }

            chartoptions.title.display = true;
            chartoptions.title.text    = _options.Mode + " " + _options.Time;
            if (_options.Player == true)
            {
                chartoptions.title.text = "Player " + chartoptions.title.text;
            }
            return(chartoptions);
        }
Пример #6
0
 public async Task RemoveDataset(DSoptions _options, string cmdr, object lockobject)
 {
     foreach (ChartJSdataset dataset in _options.Chart.data.datasets.Where(x => x.label.StartsWith(cmdr)).ToArray())
     {
         int pos = _options.Chart.data.datasets.FindIndex(i => i == dataset);
         if (pos >= 0)
         {
             _options.Chart.data.datasets.RemoveAt(pos);
             await ChartJSInterop.RemoveDataset(_jsRuntime, pos, lockobject);
         }
     }
     //TODO: CmdrInfo info for remaining dataset
     //TODO?: Check labels and sort
     //await SortChart(_options.Chart);
 }
Пример #7
0
        public static string IsDefaultFilter(DSoptions _options)
        {
            DSoptions defoptions = new DSoptions();

            if (_options.Duration == defoptions.Duration &&
                _options.Army == defoptions.Army &&
                _options.Income == defoptions.Income &&
                _options.Leaver == defoptions.Leaver &&
                _options.Kills == defoptions.Kills &&
                _options.PlayerCount == defoptions.PlayerCount
                )
            {
                return("default Filter");
            }
            else
            {
                return("custom Filter");
            }
        }
Пример #8
0
        public async Task DrawTimeline(DSoptions _options, DataResult dresult, object lockobject)
        {
            ChartJSdataset dataset = new ChartJSdataset();

            dataset.label       = _options.Interest + "_line";
            dataset.borderWidth = 3;
            dataset.pointRadius = 1;
            ChartService.SetColor(dataset, _options.Chart.type, _options.Interest);
            dataset.backgroundColor.Clear();
            _options.Chart.data.datasets.Add(dataset);
            ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter();

            for (int i = 0; i < _options.Chart.data.labels.Count; i++)
            {
                ChartJSInterop.AddData(_jsRuntime,
                                       _options.Chart.data.labels[i],
                                       dresult.fTimeline(i),
                                       dresult.Dataset.backgroundColor.Last(),
                                       null,
                                       lockobject
                                       ).GetAwaiter();
            }
        }
Пример #9
0
 public BulkInsert(DSReplayContext context, DSoptions options, DBService db)
 {
     _context = context;
     _options = options;
     _db      = db;
 }
Пример #10
0
        public static DataResult GetDurations(DSoptions _options, DSReplayContext _context, IJSRuntime _jsRuntime, object lockobject)
        {
            if (String.IsNullOrEmpty(_options.Interest))
            {
                return(new DataResult());
            }

            var replays = DBReplayFilter.Filter(_options, _context, false);

            var result = (_options.Player, _options.Dataset.Any()) switch
            {
                (true, false) => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest && p.NAME.Length == 64
                select new
                {
                    r.ID,
                    r.DURATION,
                    p.WIN
                },
                (true, true) => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest && _options.Dataset.Contains(p.NAME)
                select new
                {
                    r.ID,
                    r.DURATION,
                    p.WIN
                },
                _ => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest
                select new
                {
                    r.ID,
                    r.DURATION,
                    p.WIN
                }
            };
            var lresult = result.ToList();

            if (!lresult.Any())
            {
                return(new DataResult());
            }

            CultureInfo           provider = CultureInfo.InvariantCulture;
            DataResult            dresult  = new DataResult();
            List <double>         data     = new List <double>();
            List <double>         xdata    = new List <double>();
            List <double>         ydata    = new List <double>();
            List <string>         labels   = new List <string>();
            Func <double, double> f        = null;

            int count = lresult.Count;

            dresult.CmdrInfo.Wins      = lresult.Where(x => x.WIN == true).Count();
            dresult.CmdrInfo.Games     = count;
            dresult.CmdrInfo.AWinrate  = Math.Round((double)dresult.CmdrInfo.Wins * 100 / dresult.CmdrInfo.Games, 2);
            dresult.CmdrInfo.ADuration = TimeSpan.FromDays(3);
            dresult.CmdrInfo.GameIDs   = lresult.Select(s => s.ID).ToHashSet();


            for (int i = 0; i < DSdata.s_durations.Length; i++)
            {
                double games  = 1;
                double wins   = 0;
                int    startd = 0;

                if (i > 0)
                {
                    Match m = d_rx.Match(DSdata.s_durations[i]);
                    if (m.Success)
                    {
                        startd = int.Parse(m.Value);
                    }
                }

                int endd = startd + 3;
                if (i == 0)
                {
                    endd = 8;
                }
                if (i == DSdata.s_durations.Length - 1)
                {
                    endd = 200;
                }

                var ilresult = lresult.Where(x => x.DURATION > startd * 60 && x.DURATION < endd * 60);
                games = ilresult.Count();
                wins  = ilresult.Where(x => x.WIN == true).Count();

                data.Add(Math.Round(wins * 100 / games, 2));
                labels.Add(DSdata.s_durations[i] + " min (" + games + ")");
                xdata.Add(i);
                ydata.Add(data.Last());
            }

            if (xdata.Any() && xdata.Count > 1)
            {
                int order = 3;
                if (xdata.Count <= 3)
                {
                    if (xdata.Count < 3)
                    {
                        order = 1;
                    }
                    else
                    {
                        order = xdata.Count - 2;
                    }
                }
                f = Fit.PolynomialFunc(xdata.ToArray(), ydata.ToArray(), order);
            }

            dresult.Labels       = labels;
            dresult.Dataset.data = data;
            dresult.fTimeline    = f;
            dresult.fStartTime   = DateTime.MinValue;

            ChartService.SetColor(dresult.Dataset, _options.Chart.type, _options.Interest);
            dresult.Dataset.fill             = false;
            dresult.Dataset.pointRadius      = 2;
            dresult.Dataset.pointHoverRadius = 10;
            dresult.Dataset.showLine         = false;
            for (int i = 0; i < dresult.Labels.Count; i++)
            {
                ChartJSInterop.AddData(_jsRuntime,
                                       dresult.Labels[i],
                                       dresult.Dataset.data[i],
                                       dresult.Dataset.backgroundColor.Last(),
                                       null,
                                       lockobject
                                       ).GetAwaiter();
            }
            if (dresult.fTimeline != null)
            {
                ChartJSdataset dataset = new ChartJSdataset();
                dataset.label       = _options.Interest + "_line";
                dataset.borderWidth = 3;
                dataset.pointRadius = 1;
                ChartService.SetColor(dataset, _options.Chart.type, _options.Interest);
                dataset.backgroundColor.Clear();
                _options.Chart.data.datasets.Add(dataset);
                ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter();

                for (int i = 0; i < dresult.Labels.Count; i++)
                {
                    double fdata = dresult.fTimeline(i);

                    ChartJSInterop.AddData(_jsRuntime,
                                           dresult.Labels[i],
                                           fdata,
                                           dresult.Dataset.backgroundColor.Last(),
                                           null,
                                           lockobject
                                           ).GetAwaiter();
                }
            }
            return(dresult);
        }
Пример #11
0
        public async Task <ChartJS> GetChartBase(DSoptions _options, bool doit = true)
        {
            ChartJS mychart = new ChartJS();


            List <string> GameModes = _options.Gamemodes.Where(x => x.Value == true).Select(s => s.Key).ToList();

            if (GameModes.Contains("GameModeStandard") || GameModes.Contains("GameModeGear") || GameModes.Contains("GameModeSabotage") || GameModes.Contains("GameModeSwitch"))
            {
                mychart.s_races_ordered = DSdata.s_races.ToList();
            }
            else
            {
                mychart.s_races_ordered = DSdata.s_races_cmdr.ToList();
            }

            mychart.type = "bar";


            if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy")
            {
                mychart.type = "radar";
            }
            else if (_options.Mode == "Timeline")
            {
                mychart.type = "line";
                List <string> _s_races_cmdr_ordered = new List <string>();
                DateTime      startdate             = _options.Startdate;
                if (startdate == DateTime.MinValue)
                {
                    startdate = new DateTime(2018, 1, 1);
                }
                DateTime enddate = _options.Enddate;
                if (enddate == DateTime.MinValue)
                {
                    enddate = DateTime.Now.AddDays(1);
                }
                DateTime breakpoint = startdate;
                while (DateTime.Compare(breakpoint, enddate) < 0)
                {
                    breakpoint = breakpoint.AddDays(1);
                    _s_races_cmdr_ordered.Add(breakpoint.ToString("yyyy-MM-dd"));
                }
                _s_races_cmdr_ordered.RemoveAt(_s_races_cmdr_ordered.Count() - 1);
                mychart.s_races_ordered = _s_races_cmdr_ordered;
            }
            else if (_options.Mode == "Duration")
            {
                mychart.type            = "line";
                mychart.s_races_ordered = new List <string>(DSdata.s_durations);
            }
            mychart.options = GetOptions(_options);
            mychart.s_races = new List <string>(mychart.s_races_ordered);
            if (doit)
            {
                ChartJSdataset dataset = new ChartJSdataset();

                if (_options.Mode == "Timeline" || _options.Mode == "Duration")
                {
                    dataset.fill             = false;
                    dataset.pointRadius      = 2;
                    dataset.pointHoverRadius = 10;
                    dataset.showLine         = false;
                }

                if (String.IsNullOrEmpty(_options.Interest))
                {
                    dataset.label = "global";
                    if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy" || _options.Mode == "Timeline" || _options.Mode == "Duration")
                    {
                        _options.Interest = "Abathur";
                        dataset.label     = _options.Interest;
                        _options.CmdrsChecked["Abathur"] = true;
                    }
                }
                else
                {
                    dataset.label = _options.Interest;
                }

                SetColor(dataset, mychart.type, _options.Interest);
                dataset.backgroundColor.Clear();
                mychart.data.datasets.Add(dataset);
                _options.Chart = mychart;
                await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented));


                DataResult dresult = await DataService.GetData(_options, _context, _jsRuntime, _db.lockobject);

                if (dresult != null)
                {
                    _options.Chart.data.labels      = new List <string>(dresult.Labels);
                    _options.Chart.data.datasets[0] = dresult.Dataset.DeepCopy();
                    if (_options.Chart.type == "bar")
                    {
                        var options = _options.Chart.options as ChartJsoptionsBar;
                        options.plugins.labels.images = dresult.Images;
                    }
                    _options.Cmdrinfo = dresult.CmdrInfo;
                    SetCmdrPics(_options.Chart);
                    await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented));

                    if (dresult.fTimeline != null)
                    {
                        await DrawTimeline(_options, dresult, _db.lockobject);
                    }
                }
                await SortChart(_options.Chart);
            }
            return(mychart);
        }
Пример #12
0
        public async Task Init(DSoptions _options)
        {
            _options.Chart = await GetChartBase(_options, false);

            await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented));
        }
Пример #13
0
        public async Task AddDataset(DSoptions _options, object lockobject)
        {
            ChartJSdataset dataset = new ChartJSdataset();

            if (String.IsNullOrEmpty(_options.Interest))
            {
                dataset.label = "global";
            }
            else
            {
                dataset.label = _options.Interest;
            }

            if (_options.Mode == "Timeline" || _options.Mode == "Duration")
            {
                dataset.fill             = false;
                dataset.pointRadius      = 2;
                dataset.pointHoverRadius = 10;
                dataset.showLine         = false;
            }

            SetColor(dataset, _options.Chart.type, _options.Interest);
            dataset.backgroundColor.Clear();
            _options.Chart.data.datasets.Add(dataset);
            await ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject);

            DataResult dresult = await DataService.GetData(_options, _context, _jsRuntime, _db.lockobject);

            if (dresult != null)
            {
                foreach (string l in _options.Chart.data.labels)
                {
                    double wr     = 0;
                    string bcolor = "rgba(0, 0, 0, 0)";

                    int ssend = 4;
                    if (_options.Mode == "Timeline")
                    {
                        ssend = 10;
                    }
                    string label = dresult.Labels.FirstOrDefault(s => s.Substring(0, ssend) == l.Substring(0, ssend));
                    if (!String.IsNullOrEmpty(label))
                    {
                        int pos = dresult.Labels.FindIndex(i => i == label);
                        _options.Chart.data.datasets.Last().data.Add(dresult.Dataset.data[pos]);
                        if (_options.Chart.type == "line")
                        {
                            _options.Chart.data.datasets.Last().backgroundColor.Add(dresult.Dataset.backgroundColor.Last());
                        }
                        else
                        {
                            _options.Chart.data.datasets.Last().backgroundColor.Add(dresult.Dataset.backgroundColor[pos]);
                        }
                        wr = dresult.Dataset.data[pos];
                        if (_options.Chart.type == "line")
                        {
                            bcolor = dresult.Dataset.backgroundColor.Last();
                        }
                        else
                        {
                            bcolor = dresult.Dataset.backgroundColor[pos];
                        }
                    }
                    else
                    {
                        _options.Chart.data.datasets.Last().data.Add(0);
                        _options.Chart.data.datasets.Last().backgroundColor.Add("rgba(0, 0, 0, 0)");
                    }
                    ChartJSInterop.AddData(_jsRuntime,
                                           "",
                                           wr,
                                           bcolor,
                                           "",
                                           lockobject
                                           );
                }
                _options.Cmdrinfo = dresult.CmdrInfo;
                if (dresult.fTimeline != null)
                {
                    DrawTimeline(_options, dresult, lockobject);
                }
            }
        }
Пример #14
0
        public static async Task GetBuild(DSoptions _options, DSReplayContext _context, object dblock, ILogger _logger)
        {
            if (_options.Vs == "ALL")
            {
                _options.Vs = String.Empty;
            }
            string Hash = _options.GenHash();

            if (!_options.Decoding && BuildCache.ContainsKey(Hash))
            {
                _options.buildResult = BuildCache[Hash];
                return;
            }

            bool doWait = false;

            lock (Computing)
            {
                if (!Computing.Contains(Hash))
                {
                    Computing.Add(Hash);
                }
                else
                {
                    doWait = true;
                }
            }

            if (doWait)
            {
                while (Computing.Contains(Hash))
                {
                    await Task.Delay(500);
                }
                if (BuildCache.ContainsKey(Hash))
                {
                    _options.buildResult = BuildCache[Hash];
                }
                return;
            }

            BuildResult bresult = new BuildResult();

            foreach (var ent in _options.Gamemodes.Keys.ToArray())
            {
                _options.Gamemodes[ent] = false;
            }

            if (_options.Interest == "Terran" || _options.Interest == "Zerg" || _options.Interest == "Protoss")
            {
                _options.Gamemodes["GameModeStandard"] = true;
            }
            else
            {
                _options.Gamemodes["GameModeCommanders"]       = true;
                _options.Gamemodes["GameModeCommandersHeroic"] = true;
            }

            lock (dblock)
            {
                bool mengskfilter = _options.MengskPreviewFilter;
                _options.MengskPreviewFilter = false;
                var replays = DBReplayFilter.Filter(_options, _context);
                _options.MengskPreviewFilter = mengskfilter;

                bresult.TotalGames = replays.Count();

                var presult = (String.IsNullOrEmpty(_options.Vs) switch
                {
                    true => from r in replays
                    from t1 in r.DSPlayer
                    where t1.RACE == _options.Interest
                    where _options.Dataset.Contains(t1.NAME)
                    from u1 in t1.Breakpoints
                    where u1.Breakpoint == _options.Breakpoint
                    select new
                    {
                        r.ID,
                        r.DURATION,
                        r.GAMETIME,
                        t1.WIN,
                        u1.dsUnitsString,
                        u1.Upgrades,
                        u1.Gas
                    },
                    false => from r in replays
                    from t1 in r.DSPlayer
                    where t1.RACE == _options.Interest && t1.OPPRACE == _options.Vs
                    where _options.Dataset.Contains(t1.NAME)
                    from u1 in t1.Breakpoints
                    where u1.Breakpoint == _options.Breakpoint
                    select new
                    {
                        r.ID,
                        r.DURATION,
                        r.GAMETIME,
                        t1.WIN,
                        u1.dsUnitsString,
                        u1.Upgrades,
                        u1.Gas
                    }
                });
Пример #15
0
        public static DataResult GetTimeLine(DSoptions _options, DSReplayContext _context, IJSRuntime _jsRuntime, object lockobject)
        {
            if (String.IsNullOrEmpty(_options.Interest))
            {
                return(new DataResult());
            }

            var replays = DBReplayFilter.Filter(_options, _context, false);

            var result = (_options.Player, _options.Dataset.Any()) switch
            {
                (true, false) => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest && p.NAME.Length == 64
                select new
                {
                    r.ID,
                    r.GAMETIME,
                    p.WIN
                },
                (true, true) => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest && _options.Dataset.Contains(p.NAME)
                select new
                {
                    r.ID,
                    r.GAMETIME,
                    p.WIN
                },
                _ => from r in replays
                from p in r.DSPlayer
                where p.RACE == _options.Interest
                select new
                {
                    r.ID,
                    r.GAMETIME,
                    p.WIN
                }
            };
            var lresult = result.OrderBy(o => o.GAMETIME).ToList();

            if (!lresult.Any())
            {
                return(new DataResult());
            }

            CultureInfo           provider = CultureInfo.InvariantCulture;
            DataResult            dresult  = new DataResult();
            List <double>         data     = new List <double>();
            List <double>         xdata    = new List <double>();
            List <double>         ydata    = new List <double>();
            List <string>         labels   = new List <string>();
            Func <double, double> f        = null;

            int count = lresult.Count;
            int step  = 50;
            int cstep = count / step;

            while (cstep < 10)
            {
                step -= 1;
                cstep = count / step;
                if (step <= 1)
                {
                    break;
                }
            }
            dresult.CmdrInfo.Wins      = lresult.Where(x => x.WIN == true).Count();
            dresult.CmdrInfo.Games     = count;
            dresult.CmdrInfo.AWinrate  = Math.Round((double)dresult.CmdrInfo.Wins * 100 / dresult.CmdrInfo.Games, 2);
            dresult.CmdrInfo.ADuration = TimeSpan.FromDays(cstep);
            dresult.CmdrInfo.GameIDs   = lresult.Select(s => s.ID).ToHashSet();


            for (int i = 0; i < step; i++)
            {
                var sreps = lresult.Skip(i * cstep).Take(cstep);
                if (!sreps.Any())
                {
                    continue;
                }
                data.Add(Math.Round((double)sreps.Where(x => x.WIN == true).Count() * 100 / (double)sreps.Count(), 2));
                labels.Add(sreps.Last().GAMETIME.ToString("yyyy-MM-dd"));
                xdata.Add(i);
                ydata.Add(data.Last());
            }

            if (xdata.Any() && xdata.Count > 1)
            {
                int order = 6;
                if (xdata.Count <= 6)
                {
                    if (xdata.Count < 3)
                    {
                        order = 1;
                    }
                    else
                    {
                        order = xdata.Count - 2;
                    }
                }
                f = Fit.PolynomialFunc(xdata.ToArray(), ydata.ToArray(), order);
            }

            dresult.Labels       = labels;
            dresult.Dataset.data = data;
            dresult.fTimeline    = f;
            dresult.fStartTime   = lresult.First().GAMETIME;

            ChartService.SetColor(dresult.Dataset, _options.Chart.type, _options.Interest);
            dresult.Dataset.fill             = false;
            dresult.Dataset.pointRadius      = 2;
            dresult.Dataset.pointHoverRadius = 10;
            dresult.Dataset.showLine         = false;
            for (int i = 0; i < dresult.Labels.Count; i++)
            {
                ChartJSInterop.AddData(_jsRuntime,
                                       dresult.Labels[i],
                                       dresult.Dataset.data[i],
                                       dresult.Dataset.backgroundColor.Last(),
                                       null,
                                       lockobject
                                       ).GetAwaiter();
            }
            if (dresult.fTimeline != null)
            {
                string   fstart  = dresult.Labels.First().Substring(0, 10);
                DateTime ffstart = DateTime.ParseExact(fstart, "yyyy-MM-dd", provider);

                ChartJSdataset dataset = new ChartJSdataset();
                dataset.label       = _options.Interest + "_line";
                dataset.borderWidth = 3;
                dataset.pointRadius = 1;
                ChartService.SetColor(dataset, _options.Chart.type, _options.Interest);
                dataset.backgroundColor.Clear();
                _options.Chart.data.datasets.Add(dataset);
                ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter();

                for (int i = 0; i < dresult.Labels.Count; i++)
                {
                    double fdata = dresult.fTimeline(i);

                    ChartJSInterop.AddData(_jsRuntime,
                                           dresult.Labels[i],
                                           fdata,
                                           dresult.Dataset.backgroundColor.Last(),
                                           null,
                                           lockobject
                                           ).GetAwaiter();
                }
            }
            return(dresult);
        }
Пример #16
0
        public static IQueryable <DSReplay> Filter(DSoptions options, DSReplayContext context, bool isFiltered = false, IQueryable <DSReplay> ireps = null)
        {
            var replays = ireps;

            if (replays == null)
            {
                replays = context.DSReplays
                          .Include(p => p.DSPlayer)
                          .Where(x => x.WINNER >= 0)
                ;
            }



            HashSet <string> Gamemodes = options.Gamemodes.Where(x => x.Value == true).Select(y => y.Key).ToHashSet();

            IQueryable <DSReplay> filReplays;

            if (isFiltered == false)
            {
                if (String.IsNullOrEmpty(options.Interest))
                {
                    if (options.Leaver > 0)
                    {
                        filReplays = replays
                                     .Where(x => x.DURATION > options.Duration)
                                     .Where(x => x.MAXLEAVER < options.Leaver)
                                     .Where(x => x.MINARMY > options.Army)
                                     .Where(x => x.MININCOME > options.Income)
                                     .Where(x => x.MINKILLSUM > options.Kills)
                                     .Where(x => x.PLAYERCOUNT >= options.PlayerCount)
                                     .Where(x => Gamemodes.Contains(x.GAMEMODE))
                                     //.ToArray()
                        ;
                    }
                    else
                    {
                        filReplays = replays
                                     .Where(x => x.DURATION > options.Duration)
                                     .Where(x => x.MINARMY > options.Army)
                                     .Where(x => x.MININCOME > options.Income)
                                     .Where(x => x.MINKILLSUM > options.Kills)
                                     .Where(x => x.PLAYERCOUNT >= options.PlayerCount)
                                     .Where(x => Gamemodes.Contains(x.GAMEMODE))
                                     //.ToArray()
                        ;
                    }
                }
                else
                if (options.Leaver > 0)
                {
                    filReplays = replays
                                 .Where(x => x.DURATION > options.Duration)
                                 .Where(x => x.MAXLEAVER < options.Leaver)
                                 .Where(x => x.MINARMY > options.Army)
                                 .Where(x => x.MININCOME > options.Income)
                                 .Where(x => x.MINKILLSUM > options.Kills)
                                 .Where(x => x.PLAYERCOUNT >= options.PlayerCount)
                                 .Where(x => Gamemodes.Contains(x.GAMEMODE))
                                 .Where(x => x.DSPlayer.FirstOrDefault(s => s.RACE == options.Interest) != null)
                                 //.ToArray()
                    ;
                }
                else
                {
                    filReplays = replays
                                 .Where(x => x.DURATION > options.Duration)
                                 .Where(x => x.MINARMY > options.Army)
                                 .Where(x => x.MININCOME > options.Income)
                                 .Where(x => x.MINKILLSUM > options.Kills)
                                 .Where(x => x.PLAYERCOUNT >= options.PlayerCount)
                                 .Where(x => Gamemodes.Contains(x.GAMEMODE))
                                 .Where(x => x.DSPlayer.FirstOrDefault(s => s.RACE == options.Interest) != null)
                                 //.ToArray()
                    ;
                }
            }
            else
            {
                filReplays = replays;
            }

            if (options.Startdate != default(DateTime))
            {
                filReplays = filReplays.Where(x => x.GAMETIME >= options.Startdate);
            }
            if (options.Enddate != default(DateTime))
            {
                filReplays = filReplays.Where(x => x.GAMETIME <= options.Enddate.AddDays(1));
            }

            if (DSdata.IsMySQL)
            {
                if (options.MengskPreviewFilter)
                {
                    var testReplays = from r in filReplays
                                      from p in r.DSPlayer
                                      where p.RACE == "Mengsk" && r.GAMETIME < new DateTime(2020, 07, 28, 5, 23, 0)
                                      select r.ID;
                    filReplays = filReplays.Where(x => !testReplays.Contains(x.ID));
                }

                if (options.Dataset.Any())
                {
                    filReplays = filReplays
                                 .Where(x => x.DSPlayer.Select(s => s.NAME).Contains(options.Dataset.First()));
                }
            }
            return(filReplays);
        }