Major database refactor (again)
This commit is contained in:
@@ -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)
|
||||
|
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user