From ca0ec139d91f2da70b46a54498cf335433f1c163 Mon Sep 17 00:00:00 2001 From: BtbN Date: Thu, 6 Jun 2019 18:27:55 +0200 Subject: [PATCH] Cache recommended songs so they persist one credit --- ClanServer/CacheKeys.cs | 12 ++++++++++++ ClanServer/Controllers/L44/Gametop.cs | 17 +++++++++-------- ClanServer/Controllers/L44/Recommend.cs | 21 ++++++++++++++++----- ClanServer/Startup.cs | 11 +++++++---- 4 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 ClanServer/CacheKeys.cs diff --git a/ClanServer/CacheKeys.cs b/ClanServer/CacheKeys.cs new file mode 100644 index 0000000..e3fb805 --- /dev/null +++ b/ClanServer/CacheKeys.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace ClanServer +{ + public static class CacheKeys + { + public static string GetRecommendedSongsKey(int jid) => $"_RecommendedSongs_{jid}"; + } +} diff --git a/ClanServer/Controllers/L44/Gametop.cs b/ClanServer/Controllers/L44/Gametop.cs index e1c6bd9..a85e153 100644 --- a/ClanServer/Controllers/L44/Gametop.cs +++ b/ClanServer/Controllers/L44/Gametop.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using eAmuseCore.KBinXML; @@ -19,9 +20,11 @@ namespace ClanServer.Controllers.L44 public class GametopController : ControllerBase { private readonly ClanServerContext ctx; + private readonly IMemoryCache cache; - public GametopController(ClanServerContext ctx) + public GametopController(IMemoryCache cache, ClanServerContext ctx) { + this.cache = cache; this.ctx = ctx; } @@ -158,12 +161,10 @@ namespace ClanServer.Controllers.L44 var profile = player.JubeatProfile; bool changed = false; - - await ctx.Entry(profile).Reference(p => p.ClanData).LoadAsync(); - await ctx.Entry(profile).Reference(p => p.ClanSettings).LoadAsync(); - bool freshProfile = false; + cache.Remove(CacheKeys.GetRecommendedSongsKey(profile.ID)); + if (profile.ClanData == null) { Random rng = new Random(); @@ -171,10 +172,10 @@ namespace ClanServer.Controllers.L44 profile.ClanData = new JubeatClanProfileData() { Team = (byte)(rng.Next(1, 5)), - Street = rng.Next(1, 19), + Street = rng.Next(1, 9), Section = rng.Next(1, 5), - HouseNo1 = (short)(rng.Next(1, 25)), - HouseNo2 = (short)(rng.Next(1, 241)), + HouseNo1 = (short)(rng.Next(1, 10)), + HouseNo2 = (short)(rng.Next(1, 100)), TuneCount = 0, ClearCount = 0, diff --git a/ClanServer/Controllers/L44/Recommend.cs b/ClanServer/Controllers/L44/Recommend.cs index 33d9738..7eae12f 100644 --- a/ClanServer/Controllers/L44/Recommend.cs +++ b/ClanServer/Controllers/L44/Recommend.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; using eAmuseCore.KBinXML; @@ -15,17 +16,27 @@ namespace ClanServer.Controllers.L44 [ApiController, Route("L44")] public class RecommendController : ControllerBase { + private readonly Random rng = new Random(); + private readonly IMemoryCache cache; + + public RecommendController(IMemoryCache cache) + { + this.cache = cache; + } + [HttpPost, Route("8"), XrpcCall("recommend.get_recommend")] public async Task> GetRecommend([FromBody] EamuseXrpcData data) { XElement recommend = data.Document.Element("call").Element("recommend"); XElement player = recommend.Element("data").Element("player"); - _ = int.Parse(player.Element("jid").Value); + int jid = int.Parse(player.Element("jid").Value); - ClanMusicInfo mInfo = await ClanMusicInfo.Instance; - - List recommendedMusic = mInfo.GetRandomSongs(10); - Random rng = new Random(); + List recommendedMusic = + await cache.GetOrCreateAsync(CacheKeys.GetRecommendedSongsKey(jid), async entry => + { + entry.SlidingExpiration = TimeSpan.FromMinutes(30); + return (await ClanMusicInfo.Instance).GetRandomSongs(10); + }); XElement musicList = new XElement("music_list"); diff --git a/ClanServer/Startup.cs b/ClanServer/Startup.cs index 5faecda..8ffb02f 100644 --- a/ClanServer/Startup.cs +++ b/ClanServer/Startup.cs @@ -26,10 +26,13 @@ namespace ClanServer public void ConfigureServices(IServiceCollection services) { - services.AddDbContext(options => - { - options.UseSqlite("Data Source=clanserver.db"); - }); + services.AddMemoryCache(); + + services + .AddDbContext(options => + { + options.UseSqlite("Data Source=clanserver.db"); + }); services .AddMvc(options =>