Major database refactor (again)

This commit is contained in:
Ske
2020-08-29 13:46:27 +02:00
parent 3996cd48c7
commit c7612df37e
55 changed files with 1014 additions and 1100 deletions

View File

@@ -23,11 +23,12 @@ namespace PluralKit.Bot
private readonly ProxyService _proxy;
private readonly ILifetimeScope _services;
private readonly IDatabase _db;
private readonly ModelRepository _repo;
private readonly BotConfig _config;
public MessageCreated(LastMessageCacheService lastMessageCache, LoggerCleanService loggerClean,
IMetrics metrics, ProxyService proxy, DiscordShardedClient client,
CommandTree tree, ILifetimeScope services, IDatabase db, BotConfig config)
CommandTree tree, ILifetimeScope services, IDatabase db, BotConfig config, ModelRepository repo)
{
_lastMessageCache = lastMessageCache;
_loggerClean = loggerClean;
@@ -38,6 +39,7 @@ namespace PluralKit.Bot
_services = services;
_db = db;
_config = config;
_repo = repo;
}
public DiscordChannel ErrorChannelFor(MessageCreateEventArgs evt) => evt.Channel;
@@ -59,7 +61,7 @@ namespace PluralKit.Bot
MessageContext ctx;
await using (var conn = await _db.Obtain())
using (_metrics.Measure.Timer.Time(BotMetrics.MessageContextQueryTime))
ctx = await conn.QueryMessageContext(evt.Author.Id, evt.Channel.GuildId, evt.Channel.Id);
ctx = await _repo.GetMessageContext(conn, evt.Author.Id, evt.Channel.GuildId, evt.Channel.Id);
// Try each handler until we find one that succeeds
if (await TryHandleLogClean(evt, ctx))
@@ -98,7 +100,7 @@ namespace PluralKit.Bot
try
{
var system = ctx.SystemId != null ? await _db.Execute(c => c.QuerySystem(ctx.SystemId.Value)) : null;
var system = ctx.SystemId != null ? await _db.Execute(c => _repo.GetSystem(c, ctx.SystemId.Value)) : null;
await _tree.ExecuteCommand(new Context(_services, evt.Client, evt.Message, cmdStart, system, ctx));
}
catch (PKError)

View File

@@ -12,28 +12,29 @@ namespace PluralKit.Bot
// Double duty :)
public class MessageDeleted: IEventHandler<MessageDeleteEventArgs>, IEventHandler<MessageBulkDeleteEventArgs>
{
private readonly IDataStore _data;
private readonly IDatabase _db;
private readonly ModelRepository _repo;
private readonly ILogger _logger;
public MessageDeleted(IDataStore data, ILogger logger)
public MessageDeleted(ILogger logger, IDatabase db, ModelRepository repo)
{
_data = data;
_db = db;
_repo = repo;
_logger = logger.ForContext<MessageDeleted>();
}
public async Task Handle(MessageDeleteEventArgs evt)
{
// Delete deleted webhook messages from the data store
// (if we don't know whether it's a webhook, delete it just to be safe)
if (!evt.Message.WebhookMessage) return;
await _data.DeleteMessage(evt.Message.Id);
// Most of the data in the given message is wrong/missing, so always delete just to be sure.
await _db.Execute(c => _repo.DeleteMessage(c, evt.Message.Id));
}
public async Task Handle(MessageBulkDeleteEventArgs evt)
{
// Same as above, but bulk
_logger.Information("Bulk deleting {Count} messages in channel {Channel}", evt.Messages.Count, evt.Channel.Id);
await _data.DeleteMessagesBulk(evt.Messages.Select(m => m.Id).ToList());
await _db.Execute(c => _repo.DeleteMessagesBulk(c, evt.Messages.Select(m => m.Id).ToList()));
}
}
}

View File

@@ -14,14 +14,16 @@ namespace PluralKit.Bot
private readonly LastMessageCacheService _lastMessageCache;
private readonly ProxyService _proxy;
private readonly IDatabase _db;
private readonly ModelRepository _repo;
private readonly IMetrics _metrics;
public MessageEdited(LastMessageCacheService lastMessageCache, ProxyService proxy, IDatabase db, IMetrics metrics)
public MessageEdited(LastMessageCacheService lastMessageCache, ProxyService proxy, IDatabase db, IMetrics metrics, ModelRepository repo)
{
_lastMessageCache = lastMessageCache;
_proxy = proxy;
_db = db;
_metrics = metrics;
_repo = repo;
}
public async Task Handle(MessageUpdateEventArgs evt)
@@ -36,7 +38,7 @@ namespace PluralKit.Bot
MessageContext ctx;
await using (var conn = await _db.Obtain())
using (_metrics.Measure.Timer.Time(BotMetrics.MessageContextQueryTime))
ctx = await conn.QueryMessageContext(evt.Author.Id, evt.Channel.GuildId, evt.Channel.Id);
ctx = await _repo.GetMessageContext(conn, evt.Author.Id, evt.Channel.GuildId, evt.Channel.Id);
await _proxy.HandleIncomingMessage(evt.Message, ctx, allowAutoproxy: false);
}
}

View File

@@ -13,14 +13,16 @@ namespace PluralKit.Bot
{
public class ReactionAdded: IEventHandler<MessageReactionAddEventArgs>
{
private IDataStore _data;
private EmbedService _embeds;
private ILogger _logger;
private readonly IDatabase _db;
private readonly ModelRepository _repo;
private readonly EmbedService _embeds;
private readonly ILogger _logger;
public ReactionAdded(IDataStore data, EmbedService embeds, ILogger logger)
public ReactionAdded(EmbedService embeds, ILogger logger, IDatabase db, ModelRepository repo)
{
_data = data;
_embeds = embeds;
_db = db;
_repo = repo;
_logger = logger.ForContext<ReactionAdded>();
}
@@ -42,18 +44,21 @@ namespace PluralKit.Bot
// Ignore reactions from bots (we can't DM them anyway)
if (evt.User.IsBot) return;
Task<FullMessage> GetMessage() =>
_db.Execute(c => _repo.GetMessage(c, evt.Message.Id));
FullMessage msg;
switch (evt.Emoji.Name)
{
// Message deletion
case "\u274C": // Red X
if ((msg = await _data.GetMessage(evt.Message.Id)) != null)
if ((msg = await GetMessage()) != null)
await HandleDeleteReaction(evt, msg);
break;
case "\u2753": // Red question mark
case "\u2754": // White question mark
if ((msg = await _data.GetMessage(evt.Message.Id)) != null)
if ((msg = await GetMessage()) != null)
await HandleQueryReaction(evt, msg);
break;
@@ -62,7 +67,7 @@ namespace PluralKit.Bot
case "\U0001F3D3": // Ping pong paddle (lol)
case "\u23F0": // Alarm clock
case "\u2757": // Exclamation mark
if ((msg = await _data.GetMessage(evt.Message.Id)) != null)
if ((msg = await GetMessage()) != null)
await HandlePingReaction(evt, msg);
break;
}
@@ -84,7 +89,7 @@ namespace PluralKit.Bot
// Message was deleted by something/someone else before we got to it
}
await _data.DeleteMessage(evt.Message.Id);
await _db.Execute(c => _repo.DeleteMessage(c, evt.Message.Id));
}
private async ValueTask HandleQueryReaction(MessageReactionAddEventArgs evt, FullMessage msg)