diff --git a/OsuLazerServer/Controllers/BeatmapsController.cs b/OsuLazerServer/Controllers/BeatmapsController.cs index de4cd39b0be395252600b7760278542586d21845..4210939731fd57cac4001a2c28d7f158f97ce120 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 75a3e652ac5e1cb8a9c4449f969cc782b7d38694..5d1dec69f75971e938eb5bbff9f444aab58f7a90 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 aadc32b2f8c7f86a9af3daf5a26d2e761cb3561c..484633334915cc9838a506f89e645223885a738a 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 5f642f4757e9c6bb372adcd7a9758045674efb82..eff9dbbbfcfa26bb15f50897d01fe38cb492d78f 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)