Beispiel #1
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //Enable sessions
            app.UseSession();
            app.UseMvc();
            app.UseCors("AllowAll");

            GlobalConfiguration.Configuration.UseActivator(new HangfireActivator(serviceProvider));

            app.UseHangfireServer();
            app.UseHangfireDashboard();

            //RecurringJob.AddOrUpdate<ILadderService>(ls => ls.UpdateLadders(), Cron.MinuteInterval(1));

            app.UseSignalR(routes =>
            {
                routes.MapHub <PartyHub>("/hubs/party", options =>
                {
                    // 30Kb message buffer
                    options.ApplicationMaxBufferSize = 30 * 1024 * 1024;
                });
            });



            LadderStore.Initialize();
            ConnectionStore.Initialize();
            leagueTimer.Start();
        }
Beispiel #2
0
        public List <LadderPlayerModel> GetLadderForPlayer(string league, string character)
        {
            if (LadderStore.GetLadderStatus(league) == null)
            {
                LadderStore.SetLadderPending(league);
            }
            else
            {
                var leagueLadder      = LadderStore.GetLadder(league);
                var characterOnLadder = leagueLadder.FirstOrDefault(t => t.Name == character);

                if (characterOnLadder != null)
                {
                    var index  = leagueLadder.IndexOf(characterOnLadder);
                    var before = leagueLadder.Where(t => t.Rank.Overall < characterOnLadder.Rank.Overall && t.Rank.Overall >= (characterOnLadder.Rank.Overall - 5));
                    var after  = leagueLadder.Where(t => t.Rank.Overall > characterOnLadder.Rank.Overall && t.Rank.Overall <= (characterOnLadder.Rank.Overall + 5));

                    var ladderList = new List <LadderPlayerModel>();
                    ladderList.AddRange(before);
                    ladderList.AddRange(after);
                    ladderList.Add(characterOnLadder);
                    return(ladderList.OrderBy(t => t.Rank.Overall).ToList());
                }
            }

            return(null);
        }
Beispiel #3
0
        public IActionResult Reset()
        {
            var statuses = LadderStore.GeAllLadderStatuses();

            foreach (var status in statuses)
            {
                LadderStore.SetLadderFinished(status.Key);
            }
            statuses = LadderStore.GeAllLadderStatuses();
            return(Ok(new { leagues = statuses.OrderByDescending(t => t.Value.Started) }));
        }
Beispiel #4
0
        public void UpdateLadders()
        {
            var anyRunning = LadderStore.AnyRunning();

            if (!anyRunning)
            {
                var pendingLeague = LadderStore.GetNextForUpdate();
                if (pendingLeague != null)
                {
                    var pendingStatus = LadderStore.GetLadderStatus(pendingLeague);
                    if (pendingStatus.Finished < DateTime.Now.AddMinutes(-5))
                    {
                        UpdateLadder(pendingLeague);
                    }
                }
            }
        }
Beispiel #5
0
        public List <LadderPlayerModel> GetLadderForLeague(string league, bool full = false)
        {
            if (LadderStore.GetLadderStatus(league) == null)
            {
                LadderStore.SetLadderPending(league);
            }
            else
            {
                var leagueLadder = LadderStore.GetLadder(league);
                if (full)
                {
                    return(leagueLadder.OrderBy(t => t.Rank.Overall).ToList());
                }
                else
                {
                    return(leagueLadder.OrderBy(t => t.Rank.Overall).Take(10).ToList());
                }
            }

            return(null);
        }
Beispiel #6
0
        public async Task <IActionResult> Index()
        {
            var partyList = new List <PartyStatistics>();
            int players   = 0;

            var parties = ConnectionStore.ConnectionIndex ?? new Dictionary <string, ConnectionModel>();

            foreach (var partyName in parties.Select(t => t.Value.PartyName).Distinct().ToList())
            {
                if (partyName != null)
                {
                    var party = await _cache.GetAsync <PartyModel>($"party:{partyName}");

                    PartyStatistics partyStats = new PartyStatistics {
                    };
                    partyStats.Players = party.Players.Select(t => t.Character.Name).ToList();
                    partyList.Add(partyStats);
                    players += partyStats.Players.Count;
                }
            }

            var statuses = LadderStore.GeAllLadderStatuses();

            var response = new
            {
                totalParties = partyList.Count(),
                totalPlayers = players,
                parties      = partyList,
                leagues      = statuses.OrderByDescending(t => t.Value.Finished).Select(x => new {
                    Name     = x.Key,
                    Running  = x.Value.Running,
                    Started  = x.Value.Started.ToString("yyyy-MM-dd HH:mm:ss"),
                    Finished = x.Value.Finished.ToString("yyyy-MM-dd HH:mm:ss")
                })
            };

            return(Ok(response));
        }
Beispiel #7
0
        private async void UpdateLadder(string league)
        {
            LadderStore.SetLadderRunning(league);

            var oldLadder = LadderStore.GetLadder(league);
            var newLadder = new List <LadderPlayerModel>();

            var pages = Enumerable.Range(0, 25);

            using (var rateGate = new RateGate(2, TimeSpan.FromSeconds(1)))
            {
                foreach (int page in pages)
                {
                    await rateGate.WaitToProceed();

                    LadderApiResponse result = await FetchLadderApiPage(league, page);

                    if (result != null)
                    {
                        var LadderPlayerList = result.Entries.Select(t => new LadderPlayerModel()
                        {
                            Name              = t.Character.Name,
                            Level             = t.Character.Level,
                            Online            = t.Online,
                            Dead              = t.Dead,
                            Account           = t.Account.Name,
                            Experience        = t.Character.Experience,
                            ExperiencePerHour = 0,
                            Rank              = new LadderPlayerRankModel()
                            {
                                Overall = t.Rank
                            },
                            Depth = new LadderPlayerDepthModel()
                            {
                                Solo  = t.Character.Depth != null ? t.Character.Depth.Solo : 0,
                                Group = t.Character.Depth != null ? t.Character.Depth.@default : 0
                            },
                            Twitch  = t.Account.Twitch?.Name,
                            Class   = t.Character.Class,
                            Updated = DateTime.Now
                        }).ToList();
                        // Convert result to LadderPlayer model here
                        newLadder.AddRange(LadderPlayerList);
                        if (newLadder.Count == result.Total || result.Entries.Count == 0)
                        {
                            break;
                        }
                    }
                    else
                    {
                        LadderStore.RemoveLadderStatus(league);
                        break;
                    }
                }
            }

            if (newLadder.Count > 0)
            {
                newLadder = CalculateStatistics(oldLadder, newLadder);

                LadderStore.SetLadder(league, newLadder);
                LadderStore.SetLadderFinished(league);
            }
        }
Beispiel #8
0
        public IActionResult Status()
        {
            var statuses = LadderStore.GeAllLadderStatuses();

            return(Ok(new { leagues = statuses.OrderByDescending(t => t.Value.Started) }));
        }