From 8b486e280cc845ff9e8b636b977722d5fa428048 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Sun, 17 Oct 2021 11:49:34 +0300 Subject: [PATCH] feat(tags): remove foreign key from tag_responses, use raw deletion events --- backend/src/data/GuildTags.ts | 14 ++++++ backend/src/plugins/Tags/TagsPlugin.ts | 9 ++-- backend/src/plugins/Tags/types.ts | 1 - .../src/plugins/Tags/util/onMessageCreate.ts | 4 +- .../src/plugins/Tags/util/onMessageDelete.ts | 50 +++++++++---------- 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/backend/src/data/GuildTags.ts b/backend/src/data/GuildTags.ts index 76206164..2d64f8bf 100644 --- a/backend/src/data/GuildTags.ts +++ b/backend/src/data/GuildTags.ts @@ -86,4 +86,18 @@ export class GuildTags extends BaseGuildRepository { response_message_id: responseMessageId, }); } + + async deleteResponseByCommandMessageId(messageId: string): Promise { + await this.tagResponses.delete({ + guild_id: this.guildId, + command_message_id: messageId, + }); + } + + async deleteResponseByResponseMessageId(messageId: string): Promise { + await this.tagResponses.delete({ + guild_id: this.guildId, + response_message_id: messageId, + }); + } } diff --git a/backend/src/plugins/Tags/TagsPlugin.ts b/backend/src/plugins/Tags/TagsPlugin.ts index c6674189..0bfe05da 100644 --- a/backend/src/plugins/Tags/TagsPlugin.ts +++ b/backend/src/plugins/Tags/TagsPlugin.ts @@ -73,6 +73,11 @@ export const TagsPlugin = zeppelinGuildPlugin()({ TagCreateCmd, ], + // prettier-ignore + events: [ + onMessageDelete, + ], + public: { renderTagBody: mapToPublicFn(renderTagBody), findTagByName: mapToPublicFn(findTagByName), @@ -117,9 +122,6 @@ export const TagsPlugin = zeppelinGuildPlugin()({ state.onMessageCreateFn = (msg) => onMessageCreate(pluginData, msg); state.savedMessages.events.on("create", state.onMessageCreateFn); - state.onMessageDeleteFn = (msg) => onMessageDelete(pluginData, msg); - state.savedMessages.events.on("delete", state.onMessageDeleteFn); - const timeAndDate = pluginData.getPlugin(TimeAndDatePlugin); const tz = timeAndDate.getGuildTz(); @@ -263,6 +265,5 @@ export const TagsPlugin = zeppelinGuildPlugin()({ beforeUnload(pluginData) { pluginData.state.savedMessages.events.off("create", pluginData.state.onMessageCreateFn); - pluginData.state.savedMessages.events.off("delete", pluginData.state.onMessageDeleteFn); }, }); diff --git a/backend/src/plugins/Tags/types.ts b/backend/src/plugins/Tags/types.ts index 71247dec..c87110f5 100644 --- a/backend/src/plugins/Tags/types.ts +++ b/backend/src/plugins/Tags/types.ts @@ -54,7 +54,6 @@ export interface TagsPluginType extends BasePluginType { logs: GuildLogs; onMessageCreateFn; - onMessageDeleteFn; tagFunctions: any; }; diff --git a/backend/src/plugins/Tags/util/onMessageCreate.ts b/backend/src/plugins/Tags/util/onMessageCreate.ts index f64906e8..052c6395 100644 --- a/backend/src/plugins/Tags/util/onMessageCreate.ts +++ b/backend/src/plugins/Tags/util/onMessageCreate.ts @@ -110,9 +110,7 @@ export async function onMessageCreate(pluginData: GuildPluginData { - await pluginData.state.tags.addResponse(msg.id, responseMsg.id); - }); + await pluginData.state.tags.addResponse(msg.id, responseMsg.id); } const deleteInvoke = tagResult.category?.auto_delete_command ?? config.auto_delete_command; diff --git a/backend/src/plugins/Tags/util/onMessageDelete.ts b/backend/src/plugins/Tags/util/onMessageDelete.ts index 24c7e0e7..b0692f4c 100644 --- a/backend/src/plugins/Tags/util/onMessageDelete.ts +++ b/backend/src/plugins/Tags/util/onMessageDelete.ts @@ -1,32 +1,32 @@ import { Snowflake, TextChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData, typedGuildEventListener } from "knub"; import { SavedMessage } from "../../../data/entities/SavedMessage"; import { TagsPluginType } from "../types"; +import { noop } from "../../../utils"; -export async function onMessageDelete(pluginData: GuildPluginData, msg: SavedMessage) { - // Command message was deleted -> delete the response as well - const commandMsgResponse = await pluginData.state.tags.findResponseByCommandMessageId(msg.id); - if (commandMsgResponse) { - const channel = pluginData.guild.channels.cache.get(msg.channel_id as Snowflake) as TextChannel; - if (!channel) return; +export const onMessageDelete = typedGuildEventListener({ + event: "messageDelete", + async listener({ pluginData, args: { message: msg } }) { + // Command message was deleted -> delete the response as well + const commandMsgResponse = await pluginData.state.tags.findResponseByCommandMessageId(msg.id); + if (commandMsgResponse) { + const channel = pluginData.guild.channels.cache.get(msg.channelId) as TextChannel; + if (!channel) return; - const responseMsg = await pluginData.state.savedMessages.find(commandMsgResponse.response_message_id); - if (!responseMsg || responseMsg.deleted_at != null) return; + await pluginData.state.tags.deleteResponseByCommandMessageId(msg.id); + await channel.messages.delete(commandMsgResponse.response_message_id).catch(noop); + return; + } - await channel.messages.delete(commandMsgResponse.response_message_id as Snowflake); - return; - } + // Response was deleted -> delete the command message as well + const responseMsgResponse = await pluginData.state.tags.findResponseByResponseMessageId(msg.id); + if (responseMsgResponse) { + const channel = pluginData.guild.channels.cache.get(msg.channelId) as TextChannel; + if (!channel) return; - // Response was deleted -> delete the command message as well - const responseMsgResponse = await pluginData.state.tags.findResponseByResponseMessageId(msg.id); - if (responseMsgResponse) { - const channel = pluginData.guild.channels.cache.get(msg.channel_id as Snowflake) as TextChannel; - if (!channel) return; - - const commandMsg = await pluginData.state.savedMessages.find(responseMsgResponse.command_message_id); - if (!commandMsg || commandMsg.deleted_at != null) return; - - await channel.messages.delete(responseMsgResponse.command_message_id as Snowflake); - return; - } -} + await pluginData.state.tags.deleteResponseByResponseMessageId(msg.id); + await channel.messages.delete(responseMsgResponse.command_message_id).catch(noop); + return; + } + }, +});