From fa41c5a3197176a5d24c9efbcd8959f96bbc4a0c Mon Sep 17 00:00:00 2001 From: Kwoth Date: Sun, 16 Jan 2022 21:01:33 +0100 Subject: [PATCH] .clubinfo performance improvement and fixed an issue with cyrillic clubs not showing up at all even with correct capitalization --- src/NadekoBot/Db/Extensions/ClubExtensions.cs | 11 +++- src/NadekoBot/Modules/Xp/Club/Club.cs | 66 ++++++++++--------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/src/NadekoBot/Db/Extensions/ClubExtensions.cs b/src/NadekoBot/Db/Extensions/ClubExtensions.cs index 2ccb9e33e..faad3a492 100644 --- a/src/NadekoBot/Db/Extensions/ClubExtensions.cs +++ b/src/NadekoBot/Db/Extensions/ClubExtensions.cs @@ -26,10 +26,17 @@ public static class ClubExtensions => Include(clubs).FirstOrDefault(c => c.Users.Any(u => u.UserId == userId)); public static ClubInfo GetByName(this DbSet clubs, string name, int discrim) - => Include(clubs).FirstOrDefault(c => c.Name.ToUpper() == name.ToUpper() && c.Discrim == discrim); + => Include(clubs) + .FirstOrDefault(c => EF.Functions.Collate(c.Name, "NOCASE") == EF.Functions.Collate(name, "NOCASE") + && c.Discrim == discrim); public static int GetNextDiscrim(this DbSet clubs, string name) - => Include(clubs).Where(x => x.Name.ToUpper() == name.ToUpper()).Select(x => x.Discrim).DefaultIfEmpty().Max() + => Include(clubs) + .Where(x => + EF.Functions.Collate(x.Name, "NOCASE") == EF.Functions.Collate(name, "NOCASE")) + .Select(x => x.Discrim) + .DefaultIfEmpty() + .Max() + 1; public static List GetClubLeaderboardPage(this DbSet clubs, int page) diff --git a/src/NadekoBot/Modules/Xp/Club/Club.cs b/src/NadekoBot/Modules/Xp/Club/Club.cs index 3bb77d993..ec2d7d582 100644 --- a/src/NadekoBot/Modules/Xp/Club/Club.cs +++ b/src/NadekoBot/Modules/Xp/Club/Club.cs @@ -1,4 +1,5 @@ #nullable disable +using NadekoBot.Db.Models; using NadekoBot.Modules.Xp.Services; namespace NadekoBot.Modules.Xp; @@ -76,37 +77,8 @@ public partial class Xp await ReplyConfirmLocalizedAsync(strs.club_icon_set); } - [Cmd] - [Priority(1)] - public async partial Task ClubInformation(IUser user = null) + private async Task InternalClubInfoAsync(ClubInfo club) { - user ??= ctx.User; - var club = _service.GetClubByMember(user); - if (club is null) - { - await ErrorLocalizedAsync(strs.club_user_not_in_club(Format.Bold(user.ToString()))); - return; - } - - await ClubInformation(club.ToString()); - } - - [Cmd] - [Priority(0)] - public async partial Task ClubInformation([Leftover] string clubName = null) - { - if (string.IsNullOrWhiteSpace(clubName)) - { - await ClubInformation(ctx.User); - return; - } - - if (!_service.GetClubByName(clubName, out var club)) - { - await ReplyErrorLocalizedAsync(strs.club_not_exists); - return; - } - var lvl = new LevelStats(club.Xp); var users = club.Users.OrderByDescending(x => { @@ -153,6 +125,40 @@ public partial class Xp 10); } + [Cmd] + [Priority(1)] + public async partial Task ClubInformation(IUser user = null) + { + user ??= ctx.User; + var club = _service.GetClubByMember(user); + if (club is null) + { + await ErrorLocalizedAsync(strs.club_user_not_in_club(Format.Bold(user.ToString()))); + return; + } + + await InternalClubInfoAsync(club); + } + + [Cmd] + [Priority(0)] + public async partial Task ClubInformation([Leftover] string clubName = null) + { + if (string.IsNullOrWhiteSpace(clubName)) + { + await ClubInformation(ctx.User); + return; + } + + if (!_service.GetClubByName(clubName, out var club)) + { + await ReplyErrorLocalizedAsync(strs.club_not_exists); + return; + } + + await InternalClubInfoAsync(club); + } + [Cmd] public partial Task ClubBans(int page = 1) {