From 7054412640215b95a18b10816eb57b8bb6f482b8 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Fri, 20 Aug 2021 21:00:53 +0300 Subject: [PATCH] MessageSaver: use a queue, add more logging for duplicate IDs --- backend/src/data/GuildSavedMessages.ts | 2 +- .../MessageSaver/MessageSaverPlugin.ts | 2 + .../MessageSaver/events/SaveMessagesEvts.ts | 37 ++++++++++++++++--- backend/src/plugins/MessageSaver/types.ts | 2 + 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index ea114665..0e7db243 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -213,7 +213,7 @@ export class GuildSavedMessages extends BaseGuildRepository { await this.messages.insert(data); } catch (e) { if (e?.code === "ER_DUP_ENTRY") { - console.warn(`Tried to insert duplicate message ID: ${data.id}`); + console.trace(`Tried to insert duplicate message ID: ${data.id}`); return; } diff --git a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts index eb529ffa..0f316ad2 100644 --- a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts +++ b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts @@ -5,6 +5,7 @@ import { SaveMessagesToDBCmd } from "./commands/SaveMessagesToDB"; import { SavePinsToDBCmd } from "./commands/SavePinsToDB"; import { MessageCreateEvt, MessageDeleteBulkEvt, MessageDeleteEvt, MessageUpdateEvt } from "./events/SaveMessagesEvts"; import { ConfigSchema, MessageSaverPluginType } from "./types"; +import { Queue } from "../../Queue"; const defaultOptions: PluginOptions = { config: { @@ -44,5 +45,6 @@ export const MessageSaverPlugin = zeppelinGuildPlugin()( beforeLoad(pluginData) { const { state, guild } = pluginData; state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id); + state.queue = new Queue(); }, }); diff --git a/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts b/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts index c8464258..79d1fc5d 100644 --- a/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts +++ b/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts @@ -1,5 +1,16 @@ -import { Message } from "discord.js"; +import { Message, Snowflake } from "discord.js"; import { messageSaverEvt } from "../types"; +import { SECONDS } from "../../../utils"; + +const recentlyCreatedMessages: Snowflake[] = []; +const recentlyCreatedMessagesToKeep = 100; + +setInterval(() => { + const toDelete = recentlyCreatedMessages.length - recentlyCreatedMessagesToKeep; + if (toDelete > 0) { + recentlyCreatedMessages.splice(0, toDelete); + } +}, 60 * SECONDS); export const MessageCreateEvt = messageSaverEvt({ event: "messageCreate", @@ -17,7 +28,17 @@ export const MessageCreateEvt = messageSaverEvt({ return; } - await meta.pluginData.state.savedMessages.createFromMsg(meta.args.message); + meta.pluginData.state.queue.add(async () => { + if (recentlyCreatedMessages.includes(meta.args.message.id)) { + console.warn( + `Tried to save duplicate message from messageCreate event: ${meta.args.message.guildId} / ${meta.args.message.channelId} / ${meta.args.message.id}`, + ); + return; + } + recentlyCreatedMessages.push(meta.args.message.id); + + await meta.pluginData.state.savedMessages.createFromMsg(meta.args.message); + }); }, }); @@ -35,7 +56,9 @@ export const MessageUpdateEvt = messageSaverEvt({ return; } - await meta.pluginData.state.savedMessages.saveEditFromMsg(meta.args.newMessage as Message); + meta.pluginData.state.queue.add(async () => { + await meta.pluginData.state.savedMessages.saveEditFromMsg(meta.args.newMessage as Message); + }); }, }); @@ -50,7 +73,9 @@ export const MessageDeleteEvt = messageSaverEvt({ return; } - await meta.pluginData.state.savedMessages.markAsDeleted(msg.id); + meta.pluginData.state.queue.add(async () => { + await meta.pluginData.state.savedMessages.markAsDeleted(msg.id); + }); }, }); @@ -61,6 +86,8 @@ export const MessageDeleteBulkEvt = messageSaverEvt({ async listener(meta) { const ids = meta.args.messages.map(m => m.id); - await meta.pluginData.state.savedMessages.markBulkAsDeleted(ids); + meta.pluginData.state.queue.add(async () => { + await meta.pluginData.state.savedMessages.markBulkAsDeleted(ids); + }); }, }); diff --git a/backend/src/plugins/MessageSaver/types.ts b/backend/src/plugins/MessageSaver/types.ts index 68f815be..f8b481f7 100644 --- a/backend/src/plugins/MessageSaver/types.ts +++ b/backend/src/plugins/MessageSaver/types.ts @@ -1,6 +1,7 @@ import * as t from "io-ts"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub"; import { GuildSavedMessages } from "../../data/GuildSavedMessages"; +import { Queue } from "../../Queue"; export const ConfigSchema = t.type({ can_manage: t.boolean, @@ -11,6 +12,7 @@ export interface MessageSaverPluginType extends BasePluginType { config: TConfigSchema; state: { savedMessages: GuildSavedMessages; + queue: Queue; }; }