improved .xplb -c, it will now correctly work only on users who are still in the server, isntead of only top 1k

Fixed marmalade error on bot startup
This commit is contained in:
Toastie (DCS Team) 2024-10-05 14:14:33 +13:00
parent 5c72c6562f
commit 113dc3748a
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
4 changed files with 60 additions and 61 deletions

View file

@ -26,17 +26,6 @@ public static class UserXpExtensions
return usr; return usr;
} }
public static async Task<IReadOnlyCollection<UserXpStats>> GetUsersFor(
this DbSet<UserXpStats> xps,
ulong guildId,
int page)
=> await xps.ToLinqToDBTable()
.Where(x => x.GuildId == guildId)
.OrderByDescending(x => x.Xp + x.AwardedXp)
.Skip(page * 9)
.Take(9)
.ToArrayAsyncLinqToDB();
public static async Task<List<UserXpStats>> GetTopUserXps(this DbSet<UserXpStats> xps, ulong guildId, int count) public static async Task<List<UserXpStats>> GetTopUserXps(this DbSet<UserXpStats> xps, ulong guildId, int count)
=> await xps.ToLinqToDBTable() => await xps.ToLinqToDBTable()
.Where(x => x.GuildId == guildId) .Where(x => x.GuildId == guildId)

View file

@ -183,27 +183,26 @@ public partial class Xp : EllieModule<XpService>
await ctx.Channel.TriggerTypingAsync(); await ctx.Channel.TriggerTypingAsync();
var socketGuild = (SocketGuild)ctx.Guild;
var allCleanUsers = new List<UserXpStats>(); async Task<IReadOnlyCollection<UserXpStats>> GetPageItems(int curPage)
if (opts.Clean)
{ {
await ctx.Channel.TriggerTypingAsync(); var socketGuild = (SocketGuild)ctx.Guild;
await _tracker.EnsureUsersDownloadedAsync(ctx.Guild); if (opts.Clean)
{
await ctx.Channel.TriggerTypingAsync();
await _tracker.EnsureUsersDownloadedAsync(ctx.Guild);
allCleanUsers = (await _service.GetTopUserXps(ctx.Guild.Id, 1000)) return await _service.GetTopUserXps(ctx.Guild.Id,
.Where(user => socketGuild.GetUser(user.UserId) is not null) socketGuild.Users.Select(x => x.Id).ToList(),
.ToList(); curPage);
}
return await _service.GetUserXps(ctx.Guild.Id, curPage);
} }
var res = opts.Clean await Response()
? Response()
.Paginated() .Paginated()
.Items(allCleanUsers) .PageItems(GetPageItems)
: Response()
.Paginated()
.PageItems((curPage) => _service.GetUserXps(ctx.Guild.Id, curPage));
await res
.PageSize(9) .PageSize(9)
.CurrentPage(page) .CurrentPage(page)
.Page((users, curPage) => .Page((users, curPage) =>

View file

@ -12,6 +12,7 @@ using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing;
using System.Threading.Channels; using System.Threading.Channels;
using LinqToDB.EntityFrameworkCore; using LinqToDB.EntityFrameworkCore;
using LinqToDB.Tools;
using EllieBot.Modules.Patronage; using EllieBot.Modules.Patronage;
using Color = SixLabors.ImageSharp.Color; using Color = SixLabors.ImageSharp.Color;
using Exception = System.Exception; using Exception = System.Exception;
@ -191,9 +192,9 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
var items = await ctx.Set<DiscordUser>() var items = await ctx.Set<DiscordUser>()
.Where(x => group.Contains(x.UserId)) .Where(x => group.Contains(x.UserId))
.UpdateWithOutputAsync(old => new() .UpdateWithOutputAsync(old => new()
{ {
TotalXp = old.TotalXp + group.Key TotalXp = old.TotalXp + group.Key
}, },
(_, n) => n); (_, n) => n);
await ctx.Set<ClubInfo>() await ctx.Set<ClubInfo>()
@ -216,9 +217,9 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
.Where(x => x.GuildId == guildId) .Where(x => x.GuildId == guildId)
.Where(x => group.Contains(x.UserId)) .Where(x => group.Contains(x.UserId))
.UpdateWithOutputAsync(old => new() .UpdateWithOutputAsync(old => new()
{ {
Xp = old.Xp + group.Key Xp = old.Xp + group.Key
}, },
(_, n) => n); (_, n) => n);
gxps.AddRange(items); gxps.AddRange(items);
@ -230,14 +231,14 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
.Set<UserXpStats>() .Set<UserXpStats>()
.ToLinqToDBTable() .ToLinqToDBTable()
.InsertOrUpdateAsync(() => new UserXpStats() .InsertOrUpdateAsync(() => new UserXpStats()
{ {
UserId = userId, UserId = userId,
GuildId = guildId, GuildId = guildId,
Xp = group.Key, Xp = group.Key,
DateAdded = DateTime.UtcNow, DateAdded = DateTime.UtcNow,
AwardedXp = 0, AwardedXp = 0,
NotifyOnLevelUp = XpNotificationLocation.None NotifyOnLevelUp = XpNotificationLocation.None
}, },
_ => new() _ => new()
{ {
}, },
@ -566,13 +567,24 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
public async Task<IReadOnlyCollection<UserXpStats>> GetUserXps(ulong guildId, int page) public async Task<IReadOnlyCollection<UserXpStats>> GetUserXps(ulong guildId, int page)
{ {
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
return await uow.Set<UserXpStats>().GetUsersFor(guildId, page); return await uow
.UserXpStats
.Where(x => x.GuildId == guildId)
.OrderByDescending(x => x.Xp + x.AwardedXp)
.Skip(page * 9)
.Take(9)
.ToArrayAsyncLinqToDB();
} }
public async Task<IReadOnlyCollection<UserXpStats>> GetTopUserXps(ulong guildId, int count) public async Task<IReadOnlyCollection<UserXpStats>> GetTopUserXps(ulong guildId, List<ulong> users, int curPage)
{ {
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
return await uow.Set<UserXpStats>().GetTopUserXps(guildId, count); return await uow.Set<UserXpStats>()
.Where(x => x.GuildId == guildId && x.UserId.In(users))
.OrderByDescending(x => x.Xp + x.AwardedXp)
.Skip(curPage * 9)
.Take(9)
.ToArrayAsyncLinqToDB();
} }
public Task<IReadOnlyCollection<DiscordUser>> GetUserXps(int page, int perPage = 9) public Task<IReadOnlyCollection<DiscordUser>> GetUserXps(int page, int perPage = 9)
@ -1011,12 +1023,12 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
img.Mutate(x => img.Mutate(x =>
{ {
x.DrawText(new RichTextOptions(usernameFont) x.DrawText(new RichTextOptions(usernameFont)
{ {
HorizontalAlignment = HorizontalAlignment.Left, HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
FallbackFontFamilies = _fonts.FallBackFonts, FallbackFontFamilies = _fonts.FallBackFonts,
Origin = new(template.User.Name.Pos.X, template.User.Name.Pos.Y + 8) Origin = new(template.User.Name.Pos.X, template.User.Name.Pos.Y + 8)
}, },
"@" + username, "@" + username,
Brushes.Solid(template.User.Name.Color), Brushes.Solid(template.User.Name.Color),
outlinePen); outlinePen);
@ -1032,12 +1044,12 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
var clubFont = _fonts.NotoSans.CreateFont(template.Club.Name.FontSize, FontStyle.Regular); var clubFont = _fonts.NotoSans.CreateFont(template.Club.Name.FontSize, FontStyle.Regular);
img.Mutate(x => x.DrawText(new RichTextOptions(clubFont) img.Mutate(x => x.DrawText(new RichTextOptions(clubFont)
{ {
HorizontalAlignment = HorizontalAlignment.Right, HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Top, VerticalAlignment = VerticalAlignment.Top,
FallbackFontFamilies = _fonts.FallBackFonts, FallbackFontFamilies = _fonts.FallBackFonts,
Origin = new(template.Club.Name.Pos.X + 50, template.Club.Name.Pos.Y - 8) Origin = new(template.Club.Name.Pos.X + 50, template.Club.Name.Pos.Y - 8)
}, },
clubName, clubName,
Brushes.Solid(template.Club.Name.Color), Brushes.Solid(template.Club.Name.Color),
outlinePen)); outlinePen));
@ -1249,9 +1261,9 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
if (template.Club.Icon.Show) if (template.Club.Icon.Show)
await DrawClubImage(img, stats); await DrawClubImage(img, stats);
// #if GLOBAL_ELLIE // #if GLOBAL_ELLIE
await DrawFrame(img, stats.User.UserId); await DrawFrame(img, stats.User.UserId);
// #endif // #endif
var outputSize = template.OutputSize; var outputSize = template.OutputSize;
if (outputSize.X != img.Width || outputSize.Y != img.Height) if (outputSize.X != img.Width || outputSize.Y != img.Height)
@ -1309,7 +1321,7 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
if (frame is not null) if (frame is not null)
img.Mutate(x => x.DrawImage(frame, new Point(0, 0), new GraphicsOptions())); img.Mutate(x => x.DrawImage(frame, new Point(0, 0), new GraphicsOptions()));
} }
// #endif // #endif
private void DrawXpBar(float percent, XpBar info, Image<Rgba32> img) private void DrawXpBar(float percent, XpBar info, Image<Rgba32> img)
{ {

View file

@ -1,5 +1,4 @@
# DO NOT CHANGE # DO NOT CHANGE
version: 1 version: 1
# List of marmalades automatically loaded at startup # List of marmalades automatically loaded at startup
loaded: loaded: []
- ngrpc