feat(tags): remove foreign key from tag_responses, use raw deletion events
This commit is contained in:
parent
86b01f2991
commit
8b486e280c
5 changed files with 45 additions and 33 deletions
|
@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
});
|
||||
|
|
|
@ -54,7 +54,6 @@ export interface TagsPluginType extends BasePluginType {
|
|||
logs: GuildLogs;
|
||||
|
||||
onMessageCreateFn;
|
||||
onMessageDeleteFn;
|
||||
|
||||
tagFunctions: any;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue