Started cleanup of quote commands. Moving logic to the service

This commit is contained in:
Toastie (DCS Team) 2024-08-19 23:09:13 +12:00
parent 3ca832090e
commit afd5be89d1
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
3 changed files with 51 additions and 38 deletions

View file

@ -1,4 +1,5 @@
#nullable disable #nullable disable
using LinqToDB.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using EllieBot.Db.Models; using EllieBot.Db.Models;
@ -8,22 +9,7 @@ public static class QuoteExtensions
{ {
public static IEnumerable<Quote> GetForGuild(this DbSet<Quote> quotes, ulong guildId) public static IEnumerable<Quote> GetForGuild(this DbSet<Quote> quotes, ulong guildId)
=> quotes.AsQueryable().Where(x => x.GuildId == guildId); => quotes.AsQueryable().Where(x => x.GuildId == guildId);
public static IReadOnlyCollection<Quote> GetGroup(
this DbSet<Quote> quotes,
ulong guildId,
int page,
OrderType order)
{
var q = quotes.AsQueryable().Where(x => x.GuildId == guildId);
if (order == OrderType.Keyword)
q = q.OrderBy(x => x.Keyword);
else
q = q.OrderBy(x => x.Id);
return q.Skip(15 * page).Take(15).ToArray();
}
public static async Task<Quote> GetRandomQuoteByKeywordAsync( public static async Task<Quote> GetRandomQuoteByKeywordAsync(
this DbSet<Quote> quotes, this DbSet<Quote> quotes,
ulong guildId, ulong guildId,
@ -45,7 +31,7 @@ public static class QuoteExtensions
&& (EF.Functions.Like(q.Text.ToUpper(), $"%{text.ToUpper()}%") && (EF.Functions.Like(q.Text.ToUpper(), $"%{text.ToUpper()}%")
|| EF.Functions.Like(q.AuthorName, text))) || EF.Functions.Like(q.AuthorName, text)))
.ToArrayAsync()) .ToArrayAsync())
.RandomOrDefault(); .RandomOrDefault();
} }
public static void RemoveAllByKeyword(this DbSet<Quote> quotes, ulong guildId, string keyword) public static void RemoveAllByKeyword(this DbSet<Quote> quotes, ulong guildId, string keyword)

View file

@ -11,7 +11,7 @@ namespace EllieBot.Modules.Utility;
public partial class Utility public partial class Utility
{ {
[Group] [Group]
public partial class QuoteCommands : EllieModule public partial class QuoteCommands : EllieModule<QuoteService>
{ {
private const string PREPEND_EXPORT = private const string PREPEND_EXPORT =
""" """
@ -60,23 +60,20 @@ public partial class Utility
if (page < 0) if (page < 0)
return; return;
IEnumerable<Quote> quotes; var quotes = await _service.GetAllQuotesAsync(ctx.Guild.Id, page, order);
await using (var uow = _db.GetDbContext())
if (quotes.Count == 0)
{ {
quotes = uow.Set<Quote>().GetGroup(ctx.Guild.Id, page, order); await Response().Error(strs.quotes_page_none).SendAsync();
return;
} }
if (quotes.Any()) var list = quotes.Select(q => $"`{new kwum(q.Id)}` {Format.Bold(q.Keyword),-20} by {q.AuthorName}")
{ .Join("\n");
await Response()
.Confirm(GetText(strs.quotes_page(page + 1)), await Response()
string.Join("\n", .Confirm(GetText(strs.quotes_page(page + 1)), list)
quotes.Select(q .SendAsync();
=> $"`{new kwum(q.Id)}` {Format.Bold(q.Keyword.SanitizeAllMentions()),-20} by {q.AuthorName.SanitizeAllMentions()}")))
.SendAsync();
}
else
await Response().Error(strs.quotes_page_none).SendAsync();
} }
[Cmd] [Cmd]
@ -156,8 +153,8 @@ public partial class Utility
async (sm) => async (sm) =>
{ {
var msg = sm.Data.Components.FirstOrDefault()?.Value; var msg = sm.Data.Components.FirstOrDefault()?.Value;
if(!string.IsNullOrWhiteSpace(msg)) if (!string.IsNullOrWhiteSpace(msg))
await QuoteEdit(id, msg); await QuoteEdit(id, msg);
} }
); );
@ -306,7 +303,7 @@ public partial class Utility
.UpdateWithOutputAsync((del, ins) => ins); .UpdateWithOutputAsync((del, ins) => ins);
q = result.FirstOrDefault(); q = result.FirstOrDefault();
await uow.SaveChangesAsync(); await uow.SaveChangesAsync();
} }

View file

@ -13,7 +13,7 @@ public sealed class QuoteService : IQuoteService, IEService
{ {
_db = db; _db = db;
} }
/// <summary> /// <summary>
/// Delete all quotes created by the author in a guild /// Delete all quotes created by the author in a guild
/// </summary> /// </summary>
@ -24,9 +24,39 @@ public sealed class QuoteService : IQuoteService, IEService
{ {
await using var ctx = _db.GetDbContext(); await using var ctx = _db.GetDbContext();
var deleted = await ctx.GetTable<Quote>() var deleted = await ctx.GetTable<Quote>()
.Where(x => x.GuildId == guildId && x.AuthorId == userId) .Where(x => x.GuildId == guildId && x.AuthorId == userId)
.DeleteAsync(); .DeleteAsync();
return deleted; return deleted;
} }
/// <summary>
/// Delete all quotes in a guild
/// </summary>
/// <param name="guildId">ID of the guild</param>
/// <returns>Number of deleted qutoes</returns>
public async Task<int> DeleteAllQuotesAsync(ulong guildId)
{
await using var ctx = _db.GetDbContext();
var deleted = await ctx.GetTable<Quote>()
.Where(x => x.GuildId == guildId)
.DeleteAsync();
return deleted;
}
public async Task<IReadOnlyList<Quote>> GetAllQuotesAsync(ulong guildId, int page, OrderType order)
{
await using var uow = _db.GetDbContext();
var q = uow.Set<Quote>()
.ToLinqToDBTable()
.Where(x => x.GuildId == guildId);
if (order == OrderType.Keyword)
q = q.OrderBy(x => x.Keyword);
else
q = q.OrderBy(x => x.Id);
return await q.Skip(15 * page).Take(15).ToArrayAsync();
}
} }