public Scoreboard(string name, ScoreboardType type, Point position, Size size, bool overflow) { Name = name; Type = type; Position = position; Size = size; Overflow = overflow; }
public Scoreboard(string name, ScoreboardType type, bool overflow) { Name = name; Type = type; Position = new Point((int)(Screen.PrimaryScreen.Bounds.Width * 0.7), 40); Size = new Size(400, 300); Overflow = overflow; }
public IActionResult GetScoreResult( [FromQuery(Name = "v")] ScoreboardType type, [FromQuery(Name = "c")] string fileMD5, [FromQuery(Name = "f")] string f, [FromQuery(Name = "m")] PlayMode playMode, [FromQuery(Name = "i")] int i, [FromQuery(Name = "mods")] Mod mods, [FromQuery(Name = "us")] string us, [FromQuery(Name = "ha")] string pa) { var user = Users.GetUser(_factory, Users.GetUserId(_factory, us)); if (user?.IsPassword(pa) != true) { return(Ok("error: pass")); } var cache_hash = Hex.ToHex( Crypto.GetMd5( $"{fileMD5}{playMode}{mods}{type}{user.Id}{user.Username}" ) ); var cachedData = _cache.Get <string>($"sora:Scoreboards:{cache_hash}"); if (!string.IsNullOrEmpty(cachedData)) { return(Ok(cachedData)); } var sboard = new Scoreboard( _factory, _config, fileMD5, user, playMode, (mods & Mod.Relax) != 0, type == ScoreboardType.Friends, type == ScoreboardType.Country, type == ScoreboardType.Mods, mods ); _cache.Set($"sora:Scoreboards:{cache_hash}", cachedData = sboard.ToOsuString(), TimeSpan.FromSeconds(30)); return(Ok(cachedData)); }
/// <inheritdoc /> /// <summary> /// </summary> internal Scoreboard(ScoreboardType type, IEnumerable <ScoreboardUser> users, MultiplayerTeam team = MultiplayerTeam.Red) { Type = type; Team = team; if (OnlineManager.CurrentGame != null) { OnlineManager.Client.OnGameJudgements += OnGameJudgements; OnlineManager.Client.OnPlayerBattleRoyaleEliminated += OnPlayerBattleRoyaleEliminated; if (OnlineManager.CurrentGame.Ruleset == MultiplayerGameRuleset.Battle_Royale) { BattleRoyalePlayersLeft = new Bindable <int>(0) { Value = MapManager.Selected.Value.Scores.Value.Count + 1 }; } } if (Type == ScoreboardType.Teams) { TeamBanner = new ScoreboardTeamBanner(this) { Parent = this, Y = 235, }; if (Team == MultiplayerTeam.Blue) { TeamBanner.X = WindowManager.Width - TeamBanner.Width; } } if (OnlineManager.CurrentGame?.Ruleset == MultiplayerGameRuleset.Battle_Royale) { BattleRoyaleBanner = new ScoreboardBattleRoyaleBanner(this) { Parent = this, Y = 235 }; } else if (OnlineManager.CurrentGame?.Ruleset == MultiplayerGameRuleset.Free_For_All && MapManager.Selected.Value.Scores.Value.Count == 1) { OneVsOneWinsBanner = new ScoreboardOneVsOneWins(this) { Parent = this, Y = 235 }; } Users = users.OrderBy(x => x.Processor.Health <= 0).ThenByDescending(x => x.RatingProcessor.CalculateRating(x.Processor.Accuracy)).ToList(); SetTargetYPositions(); Users.ForEach(x => { x.Scoreboard = this; x.Y = x.TargetYPosition; if (Team == MultiplayerTeam.Blue) { x.X = WindowManager.Width; } }); }
public async Task<IActionResult> GetScoreResult( [FromQuery(Name = "v")] ScoreboardType type, [FromQuery(Name = "c")] string fileMd5, [FromQuery(Name = "f")] string f, [FromQuery(Name = "m")] PlayMode playMode, [FromQuery(Name = "i")] int i, [FromQuery(Name = "mods")] Mod mods, [FromQuery(Name = "us")] string us, [FromQuery(Name = "ha")] string pa, [FromServices] IServiceProvider serviceProvider) { try { var dbUser = await DbUser.GetDbUser(_ctx, us); var user = dbUser?.ToUser(); if (dbUser?.IsPassword(pa) != true) return Ok("error: pass"); var cacheHash = Hex.ToHex( Crypto.GetMd5( $"{fileMd5}{playMode}{mods}{type}{user.Id}{user.UserName}" ) ); if (_cache.TryGet($"sora:Scoreboards:{cacheHash}", out string cachedData)) return Ok(cachedData); var scores = await DbScore.GetScores(_ctx, fileMd5, dbUser, playMode, type == ScoreboardType.Friends, type == ScoreboardType.Country, type == ScoreboardType.Mods, mods); var beatmap = DbBeatmap.GetBeatmap(_ctx, fileMd5); BeatmapSet apiSet; if (beatmap == null) { apiSet = await _pisstaube.FetchBeatmapSetAsync(fileMd5); if (apiSet == null) goto JustContinue; var beatmaps = DbBeatmap.FromBeatmapSet(apiSet).ToList(); var beatmapChecksums = beatmaps.Select(s => s.FileMd5); var dbBeatmaps = _ctx.Beatmaps.Where(rset => beatmapChecksums.Any(lFileMd5 => rset.FileMd5 == lFileMd5)) .ToList(); var concurrentLock = new object(); var pool = serviceProvider.GetRequiredService<DbContextPool<SoraDbContext>>(); Task.WaitAll(beatmaps.Select(rawBeatmap => Task.Run(async () => { var context = pool.Rent(); var dbBeatmap = dbBeatmaps.FirstOrDefault(s => s.FileMd5 == rawBeatmap.FileMd5); if (dbBeatmap != null && (dbBeatmap.Flags & DbBeatmapFlags.RankedFreeze) != 0) { rawBeatmap.RankedStatus = dbBeatmap.RankedStatus; rawBeatmap.Flags = dbBeatmap.Flags; } context.Beatmaps.AddOrUpdate(rawBeatmap); await context.SaveChangesAsync(); pool.Return(context); })).ToArray()); beatmap = beatmaps.FirstOrDefault(s => s.FileMd5 == fileMd5); } JustContinue: var ownScore = await DbScore.GetLatestScore(_ctx, new DbScore { FileMd5 = fileMd5, UserId = user.Id, PlayMode = playMode, TotalScore = 0 }); var sScores = scores.Select(s => new Score { Count100 = s.Count100, Count50 = s.Count50, Count300 = s.Count300, Date = s.Date, Mods = s.Mods, CountGeki = s.CountGeki, CountKatu = s.CountKatu, CountMiss = s.CountMiss, FileMd5 = s.FileMd5, MaxCombo = s.MaxCombo, PlayMode = s.PlayMode, TotalScore = s.TotalScore, UserId = s.UserId, UserName = s.ScoreOwner.UserName, }).ToList(); // Fetch the correct position for sScore for (var j = 0; j < scores.Count; j++) { sScores[j].Position = await scores[j].Position(_ctx); } Score ownsScore = null; if (ownScore != null) ownsScore = new Score { Count100 = ownScore.Count100, Count50 = ownScore.Count50, Count300 = ownScore.Count300, Date = ownScore.Date, Mods = ownScore.Mods, CountGeki = ownScore.CountGeki, CountKatu = ownScore.CountKatu, CountMiss = ownScore.CountMiss, FileMd5 = ownScore.FileMd5, MaxCombo = ownScore.MaxCombo, PlayMode = ownScore.PlayMode, TotalScore = ownScore.TotalScore, UserId = dbUser.Id, UserName = dbUser.UserName, Position = await ownScore.Position(_ctx) }; BeatmapSet set = null; if (beatmap != null) set = new BeatmapSet { SetID = beatmap.Id, Artist = beatmap.Artist, Title = beatmap.Title, RankedStatus = beatmap.RankedStatus, ChildrenBeatmaps = new List<Beatmap> { new Beatmap { FileMD5 = beatmap.FileMd5, DiffName = beatmap.DiffName, ParentSetID = beatmap.SetId, BeatmapID = beatmap.Id, Mode = beatmap.PlayMode } } }; var sboard = new Scoreboard(set?.ChildrenBeatmaps.FirstOrDefault(bm => bm.FileMD5 == fileMd5), set, sScores, ownsScore); _cache.Set($"sora:Scoreboards:{cacheHash}", cachedData = sboard.ToOsuString(), TimeSpan.FromSeconds(30)); return Ok(cachedData); } catch (Exception ex) { Logger.Err(ex); return Ok("Failed"); } }