From 88c6740adccdfcbaccf7edf54c4753e44bd4c263 Mon Sep 17 00:00:00 2001 From: Vermium Sifell Date: Thu, 30 Jun 2022 12:44:01 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20gdpr=20fix=20for=20removing=20gu?= =?UTF-8?q?ild=20when=20bot=20has=20bent=20offline=20during=20removal=20of?= =?UTF-8?q?=20bot.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/helpers/dropGuild/index.ts | 46 ++++++++----------- src/helpers/fetchGuild/index.ts | 12 ++--- src/jobs/keepDataUpToDate/index.ts | 38 +++++++++++++++ .../commands/credits/modules/work/index.ts | 2 +- src/plugins/events/guildCreate/index.ts | 11 +++-- src/plugins/events/guildDelete/index.ts | 2 +- .../messageCreate/modules/credits/index.ts | 2 +- .../messageCreate/modules/points/index.ts | 2 +- 9 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 src/jobs/keepDataUpToDate/index.ts diff --git a/package.json b/package.json index ac149cc..740f844 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "tsconfig-paths": "^4.0.0", "typescript": "^4.6.3", "uuid": "^8.3.2", + "winston": "^3.8.0", "winston-daily-rotate-file": "^4.6.1" }, "devDependencies": { diff --git a/src/helpers/dropGuild/index.ts b/src/helpers/dropGuild/index.ts index 0c0e2ab..6145aa4 100644 --- a/src/helpers/dropGuild/index.ts +++ b/src/helpers/dropGuild/index.ts @@ -7,66 +7,60 @@ import timeoutSchema from "../../models/timeout"; import logger from "../../logger"; -import { Guild } from "discord.js"; +import { Snowflake } from "discord.js"; -export default async (guild: Guild) => { +export default async (id: Snowflake) => { await guildSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - return logger?.silly(`Deleted guild: ${guild.id}`); + return logger?.silly(`Deleted guild: ${id}`); }) .catch(async (error) => { - logger?.error(`Error deleting guild: ${guild.id} - ${error}`); + logger?.error(`Error deleting guild: ${id} - ${error}`); }); await userSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - logger?.silly(`Deleted users for guild: ${guild.id} from database`); + logger?.silly(`Deleted users for guild: ${id} from database`); }) .catch(async (error) => { - logger?.error(`Error deleting users for guild: ${guild.id} - ${error}`); + logger?.error(`Error deleting users for guild: ${id} - ${error}`); }); await apiSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - logger?.silly(`Deleted apis for guild: ${guild.id} from database`); + logger?.silly(`Deleted apis for guild: ${id} from database`); }) .catch(async (error) => { - logger?.error(`Error deleting apis for guild: ${guild.id} - ${error}`); + logger?.error(`Error deleting apis for guild: ${id} - ${error}`); }); await counterSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - logger?.silly(`Deleted counters for guild: ${guild.id} from database`); + logger?.silly(`Deleted counters for guild: ${id} from database`); }) .catch(async (error) => { - logger?.error( - `Error deleting counters for guild: ${guild.id} - ${error}` - ); + logger?.error(`Error deleting counters for guild: ${id} - ${error}`); }); await shopRoleSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - logger?.silly(`Deleted shop roles for guild: ${guild.id} from database`); + logger?.silly(`Deleted shop roles for guild: ${id} from database`); }) .catch(async (error) => { - logger?.error( - `Error deleting shop roles for guild: ${guild.id} - ${error}` - ); + logger?.error(`Error deleting shop roles for guild: ${id} - ${error}`); }); await timeoutSchema - .deleteMany({ guildId: guild.id }) + .deleteMany({ guildId: id }) .then(async () => { - logger?.silly(`Deleted timeouts for guild: ${guild.id} from database`); + logger?.silly(`Deleted timeouts for guild: ${id} from database`); }) .catch(async (error) => { - logger?.error( - `Error deleting timeouts for guild: ${guild.id} - ${error}` - ); + logger?.error(`Error deleting timeouts for guild: ${id} - ${error}`); }); }; diff --git a/src/helpers/fetchGuild/index.ts b/src/helpers/fetchGuild/index.ts index a89e840..264687e 100644 --- a/src/helpers/fetchGuild/index.ts +++ b/src/helpers/fetchGuild/index.ts @@ -1,5 +1,5 @@ // Dependencies -import { Guild } from "discord.js"; +import { Snowflake } from "discord.js"; // Models import guildSchema from "../../models/guild"; @@ -8,18 +8,18 @@ import guildSchema from "../../models/guild"; import logger from "../../logger"; // Function -export default async (guild: Guild) => { - const guildObj = await guildSchema?.findOne({ guildId: guild.id }); +export default async (id: Snowflake) => { + const guildObj = await guildSchema?.findOne({ guildId: id }); if (guildObj === null) { - const newGuildObj = new guildSchema({ guildId: guild.id }); + const newGuildObj = new guildSchema({ guildId: id }); await newGuildObj .save() .then(async () => { - logger?.silly(`Created guild: ${guild.id}`); + logger?.silly(`Created guild: ${id}`); }) .catch(async (error) => { - logger?.error(`Error creating guild: ${guild.id} - ${error}`); + logger?.error(`Error creating guild: ${id} - ${error}`); }); return newGuildObj; diff --git a/src/jobs/keepDataUpToDate/index.ts b/src/jobs/keepDataUpToDate/index.ts new file mode 100644 index 0000000..9c7f307 --- /dev/null +++ b/src/jobs/keepDataUpToDate/index.ts @@ -0,0 +1,38 @@ +import { Client, Guild } from "discord.js"; +import logger from "../../logger"; +import dropGuild from "../../helpers/dropGuild"; +import fetchGuild from "../../helpers/fetchGuild"; + +import guildSchema from "../../models/guild"; + +export const options = { + schedule: "*/5 * * * * *", // https://crontab.guru/ +}; + +export const execute = async (client: Client) => { + const guildsDB = await guildSchema.find(); + const guildsDiscord = client.guilds.cache; + + const shouldNotExist = guildsDB + .filter((x) => !guildsDiscord.some((y) => y.id === x.guildId)) + .map((z) => z.guildId); + + const shouldExist = guildsDiscord + .filter((x) => !guildsDB.some((y) => y.guildId === x.id)) + .map((z) => z.id); + + logger.silly(shouldNotExist); + logger.silly(shouldExist); + + if (shouldNotExist) { + shouldNotExist.map(async (x) => { + await dropGuild(x); + }); + } + + if (shouldExist) { + shouldExist.map(async (x) => { + await fetchGuild(x); + }); + } +}; diff --git a/src/plugins/commands/credits/modules/work/index.ts b/src/plugins/commands/credits/modules/work/index.ts index ef0a550..b61d9fe 100644 --- a/src/plugins/commands/credits/modules/work/index.ts +++ b/src/plugins/commands/credits/modules/work/index.ts @@ -43,7 +43,7 @@ export default { return logger?.silly(`Guild is null`); } - const guildDB = await fetchGuild(guild); + const guildDB = await fetchGuild(guild.id); await cooldown.command(interaction, guildDB?.credits?.workTimeout); diff --git a/src/plugins/events/guildCreate/index.ts b/src/plugins/events/guildCreate/index.ts index 60d5a3c..0d775de 100644 --- a/src/plugins/events/guildCreate/index.ts +++ b/src/plugins/events/guildCreate/index.ts @@ -11,10 +11,13 @@ export const options: IEventOptions = { export const execute = async (guild: Guild) => { const { client } = guild; - logger?.silly(`Added to guild: ${guild.name} (${guild.id})`); + if (!client.user) + throw new Error("Discord API client user is not available."); - await fetchGuild(guild); + logger.silly( + `${client.user.username} joined guild: ${guild.name} (${guild.id})` + ); + + await fetchGuild(guild.id); await updatePresence(client); - - logger.silly(`guildCreate: ${guild}`); }; diff --git a/src/plugins/events/guildDelete/index.ts b/src/plugins/events/guildDelete/index.ts index 146351f..e33d341 100644 --- a/src/plugins/events/guildDelete/index.ts +++ b/src/plugins/events/guildDelete/index.ts @@ -16,7 +16,7 @@ export const execute = async (guild: Guild) => { logger?.silly(`Deleted from guild: ${guild.name} (${guild.id})`); - await dropGuild(guild); + await dropGuild(guild.id); await updatePresence(client); logger.silly(`guildDelete: ${guild}`); diff --git a/src/plugins/events/messageCreate/modules/credits/index.ts b/src/plugins/events/messageCreate/modules/credits/index.ts index 24a5ce2..8f4a54e 100644 --- a/src/plugins/events/messageCreate/modules/credits/index.ts +++ b/src/plugins/events/messageCreate/modules/credits/index.ts @@ -17,7 +17,7 @@ export default { const { id: guildId } = guild; const { id: userId } = author; - const guildData = await fetchGuild(guild); + const guildData = await fetchGuild(guild.id); const userData = await fetchUser(author, guild); if (content.length < guildData.credits.minimumLength) return; diff --git a/src/plugins/events/messageCreate/modules/points/index.ts b/src/plugins/events/messageCreate/modules/points/index.ts index ed18003..b73dbf2 100644 --- a/src/plugins/events/messageCreate/modules/points/index.ts +++ b/src/plugins/events/messageCreate/modules/points/index.ts @@ -14,7 +14,7 @@ export default { if (author.bot) return; if (channel?.type !== "GUILD_TEXT") return; - const guildData = await fetchGuild(guild); + const guildData = await fetchGuild(guild.id); const userData = await fetchUser(author, guild); if (content.length < guildData.credits.minimumLength) return;