add invite repository to replace ef core
This commit is contained in:
parent
5891f28f7c
commit
64b4c26d93
12 changed files with 112 additions and 301 deletions
|
|
@ -15,12 +15,10 @@
|
|||
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Runtime.InteropServices;
|
||||
using Catalogger.Backend.Cache;
|
||||
using Catalogger.Backend.Cache.InMemoryCache;
|
||||
using Catalogger.Backend.Database;
|
||||
using Catalogger.Backend.Database.Dapper.Repositories;
|
||||
using Catalogger.Backend.Extensions;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Remora.Commands.Attributes;
|
||||
using Remora.Commands.Groups;
|
||||
using Remora.Discord.API.Abstractions.Objects;
|
||||
|
|
@ -33,7 +31,6 @@ using Remora.Discord.Commands.Feedback.Services;
|
|||
using Remora.Discord.Commands.Services;
|
||||
using Remora.Discord.Pagination.Extensions;
|
||||
using Remora.Rest.Core;
|
||||
using Invite = Catalogger.Backend.Database.Models.Invite;
|
||||
using IResult = Remora.Results.IResult;
|
||||
|
||||
namespace Catalogger.Backend.Bot.Commands;
|
||||
|
|
@ -43,7 +40,7 @@ namespace Catalogger.Backend.Bot.Commands;
|
|||
[DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)]
|
||||
public class InviteCommands(
|
||||
ILogger logger,
|
||||
DatabaseContext db,
|
||||
InviteRepository inviteRepository,
|
||||
GuildCache guildCache,
|
||||
IInviteCache inviteCache,
|
||||
IDiscordRestChannelAPI channelApi,
|
||||
|
|
@ -63,7 +60,7 @@ public class InviteCommands(
|
|||
if (!guildCache.TryGet(guildId, out var guild))
|
||||
throw new CataloggerError("Guild not in cache");
|
||||
|
||||
var dbInvites = await db.Invites.Where(i => i.GuildId == guildId.Value).ToListAsync();
|
||||
var dbInvites = await inviteRepository.GetGuildInvitesAsync(guildId);
|
||||
|
||||
var fields = guildInvites
|
||||
.Select(i => new PartialNamedInvite(
|
||||
|
|
@ -153,14 +150,7 @@ public class InviteCommands(
|
|||
+ $"\nLink: https://discord.gg/{inviteResult.Entity.Code}"
|
||||
);
|
||||
|
||||
var dbInvite = new Invite
|
||||
{
|
||||
GuildId = guildId.Value,
|
||||
Code = inviteResult.Entity.Code,
|
||||
Name = name,
|
||||
};
|
||||
db.Add(dbInvite);
|
||||
await db.SaveChangesAsync();
|
||||
await inviteRepository.SetInviteNameAsync(guildId, inviteResult.Entity.Code, name);
|
||||
|
||||
return await feedbackService.ReplyAsync(
|
||||
$"Created a new invite in <#{channel.ID}> with the name **{name}**!"
|
||||
|
|
@ -188,39 +178,18 @@ public class InviteCommands(
|
|||
);
|
||||
}
|
||||
|
||||
var namedInvite = await db
|
||||
.Invites.Where(i => i.GuildId == guildId.Value && i.Code == invite)
|
||||
.FirstOrDefaultAsync();
|
||||
if (namedInvite == null)
|
||||
{
|
||||
if (name == null)
|
||||
return await feedbackService.ReplyAsync($"Invite `{invite}` already has no name.");
|
||||
|
||||
namedInvite = new Invite
|
||||
{
|
||||
GuildId = guildId.Value,
|
||||
Code = invite,
|
||||
Name = name,
|
||||
};
|
||||
db.Add(namedInvite);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
return await feedbackService.ReplyAsync(
|
||||
$"New name set! The invite `{invite}` will now show up as **{name}** in logs."
|
||||
);
|
||||
}
|
||||
var namedInvite = await inviteRepository.GetInviteAsync(guildId, invite);
|
||||
if (namedInvite == null && name == null)
|
||||
return await feedbackService.ReplyAsync($"Invite `{invite}` already has no name.");
|
||||
|
||||
if (name == null)
|
||||
{
|
||||
db.Invites.Remove(namedInvite);
|
||||
await db.SaveChangesAsync();
|
||||
await inviteRepository.DeleteInviteAsync(guildId, invite);
|
||||
|
||||
return await feedbackService.ReplyAsync($"Removed the name for `{invite}`.");
|
||||
}
|
||||
|
||||
namedInvite.Name = name;
|
||||
db.Update(namedInvite);
|
||||
await db.SaveChangesAsync();
|
||||
await inviteRepository.SetInviteNameAsync(guildId, invite, name);
|
||||
|
||||
return await feedbackService.ReplyAsync(
|
||||
$"New name set! The invite `{invite}` will now show up as **{name}** in logs."
|
||||
|
|
@ -230,7 +199,7 @@ public class InviteCommands(
|
|||
|
||||
public class InviteAutocompleteProvider(
|
||||
ILogger logger,
|
||||
DatabaseContext db,
|
||||
InviteRepository inviteRepository,
|
||||
IInviteCache inviteCache,
|
||||
ContextInjectionService contextInjection
|
||||
) : IAutocompleteProvider
|
||||
|
|
@ -262,13 +231,13 @@ public class InviteAutocompleteProvider(
|
|||
return [];
|
||||
}
|
||||
|
||||
var namedInvites = await db
|
||||
.Invites.Where(i =>
|
||||
i.GuildId == guildId.Value && i.Name.ToLower().StartsWith(userInput.ToLower())
|
||||
)
|
||||
// We're filtering and ordering on the client side because a guild won't have infinite invites
|
||||
// (the maximum on Discord's end is 1500-ish)
|
||||
// and this way we don't need an index on (guild_id, name) for this *one* case.
|
||||
var namedInvites = (await inviteRepository.GetGuildInvitesAsync(guildId))
|
||||
.Where(i => i.Name.StartsWith(userInput, StringComparison.InvariantCultureIgnoreCase))
|
||||
.OrderBy(i => i.Name)
|
||||
.Take(25)
|
||||
.ToListAsync(ct);
|
||||
.ToList();
|
||||
|
||||
if (namedInvites.Count != 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace Catalogger.Backend.Bot.Responders.Invites;
|
|||
public class InviteDeleteResponder(
|
||||
ILogger logger,
|
||||
GuildRepository guildRepository,
|
||||
DatabaseContext db,
|
||||
InviteRepository inviteRepository,
|
||||
IInviteCache inviteCache,
|
||||
WebhookExecutorService webhookExecutor,
|
||||
IDiscordRestGuildAPI guildApi
|
||||
|
|
@ -44,9 +44,7 @@ public class InviteDeleteResponder(
|
|||
{
|
||||
var guildId = evt.GuildID.Value;
|
||||
|
||||
var dbDeleteCount = await db
|
||||
.Invites.Where(i => i.GuildId == guildId.Value && i.Code == evt.Code)
|
||||
.ExecuteDeleteAsync(ct);
|
||||
var dbDeleteCount = await inviteRepository.DeleteInviteAsync(guildId, evt.Code);
|
||||
if (dbDeleteCount != 0)
|
||||
_logger.Information(
|
||||
"Deleted named invite {Invite} for guild {Guild}",
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ namespace Catalogger.Backend.Bot.Responders.Members;
|
|||
public class GuildMemberAddResponder(
|
||||
ILogger logger,
|
||||
DatabaseContext db,
|
||||
InviteRepository inviteRepository,
|
||||
GuildRepository guildRepository,
|
||||
IMemberCache memberCache,
|
||||
IInviteCache inviteCache,
|
||||
|
|
@ -128,11 +129,7 @@ public class GuildMemberAddResponder(
|
|||
goto afterInvite;
|
||||
}
|
||||
|
||||
var inviteName =
|
||||
await db
|
||||
.Invites.Where(i => i.Code == usedInvite.Code && i.GuildId == member.GuildID.Value)
|
||||
.Select(i => i.Name)
|
||||
.FirstOrDefaultAsync(ct) ?? "*(unnamed)*";
|
||||
var inviteName = inviteRepository.GetInviteNameAsync(member.GuildID, usedInvite.Code);
|
||||
|
||||
var inviteDescription = $"""
|
||||
**Code:** {usedInvite.Code}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ public class MessageCreateResponder(
|
|||
ILogger logger,
|
||||
Config config,
|
||||
GuildRepository guildRepository,
|
||||
DapperMessageRepository messageRepository,
|
||||
MessageRepository messageRepository,
|
||||
UserCache userCache,
|
||||
PkMessageHandler pkMessageHandler
|
||||
) : IResponder<IMessageCreate>
|
||||
|
|
@ -146,7 +146,7 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services)
|
|||
|
||||
await using var scope = services.CreateAsyncScope();
|
||||
await using var messageRepository =
|
||||
scope.ServiceProvider.GetRequiredService<DapperMessageRepository>();
|
||||
scope.ServiceProvider.GetRequiredService<MessageRepository>();
|
||||
|
||||
await Task.WhenAll(
|
||||
messageRepository.SetProxiedMessageDataAsync(
|
||||
|
|
@ -166,7 +166,7 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services)
|
|||
|
||||
await using var scope = services.CreateAsyncScope();
|
||||
await using var messageRepository =
|
||||
scope.ServiceProvider.GetRequiredService<DapperMessageRepository>();
|
||||
scope.ServiceProvider.GetRequiredService<MessageRepository>();
|
||||
var pluralkitApi = scope.ServiceProvider.GetRequiredService<PluralkitApiService>();
|
||||
|
||||
var (isStored, hasProxyInfo) = await messageRepository.HasProxyInfoAsync(msgId);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace Catalogger.Backend.Bot.Responders.Messages;
|
|||
public class MessageDeleteBulkResponder(
|
||||
ILogger logger,
|
||||
GuildRepository guildRepository,
|
||||
DapperMessageRepository messageRepository,
|
||||
MessageRepository messageRepository,
|
||||
WebhookExecutorService webhookExecutor,
|
||||
ChannelCache channelCache
|
||||
) : IResponder<IMessageDeleteBulk>
|
||||
|
|
@ -128,7 +128,7 @@ public class MessageDeleteBulkResponder(
|
|||
return Result.Success;
|
||||
}
|
||||
|
||||
private string RenderMessage(Snowflake messageId, DapperMessageRepository.Message? message)
|
||||
private string RenderMessage(Snowflake messageId, MessageRepository.Message? message)
|
||||
{
|
||||
var timestamp = messageId.Timestamp.ToOffsetDateTime().ToString();
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace Catalogger.Backend.Bot.Responders.Messages;
|
|||
public class MessageDeleteResponder(
|
||||
ILogger logger,
|
||||
GuildRepository guildRepository,
|
||||
DapperMessageRepository messageRepository,
|
||||
MessageRepository messageRepository,
|
||||
WebhookExecutorService webhookExecutor,
|
||||
ChannelCache channelCache,
|
||||
UserCache userCache,
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public class MessageUpdateResponder(
|
|||
DatabaseContext db,
|
||||
ChannelCache channelCache,
|
||||
UserCache userCache,
|
||||
DapperMessageRepository messageRepository,
|
||||
MessageRepository messageRepository,
|
||||
WebhookExecutorService webhookExecutor,
|
||||
PluralkitApiService pluralkitApi
|
||||
) : IResponder<IMessageUpdate>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue