feat(tags): remove foreign key from tag_responses, use raw deletion events

This commit is contained in:
Dragory 2021-10-17 11:49:34 +03:00
parent 86b01f2991
commit 8b486e280c
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
5 changed files with 45 additions and 33 deletions

View file

@ -86,4 +86,18 @@ export class GuildTags extends BaseGuildRepository {
response_message_id: responseMessageId,
});
}
async deleteResponseByCommandMessageId(messageId: string): Promise<void> {
await this.tagResponses.delete({
guild_id: this.guildId,
command_message_id: messageId,
});
}
async deleteResponseByResponseMessageId(messageId: string): Promise<void> {
await this.tagResponses.delete({
guild_id: this.guildId,
response_message_id: messageId,
});
}
}

View file

@ -73,6 +73,11 @@ export const TagsPlugin = zeppelinGuildPlugin<TagsPluginType>()({
TagCreateCmd,
],
// prettier-ignore
events: [
onMessageDelete,
],
public: {
renderTagBody: mapToPublicFn(renderTagBody),
findTagByName: mapToPublicFn(findTagByName),
@ -117,9 +122,6 @@ export const TagsPlugin = zeppelinGuildPlugin<TagsPluginType>()({
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<TagsPluginType>()({
beforeUnload(pluginData) {
pluginData.state.savedMessages.events.off("create", pluginData.state.onMessageCreateFn);
pluginData.state.savedMessages.events.off("delete", pluginData.state.onMessageDeleteFn);
},
});

View file

@ -54,7 +54,6 @@ export interface TagsPluginType extends BasePluginType {
logs: GuildLogs;
onMessageCreateFn;
onMessageDeleteFn;
tagFunctions: any;
};

View file

@ -110,9 +110,7 @@ export async function onMessageCreate(pluginData: GuildPluginData<TagsPluginType
// Save the command-response message pair once the message is in our database
const deleteWithCommand = tagResult.category?.delete_with_command ?? config.delete_with_command;
if (deleteWithCommand) {
pluginData.state.savedMessages.onceMessageAvailable(responseMsg.id, async () => {
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;

View file

@ -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<TagsPluginType>, 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;
}
},
});