From 8a6edc17e44cae7946e963f724819ed97c64bf63 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Tue, 15 Nov 2022 22:45:00 +0100 Subject: [PATCH] Optimized .waifuinfo --- .../Db/Extensions/WaifuExtensions.cs | 18 +------- src/NadekoBot/Db/Models/Waifu.cs | 2 +- src/NadekoBot/Db/Models/WaifuItem.cs | 2 +- .../Gambling/Waifus/WaifuClaimCommands.cs | 28 ++++++------- .../Modules/Gambling/Waifus/WaifuService.cs | 42 ++++++++++++------- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/NadekoBot/Db/Extensions/WaifuExtensions.cs b/src/NadekoBot/Db/Extensions/WaifuExtensions.cs index fabdd83b6..a5487f3a8 100644 --- a/src/NadekoBot/Db/Extensions/WaifuExtensions.cs +++ b/src/NadekoBot/Db/Extensions/WaifuExtensions.cs @@ -10,6 +10,7 @@ namespace NadekoBot.Db; public class WaifuInfoStats { + public int WaifuId { get; init; } public string FullName { get; init; } public long Price { get; init; } public string ClaimerName { get; init; } @@ -17,9 +18,6 @@ public class WaifuInfoStats public int AffinityCount { get; init; } public int DivorceCount { get; init; } public int ClaimCount { get; init; } - public List Items { get; init; } - public List Claims { get; init; } - public List Fans { get; init; } } public static class WaifuExtensions @@ -103,6 +101,7 @@ public static class WaifuExtensions .FirstOrDefault()) .Select(w => new WaifuInfoStats { + WaifuId = w.WaifuId, FullName = ctx.Set() .AsQueryable() @@ -134,20 +133,7 @@ public static class WaifuExtensions .Count(x => x.OldId == w.WaifuId && x.NewId == null && x.UpdateType == WaifuUpdateType.Claimed), - Price = w.Price, - - Claims = ctx.WaifuInfo - .Where(x => x.ClaimerId == w.WaifuId) - .Select(x => x.WaifuId) - .ToList(), - - Fans = ctx.WaifuInfo - .Where(x => x.AffinityId == w.WaifuId) - .Select(x => x.WaifuId) - .ToList(), - - Items = w.Items }) .FirstOrDefault(); diff --git a/src/NadekoBot/Db/Models/Waifu.cs b/src/NadekoBot/Db/Models/Waifu.cs index f1f512603..39bb3de41 100644 --- a/src/NadekoBot/Db/Models/Waifu.cs +++ b/src/NadekoBot/Db/Models/Waifu.cs @@ -7,7 +7,7 @@ public class WaifuInfo : DbEntity { public int WaifuId { get; set; } public DiscordUser Waifu { get; set; } - + public int? ClaimerId { get; set; } public DiscordUser Claimer { get; set; } diff --git a/src/NadekoBot/Db/Models/WaifuItem.cs b/src/NadekoBot/Db/Models/WaifuItem.cs index 228d2a1d8..e20e1d313 100644 --- a/src/NadekoBot/Db/Models/WaifuItem.cs +++ b/src/NadekoBot/Db/Models/WaifuItem.cs @@ -7,4 +7,4 @@ public class WaifuItem : DbEntity public int? WaifuInfoId { get; set; } public string ItemEmoji { get; set; } public string Name { get; set; } -} \ No newline at end of file +} diff --git a/src/NadekoBot/Modules/Gambling/Waifus/WaifuClaimCommands.cs b/src/NadekoBot/Modules/Gambling/Waifus/WaifuClaimCommands.cs index 7b65d337b..84d8499e9 100644 --- a/src/NadekoBot/Modules/Gambling/Waifus/WaifuClaimCommands.cs +++ b/src/NadekoBot/Modules/Gambling/Waifus/WaifuClaimCommands.cs @@ -245,28 +245,28 @@ public partial class Gambling var waifuItems = _service.GetWaifuItems().ToDictionary(x => x.ItemEmoji, x => x); var nobody = GetText(strs.nobody); - var itemsStr = !wi.Items.Any() + var itemList = await _service.GetItems(wi.WaifuId); + var itemsStr = !itemList.Any() ? "-" : string.Join("\n", - wi.Items.Where(x => waifuItems.TryGetValue(x.ItemEmoji, out _)) - .OrderBy(x => waifuItems[x.ItemEmoji].Price) - .GroupBy(x => x.ItemEmoji) - .Select(x => $"{x.Key} x{x.Count(),-3}") - .Chunk(2) - .Select(x => string.Join(" ", x))); + itemList.Where(x => waifuItems.TryGetValue(x.ItemEmoji, out _)) + .OrderBy(x => waifuItems[x.ItemEmoji].Price) + .GroupBy(x => x.ItemEmoji) + .Select(x => $"{x.Key} x{x.Count(),-3}") + .Chunk(2) + .Select(x => string.Join(" ", x))); - var claimsNames = (await _service.GetBulkWaifuNames(wi.Claims)); + var claimsNames = (await _service.GetClaimNames(wi.WaifuId)); var claimsStr = claimsNames .Shuffle() .Take(30) .Join('\n'); - - var fansStr = (await _service.GetBulkWaifuNames(wi.Fans - .Shuffle() - .Take(30))) + + var fansList = await _service.GetFansNames(wi.WaifuId); + var fansStr = fansList .Select((x) => claimsNames.Contains(x) ? $"{x} 💞" : x).Join('\n'); - + if (string.IsNullOrWhiteSpace(fansStr)) fansStr = "-"; @@ -284,7 +284,7 @@ public partial class Gambling .AddField(GetText(strs.changes_of_heart), $"{wi.AffinityCount} - \"the {affInfo}\"", true) .AddField(GetText(strs.divorces), wi.DivorceCount.ToString(), true) .AddField("\u200B", "\u200B", true) - .AddField(GetText(strs.fans(wi.Fans.Count)), fansStr, true) + .AddField(GetText(strs.fans(fansList.Count)), fansStr, true) .AddField($"Waifus ({wi.ClaimCount})", wi.ClaimCount == 0 ? nobody : claimsStr, true) diff --git a/src/NadekoBot/Modules/Gambling/Waifus/WaifuService.cs b/src/NadekoBot/Modules/Gambling/Waifus/WaifuService.cs index 6604ad8ee..319f42111 100644 --- a/src/NadekoBot/Modules/Gambling/Waifus/WaifuService.cs +++ b/src/NadekoBot/Modules/Gambling/Waifus/WaifuService.cs @@ -414,11 +414,8 @@ public class WaifuService : INService, IReadyExecutor AffinityName = null, ClaimCount = 0, ClaimerName = null, - Claims = new(), - Fans = new(), DivorceCount = 0, FullName = null, - Items = new(), Price = 1 }; } @@ -426,14 +423,6 @@ public class WaifuService : INService, IReadyExecutor return wi; } - public async Task GetFullWaifuInfoAsync(IGuildUser target) - { - await using var uow = _db.GetDbContext(); - _ = uow.GetOrCreateUser(target); - - return await GetFullWaifuInfoAsync(target.Id); - } - public string GetClaimTitle(int count) { ClaimTitle title; @@ -558,12 +547,37 @@ public class WaifuService : INService, IReadyExecutor } } - public async Task> GetBulkWaifuNames(IEnumerable take) + public async Task> GetClaimNames(int waifuId) { await using var ctx = _db.GetDbContext(); return await ctx.GetTable() - .Where(x => take.Contains(x.Id)) + .Where(x => ctx.GetTable() + .Where(wi => wi.ClaimerId == waifuId) + .Select(wi => wi.WaifuId) + .Contains(x.Id)) .Select(x => $"{x.Username}#{x.Discriminator}") - .ToListAsyncLinqToDB(); + .ToListAsyncEF(); + } + public async Task> GetFansNames(int waifuId) + { + await using var ctx = _db.GetDbContext(); + return await ctx.GetTable() + .Where(x => ctx.GetTable() + .Where(wi => wi.AffinityId == waifuId) + .Select(wi => wi.WaifuId) + .Contains(x.Id)) + .Select(x => $"{x.Username}#{x.Discriminator}") + .ToListAsyncEF(); + } + + public async Task> GetItems(int waifuId) + { + await using var ctx = _db.GetDbContext(); + return await ctx.GetTable() + .Where(x => x.WaifuInfoId == ctx.GetTable() + .Where(x => x.WaifuId == waifuId) + .Select(x => x.Id) + .FirstOrDefault()) + .ToListAsyncEF(); } } \ No newline at end of file