feat: cache Discord DM channels in database
This commit is contained in:
@@ -28,12 +28,13 @@ public class MessageCreated: IEventHandler<MessageCreateEvent>
|
||||
private readonly DiscordApiClient _rest;
|
||||
private readonly ILifetimeScope _services;
|
||||
private readonly CommandTree _tree;
|
||||
private readonly PrivateChannelService _dmCache;
|
||||
|
||||
public MessageCreated(LastMessageCacheService lastMessageCache, LoggerCleanService loggerClean,
|
||||
IMetrics metrics, ProxyService proxy,
|
||||
CommandTree tree, ILifetimeScope services, IDatabase db, BotConfig config,
|
||||
ModelRepository repo, IDiscordCache cache,
|
||||
Bot bot, Cluster cluster, DiscordApiClient rest)
|
||||
Bot bot, Cluster cluster, DiscordApiClient rest, PrivateChannelService dmCache)
|
||||
{
|
||||
_lastMessageCache = lastMessageCache;
|
||||
_loggerClean = loggerClean;
|
||||
@@ -48,6 +49,7 @@ public class MessageCreated: IEventHandler<MessageCreateEvent>
|
||||
_bot = bot;
|
||||
_cluster = cluster;
|
||||
_rest = rest;
|
||||
_dmCache = dmCache;
|
||||
}
|
||||
|
||||
// for now, only return error messages for explicit commands
|
||||
@@ -66,6 +68,10 @@ public class MessageCreated: IEventHandler<MessageCreateEvent>
|
||||
if (evt.Type != Message.MessageType.Default && evt.Type != Message.MessageType.Reply) return;
|
||||
if (IsDuplicateMessage(evt)) return;
|
||||
|
||||
// spawn off saving the private channel into another thread
|
||||
// it is not a fatal error if this fails, and it shouldn't block message processing
|
||||
_ = _dmCache.TrySavePrivateChannel(evt);
|
||||
|
||||
var guild = evt.GuildId != null ? await _cache.GetGuild(evt.GuildId.Value) : null;
|
||||
var channel = await _cache.GetChannel(evt.ChannelId);
|
||||
var rootChannel = await _cache.GetRootChannel(evt.ChannelId);
|
||||
|
@@ -26,10 +26,11 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
||||
private readonly ILogger _logger;
|
||||
private readonly ModelRepository _repo;
|
||||
private readonly DiscordApiClient _rest;
|
||||
private readonly PrivateChannelService _dmCache;
|
||||
|
||||
public ReactionAdded(ILogger logger, IDatabase db, ModelRepository repo,
|
||||
CommandMessageService commandMessageService, IDiscordCache cache, Bot bot, Cluster cluster,
|
||||
DiscordApiClient rest, EmbedService embeds)
|
||||
DiscordApiClient rest, EmbedService embeds, PrivateChannelService dmCache)
|
||||
{
|
||||
_db = db;
|
||||
_repo = repo;
|
||||
@@ -40,6 +41,7 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
||||
_rest = rest;
|
||||
_embeds = embeds;
|
||||
_logger = logger.ForContext<ReactionAdded>();
|
||||
_dmCache = dmCache;
|
||||
}
|
||||
|
||||
public async Task Handle(int shardId, MessageReactionAddEvent evt)
|
||||
@@ -168,9 +170,9 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
||||
// Try to DM the user info about the message
|
||||
try
|
||||
{
|
||||
var dm = await _cache.GetOrCreateDmChannel(_rest, evt.UserId);
|
||||
var dm = await _dmCache.GetOrCreateDmChannel(evt.UserId);
|
||||
if (msg.Member != null)
|
||||
await _rest.CreateMessage(dm.Id, new MessageRequest
|
||||
await _rest.CreateMessage(dm, new MessageRequest
|
||||
{
|
||||
Embed = await _embeds.CreateMemberEmbed(
|
||||
msg.System,
|
||||
@@ -182,7 +184,7 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
||||
});
|
||||
|
||||
await _rest.CreateMessage(
|
||||
dm.Id,
|
||||
dm,
|
||||
new MessageRequest { Embed = await _embeds.CreateMessageInfoEmbed(msg, true) }
|
||||
);
|
||||
}
|
||||
@@ -234,15 +236,15 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
||||
// If not, tell them in DMs (if we can)
|
||||
try
|
||||
{
|
||||
var dm = await _cache.GetOrCreateDmChannel(_rest, evt.UserId);
|
||||
await _rest.CreateMessage(dm.Id,
|
||||
var dm = await _dmCache.GetOrCreateDmChannel(evt.UserId);
|
||||
await _rest.CreateMessage(dm,
|
||||
new MessageRequest
|
||||
{
|
||||
Content =
|
||||
$"{Emojis.Error} {msg.Member.DisplayName()}'s system has disabled reaction pings. If you want to mention them anyway, you can copy/paste the following message:"
|
||||
});
|
||||
await _rest.CreateMessage(
|
||||
dm.Id,
|
||||
dm,
|
||||
new MessageRequest { Content = $"<@{msg.Message.Sender}>".AsCode() }
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user