From 139d78275eff7223d92aaadffd9e73fb2bc1c878 Mon Sep 17 00:00:00 2001 From: Egor Dvachevskiy Date: Tue, 19 Apr 2022 17:46:39 +0300 Subject: [PATCH] Fixed beatmap search. --- .../Controllers/BeatmapsController.cs | 19 ++++++++++++++++--- .../Beatmaps/BeatmapSetResolverService.cs | 6 +++--- OsuLazerServer/Services/Users/IUserStorage.cs | 1 + OsuLazerServer/Services/Users/UserStorage.cs | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/OsuLazerServer/Controllers/BeatmapsController.cs b/OsuLazerServer/Controllers/BeatmapsController.cs index de4cd39..4210939 100644 --- a/OsuLazerServer/Controllers/BeatmapsController.cs +++ b/OsuLazerServer/Controllers/BeatmapsController.cs @@ -1,8 +1,10 @@ using System.Text.Json; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json.Linq; using OsuLazerServer.Attributes; using OsuLazerServer.Models.Response.Beatmaps; using OsuLazerServer.Services.Beatmaps; +using OsuLazerServer.Services.Users; using OsuLazerServer.Utils; namespace OsuLazerServer.Controllers; @@ -13,6 +15,7 @@ namespace OsuLazerServer.Controllers; public class BeatmapsController : Controller { private IBeatmapSetResolver _resolver; + public BeatmapsController(IBeatmapSetResolver resolver) { @@ -20,9 +23,19 @@ public class BeatmapsController : Controller } [HttpGet("search")] - public async Task GetBeatmapSets([FromQuery(Name = "q")] string? query = "all", [FromQuery(Name = "s")] string? status = "leaderboard", [FromQuery(Name = "mode")] string? mode = "osu") + public async Task GetBeatmapSets([FromServices] IUserStorage storage, [FromQuery(Name = "q")] string? query = "all", [FromQuery(Name = "s")] string? status = "leaderboard", [FromQuery(Name = "m")] string? mode = "0", [FromQuery(Name = "cursor[id]")] string? cursor = "0") { - var beatmaps = await _resolver.FetchSets(query == "all" ? "" : query, ModeUtils.RuleSetId(mode), 0, false, status == "all" ? "any" : status); - return Json(new { beatmapsets = beatmaps.Take(50).Select(b => b.ToBeatmapSet()), total = beatmaps.Count}); + if (cursor == "0" || !storage.BeatmapCursorOffset.ContainsKey(cursor)) + { + cursor = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); + } + + storage.BeatmapCursorOffset.TryAdd(cursor, 0); + var beatmaps = await _resolver.FetchSets(query == "all" ? "" : query, Convert.ToInt32(mode), storage.BeatmapCursorOffset[cursor], false, status == "all" ? "any" : status); + storage.BeatmapCursorOffset[cursor] += 50; + return Json(new { beatmapsets = beatmaps.Take(50).Select(b => b.ToBeatmapSet()), total = (beatmaps.Count + 50), cursor = new Dictionary() + { + {"id", cursor} + }}); } } \ No newline at end of file diff --git a/OsuLazerServer/Services/Beatmaps/BeatmapSetResolverService.cs b/OsuLazerServer/Services/Beatmaps/BeatmapSetResolverService.cs index 75a3e65..5d1dec6 100644 --- a/OsuLazerServer/Services/Beatmaps/BeatmapSetResolverService.cs +++ b/OsuLazerServer/Services/Beatmaps/BeatmapSetResolverService.cs @@ -24,7 +24,7 @@ public class BeatmapSetResolverService : IBeatmapSetResolver, IServiceScope using var scope = ServiceProvider.CreateScope(); var cache = scope.ServiceProvider.GetService(); - var request = await (new HttpClient()).GetAsync($"https://rus.nerinyan.moe/search?m={mode}&p={offset}&s={status}&nsfw={nsfw}&e=&q={query}&sort=ranked_desc&creator=0"); + var request = await (new HttpClient()).GetAsync($"https://api.nerinyan.moe/search?m={mode}&p={offset}&s={status}&nsfw={nsfw}&e=&q={query}&sort=ranked_desc&creator=0"); if (!request.IsSuccessStatusCode) return null; @@ -60,7 +60,7 @@ public class BeatmapSetResolverService : IBeatmapSetResolver, IServiceScope return (BeatmapSet) beatmapsets!; } - var request = await (new HttpClient()).GetAsync($"https://rus.nerinyan.moe/search/beatmapset/{setId}"); + var request = await (new HttpClient()).GetAsync($"https://api.nerinyan.moe/search/beatmapset/{setId}"); var body = JsonSerializer.Deserialize(await request.Content.ReadAsStringAsync()); if (body is not null) @@ -85,7 +85,7 @@ public class BeatmapSetResolverService : IBeatmapSetResolver, IServiceScope return (Beatmap) beatmap!; } - var request = await (new HttpClient()).GetAsync($"https://rus.nerinyan.moe/search/beatmap/{beatmapId}"); + var request = await (new HttpClient()).GetAsync($"https://api.nerinyan.moe/search/beatmap/{beatmapId}"); if (!request.IsSuccessStatusCode) diff --git a/OsuLazerServer/Services/Users/IUserStorage.cs b/OsuLazerServer/Services/Users/IUserStorage.cs index aadc32b..4846333 100644 --- a/OsuLazerServer/Services/Users/IUserStorage.cs +++ b/OsuLazerServer/Services/Users/IUserStorage.cs @@ -25,6 +25,7 @@ public interface IUserStorage public Dictionary UserStates { get; set; } public Dictionary HubRooms { get; set; } public Dictionary PlaylistItems { get; set; } + public Dictionary BeatmapCursorOffset { get; set; } #region Channels public Task SendMessageToUser(User user, string message, bool isAction); diff --git a/OsuLazerServer/Services/Users/UserStorage.cs b/OsuLazerServer/Services/Users/UserStorage.cs index 5f642f4..eff9dbb 100644 --- a/OsuLazerServer/Services/Users/UserStorage.cs +++ b/OsuLazerServer/Services/Users/UserStorage.cs @@ -32,6 +32,7 @@ public class UserStorage : IUserStorage, IServiceScope public Dictionary UserStates { get; set; } = new(); public Dictionary HubRooms { get; set; } = new(); public Dictionary PlaylistItems { get; set; } = new(); + public Dictionary BeatmapCursorOffset { get; set; } = new(); public IServiceScope Scope { get; set; } public IServiceProvider ServiceProvider { get; } public UserStorage(IServiceProvider scope) -- GitLab