public async Task <IMapSearchResult> FindMapData(IMapSearchArgs searchArgs, CancellationToken cancellationToken) { IMapSearchResult mapSearchResult = null; IModsEx foundMods = null; for (int i = 0; i < _mapDataFinders.Count; i++) { if ((_mapDataFinders[i].SearchModes & searchArgs.Status) == 0) { continue; } try { mapSearchResult = await _mapDataFinders[i].FindBeatmap(searchArgs, cancellationToken); } catch (OperationCanceledException) { throw; } catch (Exception e) { _logger.Log(e, LogLevel.Error); mapSearchResult = null; } if (mapSearchResult != null && mapSearchResult.BeatmapsFound.Any()) { if (mapSearchResult.Mods == null && foundMods != null) { mapSearchResult.Mods = foundMods; } _logger.Log($">Found data using \"{_mapDataFinders[i].SearcherName}\" ID: {mapSearchResult.BeatmapsFound[0]?.MapId}", LogLevel.Debug); break; } if (mapSearchResult?.Mods != null) { foundMods = mapSearchResult.Mods; } } if (mapSearchResult == null || !mapSearchResult.BeatmapsFound.Any()) { _logger.Log("Couldn't find map data for specified map search args", LogLevel.Warning); } return(mapSearchResult ?? new MapSearchResult(searchArgs)); }
public MapSearchResult FindMapData(MapSearchArgs searchArgs) { MapSearchResult mapSearchResult = null; IModsEx foundMods = null; for (int i = 0; i < _mapDataFinders.Count; i++) { if ((_mapDataFinders[i].SearchModes & searchArgs.Status) == 0) { continue; } try { mapSearchResult = _mapDataFinders[i].FindBeatmap(searchArgs); } catch (Exception e) { _logger.Log(e, LogLevel.Error); mapSearchResult = null; } if (mapSearchResult?.FoundBeatmaps == true) { if (mapSearchResult.Mods == null && foundMods != null) { mapSearchResult.Mods = foundMods; } _logger.Log(string.Format(">Found data using \"{0}\" ID: {1}", _mapDataFinders[i].SearcherName, mapSearchResult.BeatmapsFound[0]?.MapId), LogLevel.Advanced); break; } if (mapSearchResult?.Mods != null) { foundMods = mapSearchResult.Mods; } } if (mapSearchResult == null) { mapSearchResult = new MapSearchResult(searchArgs); } return(mapSearchResult); }
public static async Task <(Beatmap Beatmap, CancelableAsyncLazy <IPpCalculator> CreatePpCalculatorLazyTask)> LoadLazerBeatmapWithPerformanceCalculator(string osuFilePath, PlayMode?desiredPlayMode, IModsEx mods, ILogger logger, CancellationToken cancellationToken) { var createPpCalculatorTask = CreatePpCalculatorTask(osuFilePath, desiredPlayMode, mods, logger); var iPpCalculator = await createPpCalculatorTask.GetValueAsync(cancellationToken); if (iPpCalculator == null) { return(null, null); } var ppCalculator = (PpCalculator.PpCalculator)iPpCalculator; var lazerBeatmap = ppCalculator !.PlayableBeatmap; var mapAttributes = ppCalculator.AttributesAt(double.MaxValue); var scBeatmap = ConvertToSCBeatmap(lazerBeatmap, mapAttributes, osuFilePath, mods.Mods); return(scBeatmap, createPpCalculatorTask); }
private static CancelableAsyncLazy <IPpCalculator> CreatePpCalculatorTask(string osuFilePath, PlayMode?desiredPlayMode, IModsEx mods, ILogger logger) => new CancelableAsyncLazy <IPpCalculator>((cancellationToken) => { if (string.IsNullOrEmpty(osuFilePath)) { return(Task.FromResult <IPpCalculator>(null)); } var ppCalculator = PpCalculatorHelpers.GetPpCalculator((int)(desiredPlayMode ?? PlayMode.Osu), osuFilePath, null); ppCalculator.Mods = (mods?.WorkingMods ?? "").Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); try { ppCalculator.Calculate(cancellationToken); } catch (OperationCanceledException) { throw; } //specifically for BeatmapInvalidForRulesetException (beatmap had invalid hitobject with missing position data) catch (Exception e) { e.Data["PreventedCrash"] = 1; logger.Log(e, LogLevel.Critical); return(Task.FromResult <IPpCalculator>(null)); } return(Task.FromResult((IPpCalculator)ppCalculator)); });
public static async Task <(Beatmap Beatmap, CancelableAsyncLazy <IPpCalculator> CreatePpCalculatorLazyTask)> LoadLazerBeatmapWithPerformanceCalculator(string osuFilePath, PlayMode?desiredPlayMode, IModsEx mods, ILogger logger, CancellationToken cancellationToken) { var createPpCalculatorTask = CreatePpCalculatorTask(osuFilePath, desiredPlayMode, mods, logger); var iPpCalculator = await createPpCalculatorTask.GetValueAsync(cancellationToken); if (iPpCalculator == null) { return(null, null); } var ppCalculator = (PpCalculator.PpCalculator)iPpCalculator.Clone(); var moddedMapAttributes = ppCalculator.AttributesAt(double.MaxValue); if (IsDifficultyNoMod(mods.Mods)) { return(ConvertToSCBeatmap(ppCalculator.PlayableBeatmap, moddedMapAttributes, osuFilePath, mods.Mods), createPpCalculatorTask); } ppCalculator.Mods = null; ppCalculator.Calculate(cancellationToken); var noModMapAttributes = ppCalculator.AttributesAt(double.MaxValue); var scBeatmap = ConvertToSCBeatmap(ppCalculator.PlayableBeatmap, noModMapAttributes, osuFilePath, Mods.Omod); scBeatmap.ModPpStars[(PlayMode)ppCalculator.PlayableBeatmap.BeatmapInfo.RulesetID].Add((int)(mods.Mods & Mods.MapChanging), moddedMapAttributes?.StarRating ?? 0d); return(scBeatmap, createPpCalculatorTask); }