// 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(); }
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); }
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) })); }
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); } } } }
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); }
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)); }
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); } }
public IActionResult Status() { var statuses = LadderStore.GeAllLadderStatuses(); return(Ok(new { leagues = statuses.OrderByDescending(t => t.Value.Started) })); }