public DatabaseHouseKeeper( Storage storage, RequestLimiter requestLimiter, IAPIProvider apiProvider, IBeatmapSearchEngineProvider searchEngine, BeatmapDownloader beatmapDownloader, DbContextPool <PisstaubeDbContext> dbContextPool) : base(storage, requestLimiter, apiProvider, searchEngine, beatmapDownloader, dbContextPool) { _requestLimiter = requestLimiter; _dbContextPool = dbContextPool; }
public OsuCrawler(Storage storage, RequestLimiter requestLimiter, IAPIProvider apiProvider, IBeatmapSearchEngineProvider searchEngine, BeatmapDownloader beatmapDownloader, DbContextPool <PisstaubeDbContext> dbContextPool) { _storage = storage; _beatmapDownloader = beatmapDownloader; _dbContextPool = dbContextPool; SearchEngine = searchEngine; ApiProvider = apiProvider; RequestLimiter = requestLimiter; }
public IndexController(IAPIProvider apiProvider, Storage storage, PisstaubeCacheDbContextFactory cache, BeatmapDownloader downloader, SetDownloader setDownloader, PisstaubeDbContext dbContext) { _apiProvider = apiProvider; _cache = cache; _downloader = downloader; _setDownloader = setDownloader; _dbContext = dbContext; _fileStorage = storage.GetStorageForDirectory("files"); }
public IndexController(APIAccess apiAccess, Storage storage, PisstaubeCacheDbContextFactory cache, BeatmapDownloader downloader, SetDownloader setDownloader, PisstaubeDbContextFactory contextFactory) { _apiAccess = apiAccess; _storage = storage; _cache = cache; _downloader = downloader; _setDownloader = setDownloader; _contextFactory = contextFactory; _fileStorage = storage.GetStorageForDirectory("files"); }
public Crawler(BeatmapSearchEngine search, APIAccess apiAccess, RulesetStore store, BeatmapDownloader downloader, PisstaubeCacheDbContextFactory cache, RequestLimiter rl, PisstaubeDbContextFactory contextFactory) { _pool = new List <Thread>(); _search = search; _apiAccess = apiAccess; _store = store; _downloader = downloader; _cache = cache; _rl = rl; _contextFactory = contextFactory; _workerThreads = int.Parse(Environment.GetEnvironmentVariable("CRAWLER_THREADS")); }
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() )); }