public static Achievements NewAchievement( SoraDbContextFactory factory, string name, string displayName, string desc, string iconUri, bool insert = true) { using var db = factory.GetForWrite(); var a = new Achievements { Name = name, DisplayName = displayName, Description = desc, IconURI = iconUri, BitId = 1ul << db.Context.Achievements.Count() }; if (!insert) { return(a); } db.Context.Achievements.Add(a); return(a); }
public static void InsertBeatmap(SoraDbContextFactory factory, Beatmaps bm) { using var db = factory.GetForWrite(); if (db.Context.BeatmapSets.Count(x => x.Id == bm.BeatmapSetId) < 1) { db.Context.BeatmapSets.Add( new BeatmapSets { Id = bm.BeatmapSetId, Beatmaps = new List <Beatmaps>(new[] { bm }), FavouriteCount = 0, PassCount = 0, LastUpdate = DateTime.UtcNow, PlayCount = 0 } ); } if (db.Context.Beatmaps.Count(x => x.Id == bm.Id) < 1) { db.Context.Beatmaps.Add(bm); } else { db.Context.Beatmaps.Update(bm); } }
public void IncreasePlaycount(SoraDbContextFactory factory, PlayMode mode) { using var db = factory.GetForWrite(); switch (mode) { case PlayMode.Osu: PlayCountOsu++; break; case PlayMode.Taiko: PlayCountTaiko++; break; case PlayMode.Ctb: PlayCountCtb++; break; case PlayMode.Mania: PlayCountMania++; break; } db.Context.LeaderboardStd.Update(this); }
public void IncreaseCountMiss(SoraDbContextFactory factory, int c, PlayMode mode) { using var db = factory.GetForWrite(); switch (mode) { case PlayMode.Osu: CountMissOsu += c; break; case PlayMode.Taiko: CountMissTaiko += c; break; case PlayMode.Ctb: CountMissCtb += c; break; case PlayMode.Mania: CountMissMania += c; break; } db.Context.LeaderboardStd.Update(this); }
public static void InsertScore(SoraDbContextFactory factory, Scores score) { using var db = factory.GetForWrite(); var sc = db.Context.Scores .Where(s => s.FileMd5 == score.FileMd5 && s.PlayMode == score.PlayMode) .Where( s => (score.Mods & Mod.Relax) != 0 ? (score.Mods & Mod.Relax) != 0 : (score.Mods & Mod.Relax) == 0 ) .Where(s => s.UserId == score.UserId) .OrderByDescending(s => s.TotalScore) .ToList(); var isBetter = sc.Any(scr => scr.TotalScore < score.TotalScore); if (isBetter) { db.Context.RemoveRange(sc); } db.Context.Add(score); }
public static void AddFriend(SoraDbContextFactory factory, int userId, int friendId) { using var db = factory.GetForWrite(); db.Context.Friends.Add(new Friends { UserId = userId, FriendId = friendId }); }
public void IncreaseScore(SoraDbContextFactory factory, ulong score, bool ranked, PlayMode mode) { using var db = factory.GetForWrite(); switch (mode) { case PlayMode.Osu: if (ranked) { RankedScoreOsu += score; } else { TotalScoreOsu += score; } break; case PlayMode.Taiko: if (ranked) { RankedScoreTaiko += score; } else { TotalScoreTaiko += score; } break; case PlayMode.Ctb: if (ranked) { RankedScoreCtb += score; } else { TotalScoreCtb += score; } break; case PlayMode.Mania: if (ranked) { RankedScoreMania += score; } else { TotalScoreMania += score; } break; } db.Context.LeaderboardStd.Update(this); }
// ReSharper disable once MemberCanBePrivate.Global public static UserStats GetUserStats(SoraDbContextFactory factory, int userId) { using var db = factory.GetForWrite(); var val = db.Context.UserStats.Where(t => t.Id == userId).Select(e => e).FirstOrDefault(); if (val != null) { return(val); } db.Context.UserStats.Add(val = new UserStats { Id = userId, CountryId = 0 }); return(val); }
public static LeaderboardRx GetLeaderboard(SoraDbContextFactory factory, int userId) { using var db = factory.GetForWrite(); var result = db.Context.LeaderboardRx.Where(t => t.Id == userId).Select(e => e).FirstOrDefault(); if (result != null) { return(result); } db.Context.LeaderboardRx.Add(new LeaderboardRx { Id = userId }); return(new LeaderboardRx { Id = userId }); }
public void IncreaseCount50(SoraDbContextFactory factory, int c, PlayMode mode) { using var db = factory.GetForWrite(); switch (mode) { case PlayMode.Osu: Count50Osu += c; break; case PlayMode.Taiko: Count50Taiko += c; break; case PlayMode.Ctb: Count50Ctb += c; break; } db.Context.LeaderboardRx.Update(this); }
public void UpdatePP(SoraDbContextFactory factory, PlayMode mode) { using var db = factory.GetForWrite(); var TotalPP = db.Context.Scores .Where(s => (s.Mods & Mod.Relax) == 0) .Where(s => s.PlayMode == mode) .Where(s => s.UserId == Id) .OrderByDescending(s => s.PeppyPoints) .Take(100).ToList() .Select((t, i) => t.PeppyPoints * Math.Pow(0.95d, i)) .Sum(); switch (mode) { case PlayMode.Osu: PerformancePointsOsu = TotalPP; break; case PlayMode.Taiko: PerformancePointsTaiko = TotalPP; break; case PlayMode.Ctb: PerformancePointsCtb = TotalPP; break; case PlayMode.Mania: PerformancePointsMania = TotalPP; break; default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } db.Context.LeaderboardStd.Update(this); }
private static void Main() { Logger.Info("Ripple Merger v0.0.1a"); if (_memoryCache == null) { _memoryCache = new MemoryCache( new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan.FromDays(365) } ); } var cfgUtil = new ConfigUtil(_memoryCache); var cfg = cfgUtil.ReadConfig <RippleDbContext.RippleConfig>(); var factory = new SoraDbContextFactory(); var rippleCtx = new RippleDbContext(); #region User Database merge using (var db = factory.GetForWrite()) { foreach (var user in rippleCtx.Users) { if (db.Context.Users.Any(x => x.Username == user.username)) // Skip double Users { continue; } if (user.id == 999) // We don't need fokabot! gtfu { continue; } if (user.email == null || user.password_md5 == null || user.username == null) { Logger.Info($"Invalid User! {user.id}"); Thread.Sleep(1000); continue; } Logger.Info($"User: {user.username} ( {user.id} )"); db.Context.Users.Add( new Users { Username = user.username, Password = user.password_md5, Permissions = PrivilegeMerger.Merge(user.privileges), Email = user.email } ); } } #endregion #region Beatmap Databse merge using (var db = factory.GetForWrite()) { foreach (var rMap in rippleCtx.Beatmaps) { if (db.Context.Beatmaps.Any(x => x.Id == rMap.beatmap_id)) { continue; } Logger.Info($"Importing {rMap.beatmap_id}"); Beatmaps sMap; if ((sMap = Beatmaps.FetchFromApi(cfg, null, rMap.beatmap_id)) != null) { sMap.RankedStatus = rMap.ranked; var LetsMapPath = Path.Join(cfg.CRipple.LetsBeatmapPath, "/" + sMap.Id + ".osu"); var SoraMapPath = Path.Join(cfg.SoraDataDirectory, "/beatmaps/" + sMap.FileMd5); Logger.Info(LetsMapPath); Logger.Info(SoraMapPath); if (File.Exists(LetsMapPath) && !File.Exists(SoraMapPath)) { File.Copy(LetsMapPath, SoraMapPath); } else { BeatmapDownloader.GetBeatmap(sMap.FileMd5, cfg); } if (db.Context.Beatmaps.Count(x => x.Id == sMap.Id) < 1) { db.Context.Beatmaps.Add(sMap); } else { db.Context.Beatmaps.Update(sMap); } } } } #endregion #region Score Database Merge. foreach (var score in rippleCtx.Scores) { var soraScore = new Scores(); } #endregion Logger.Info("Done! Requires manual Checking..."); Thread.Sleep(5000); }
public async Task <IActionResult> PostSubmitModular() { string score = Request.Form["score"]; string iv = Request.Form["iv"]; string osuver = Request.Form["osuver"]; string pass = Request.Form["pass"]; var(b, scores) = ScoreSubmissionParser.ParseScore(_factory, score, iv, osuver); if (scores.UserId == -1) { return(Ok("error: pass")); } if (scores.ScoreOwner == null) { scores.ScoreOwner = Users.GetUser(_factory, scores.UserId); } if (scores.ScoreOwner == null) { return(Ok("error: pass")); } if (!scores.ScoreOwner.IsPassword(pass)) { return(Ok("error: pass")); } var isRelaxing = (scores.Mods & Mod.Relax) != 0; var pr = _ps.GetPresence(scores.ScoreOwner.Id); if (!b || !RankedMods.IsRanked(scores.Mods)) { if (isRelaxing) { var rx = LeaderboardRx.GetLeaderboard(_factory, scores.ScoreOwner); rx.IncreasePlaycount(_factory, scores.PlayMode); rx.IncreaseScore(_factory, (ulong)scores.TotalScore, false, scores.PlayMode); } else { var std = LeaderboardStd.GetLeaderboard(_factory, scores.ScoreOwner); std.IncreasePlaycount(_factory, scores.PlayMode); std.IncreaseScore(_factory, (ulong)scores.TotalScore, false, scores.PlayMode); } await _ev.RunEvent( EventType.BanchoUserStatsRequest, new BanchoUserStatsRequestArgs { userIds = new List <int> { scores.ScoreOwner.Id }, pr = pr } ); return(Ok("Thanks for your hard work!")); } /* * switch (scores.PlayMode) * { * case PlayMode.Osu: * oppai op = new oppai(BeatmapDownloader.GetBeatmap(scores.FileMd5, _config)); * op.SetAcc((int) scores.Count300, (int) scores.Count50, (int) scores.CountMiss); * op.SetCombo(scores.MaxCombo); * op.SetMods(scores.Mods); * op.Calculate(); * * scores.PeppyPoints = op.GetPP(); * Logger.Info("Peppy Points:", scores.PeppyPoints); * break; * } */ var ReplayFile = Request.Form.Files.GetFile("score"); if (!Directory.Exists("data/replays")) { Directory.CreateDirectory("data/replays"); } await using (var m = new MemoryStream()) { ReplayFile.CopyTo(m); m.Position = 0; scores.ReplayMd5 = Hex.ToHex(Crypto.GetMd5(m)) ?? string.Empty; if (!string.IsNullOrEmpty(scores.ReplayMd5)) { await using (var replayFile = System.IO.File.Create($"data/replays/{scores.ReplayMd5}")) { m.Position = 0; m.WriteTo(replayFile); m.Close(); replayFile.Close(); } } } BeatmapDownloader.GetBeatmap(scores.FileMd5, _config); if (isRelaxing) { scores.Mods -= Mod.Relax; } scores.PeppyPoints = PerformancePointsProcessor.Compute(scores); if (isRelaxing) { scores.Mods |= Mod.Relax; } var oldScore = Scores.GetScores( _factory, scores.FileMd5, scores.ScoreOwner, scores.PlayMode, isRelaxing, false, false, false, scores.Mods, true ).FirstOrDefault(); var oldStd = LeaderboardStd.GetLeaderboard(_factory, scores.ScoreOwner); var oldStdPos = oldStd.GetPosition(_factory, scores.PlayMode); if (oldScore != null && oldScore.TotalScore <= scores.TotalScore) { using var db = _factory.GetForWrite(); db.Context.Scores.Remove(oldScore); System.IO.File.Delete($"data/replays/{oldScore.ReplayMd5}"); Scores.InsertScore(_factory, scores); } else if (oldScore == null) { Scores.InsertScore(_factory, scores); } else { System.IO.File.Delete($"data/replays/{scores.ReplayMd5}"); } if (isRelaxing) { var rx = LeaderboardRx.GetLeaderboard(_factory, scores.ScoreOwner); rx.IncreasePlaycount(_factory, scores.PlayMode); rx.IncreaseCount300(_factory, scores.Count300, scores.PlayMode); rx.IncreaseCount100(_factory, scores.Count100, scores.PlayMode); rx.IncreaseCount50(_factory, scores.Count50, scores.PlayMode); rx.IncreaseCountMiss(_factory, scores.CountMiss, scores.PlayMode); rx.IncreaseScore(_factory, (ulong)scores.TotalScore, true, scores.PlayMode); rx.IncreaseScore(_factory, (ulong)scores.TotalScore, false, scores.PlayMode); rx.UpdatePP(_factory, scores.PlayMode); pr.LeaderboardRx = rx; await _ev.RunEvent( EventType.BanchoUserStatsRequest, new BanchoUserStatsRequestArgs { userIds = new List <int> { scores.ScoreOwner.Id }, pr = pr } ); } else { var std = LeaderboardStd.GetLeaderboard(_factory, scores.ScoreOwner); std.IncreasePlaycount(_factory, scores.PlayMode); std.IncreaseCount300(_factory, scores.Count300, scores.PlayMode); std.IncreaseCount100(_factory, scores.Count100, scores.PlayMode); std.IncreaseCount50(_factory, scores.Count50, scores.PlayMode); std.IncreaseCountMiss(_factory, scores.CountMiss, scores.PlayMode); std.IncreaseScore(_factory, (ulong)scores.TotalScore, true, scores.PlayMode); std.IncreaseScore(_factory, (ulong)scores.TotalScore, false, scores.PlayMode); std.UpdatePP(_factory, scores.PlayMode); } var newStd = LeaderboardStd.GetLeaderboard(_factory, scores.ScoreOwner); var newStdPos = newStd.GetPosition(_factory, scores.PlayMode); var NewScore = Scores.GetScores( _factory, scores.FileMd5, scores.ScoreOwner, scores.PlayMode, isRelaxing, false, false, false, scores.Mods, true ).FirstOrDefault(); var cg = new Cheesegull(_config); cg.SetBM(scores.FileMd5); var sets = cg.GetSets(); var bm = sets?[0].ChildrenBeatmaps.First(x => x.FileMD5 == scores.FileMd5) ?? new CheesegullBeatmap(); double oldAcc; double newAcc; ulong oldRankedScore; ulong newRankedScore; double oldPP; double newPP; switch (scores.PlayMode) { case PlayMode.Osu: oldAcc = Accuracy.GetAccuracy( oldStd.Count300Osu, oldStd.Count100Osu, oldStd.Count50Osu, oldStd.Count300Osu, 0, 0, PlayMode.Osu ); newAcc = Accuracy.GetAccuracy( newStd.Count300Osu, newStd.Count100Osu, newStd.Count50Osu, newStd.Count300Osu, 0, 0, PlayMode.Osu ); oldRankedScore = oldStd.RankedScoreOsu; newRankedScore = newStd.RankedScoreOsu; oldPP = oldStd.PerformancePointsOsu; newPP = newStd.PerformancePointsOsu; break; case PlayMode.Taiko: oldAcc = Accuracy.GetAccuracy( oldStd.Count300Taiko, oldStd.Count100Taiko, oldStd.Count50Taiko, oldStd.Count300Taiko, 0, 0, PlayMode.Taiko ); newAcc = Accuracy.GetAccuracy( newStd.Count300Taiko, newStd.Count100Taiko, newStd.Count50Taiko, newStd.Count300Taiko, 0, 0, PlayMode.Taiko ); oldRankedScore = oldStd.RankedScoreTaiko; newRankedScore = newStd.RankedScoreTaiko; oldPP = oldStd.PerformancePointsTaiko; newPP = newStd.PerformancePointsTaiko; break; case PlayMode.Ctb: oldAcc = Accuracy.GetAccuracy( oldStd.Count300Ctb, oldStd.Count100Ctb, oldStd.Count50Ctb, oldStd.Count300Ctb, 0, 0, PlayMode.Ctb ); newAcc = Accuracy.GetAccuracy( newStd.Count300Ctb, newStd.Count100Ctb, newStd.Count50Ctb, newStd.Count300Ctb, 0, 0, PlayMode.Ctb ); oldRankedScore = oldStd.RankedScoreCtb; newRankedScore = newStd.RankedScoreCtb; oldPP = oldStd.PerformancePointsCtb; newPP = newStd.PerformancePointsCtb; break; case PlayMode.Mania: oldAcc = Accuracy.GetAccuracy( oldStd.Count300Mania, oldStd.Count100Mania, oldStd.Count50Mania, oldStd.Count300Mania, 0, 0, PlayMode.Mania ); newAcc = Accuracy.GetAccuracy( newStd.Count300Mania, newStd.Count100Mania, newStd.Count50Mania, newStd.Count300Mania, 0, 0, PlayMode.Mania ); oldRankedScore = oldStd.RankedScoreMania; newRankedScore = newStd.RankedScoreMania; oldPP = oldStd.PerformancePointsMania; newPP = newStd.PerformancePointsMania; break; default: return(Ok("")); } if (NewScore?.Position == 1 && (oldScore == null || oldScore.TotalScore < NewScore.TotalScore)) { _sora.SendMessage( $"[http://{_config.Server.Hostname}/{scores.ScoreOwner.Id} {scores.ScoreOwner.Username}] " + $"has reached #1 on [https://osu.ppy.sh/b/{bm.BeatmapID} {sets?[0].Title} [{bm.DiffName}]] " + $"using {ModUtil.ToString(NewScore.Mods)} " + $"Good job! +{NewScore.PeppyPoints:F}PP", "#announce", false ); } Logger.Info( $"{L_COL.RED}{scores.ScoreOwner.Username}", $"{L_COL.PURPLE}( {scores.ScoreOwner.Id} ){L_COL.WHITE}", $"has just submitted a Score! he earned {L_COL.BLUE}{NewScore?.PeppyPoints:F}PP", $"{L_COL.WHITE}with an Accuracy of {L_COL.RED}{NewScore?.Accuracy * 100:F}", $"{L_COL.WHITE}on {L_COL.YELLOW}{sets?[0].Title} [{bm.DiffName}]", $"{L_COL.WHITE}using {L_COL.BLUE}{ModUtil.ToString(NewScore?.Mods ?? Mod.None)}" ); var bmChart = new Chart( "beatmap", "Beatmap Ranking", $"https://osu.ppy.sh/b/{bm.BeatmapID}", oldScore?.Position ?? 0, NewScore?.Position ?? 0, oldScore?.MaxCombo ?? 0, NewScore?.MaxCombo ?? 0, oldScore?.Accuracy * 100 ?? 0, NewScore?.Accuracy * 100 ?? 0, (ulong)(oldScore?.TotalScore ?? 0), (ulong)(NewScore?.TotalScore ?? 0), oldScore?.PeppyPoints ?? 0, NewScore?.PeppyPoints ?? 0, NewScore?.Id ?? 0 ); cg.SetBMSet(bm.ParentSetID); var overallChart = new Chart( "overall", "Global Ranking", $"https://osu.ppy.sh/u/{scores.ScoreOwner.Id}", (int)oldStdPos, (int)newStdPos, 0, 0, oldAcc * 100, newAcc * 100, oldRankedScore, newRankedScore, oldPP, newPP, NewScore?.Id ?? 0, AchievementProcessor.ProcessAchievements( _factory, scores.ScoreOwner, scores, bm, cg.GetSets()[0], oldStd, newStd ) ); pr.LeaderboardStd = newStd; await _ev.RunEvent( EventType.BanchoUserStatsRequest, new BanchoUserStatsRequestArgs { userIds = new List <int> { scores.ScoreOwner.Id }, pr = pr } ); return(Ok( $"beatmapId:{bm.BeatmapID}|beatmapSetId:{bm.ParentSetID}|beatmapPlaycount:0|beatmapPasscount:0|approvedDate:\n\n" + bmChart.ToOsuString() + "\n" + overallChart.ToOsuString() )); }
public static void RemoveFriend(SoraDbContextFactory factory, int userId, int friendId) { using var db = factory.GetForWrite(); db.Context.RemoveRange(db.Context.Friends.Where(x => x.UserId == userId && x.FriendId == friendId)); }