From 887c0d43af0da7d41df3b0100a2c069fb7ea14ff Mon Sep 17 00:00:00 2001 From: Neodevils Date: Sun, 16 Feb 2025 23:24:27 +0300 Subject: [PATCH 1/5] Small update on sending commands --- src/commands/general/send-meme.js | 5 ++++- src/commands/general/send-nsfw.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/commands/general/send-meme.js b/src/commands/general/send-meme.js index 47a150a..bb9b85b 100644 --- a/src/commands/general/send-meme.js +++ b/src/commands/general/send-meme.js @@ -2,6 +2,7 @@ import { ApplicationIntegrationType, InteractionContextType, SlashCommandBuilder, + InteractionContextType, } from "discord.js"; import { emojis } from "../../resources/emojis.js"; import { basePermissions } from "../../resources/BotPermissions.js"; @@ -37,7 +38,9 @@ export default { InteractionContextType.Guild, ]), execute: async ({ interaction }) => { - await checkPermissions(interaction, basePermissions); + if (InteractionContextType.Guild) { + if (await checkPermissions(interaction, basePermissions)) return; + } await interaction.deferReply(); const API = await fetch("https://apis.duncte123.me/meme", { diff --git a/src/commands/general/send-nsfw.js b/src/commands/general/send-nsfw.js index 5b6a33e..be1092e 100644 --- a/src/commands/general/send-nsfw.js +++ b/src/commands/general/send-nsfw.js @@ -5,6 +5,7 @@ import { ButtonStyle, MessageFlags, SlashCommandBuilder, + InteractionContextType, } from "discord.js"; import { emojis } from "../../resources/emojis.js"; import { basePermissions } from "../../resources/BotPermissions.js"; @@ -46,7 +47,9 @@ export default { ), execute: async ({ interaction }) => { - await checkPermissions(interaction, basePermissions); + if (InteractionContextType.Guild) { + if (await checkPermissions(interaction, basePermissions)) return; + } let IMAGE_URL = null; try { From be5416222826a0f89a71311f6ee23815d974571b Mon Sep 17 00:00:00 2001 From: Neodevils Date: Sun, 16 Feb 2025 23:26:27 +0300 Subject: [PATCH 2/5] Declared twice... This is what happens when you just don't test and yo-lo code. --- src/commands/general/send-meme.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/general/send-meme.js b/src/commands/general/send-meme.js index bb9b85b..bfff6ff 100644 --- a/src/commands/general/send-meme.js +++ b/src/commands/general/send-meme.js @@ -2,7 +2,6 @@ import { ApplicationIntegrationType, InteractionContextType, SlashCommandBuilder, - InteractionContextType, } from "discord.js"; import { emojis } from "../../resources/emojis.js"; import { basePermissions } from "../../resources/BotPermissions.js"; From 5c876c14d8c263d838264ba1346084f65f35023e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim?= Date: Fri, 21 Feb 2025 21:51:32 +0300 Subject: [PATCH 3/5] Added Mongo (#79) * Added mongo * fix: update warning retrieval to use Map for efficiency and add error handling --- package-lock.json | 235 ++++++++++++++++++++++++++ package.json | 3 +- src/commands/staffs/createGiveaway.js | 3 +- src/commands/staffs/punishment.js | 40 ++--- src/commands/staffs/setup.js | 36 +++- src/events/client/ClientReady.js | 2 + src/events/mongo/mongoConnect.js | 38 +++++ src/functions/database.js | 147 +++++----------- 8 files changed, 361 insertions(+), 143 deletions(-) create mode 100644 src/events/mongo/mongoConnect.js diff --git a/package-lock.json b/package-lock.json index bad6584..cd2524a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "express": "^4.21.2", "fs": "^0.0.1-security", "moment-timezone": "^0.5.43", + "mongoose": "^8.10.1", "node-fetch": "^3.3.2" } }, @@ -184,6 +185,15 @@ "node": ">=16.0.0" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", + "integrity": "sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@sapphire/async-queue": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", @@ -226,6 +236,21 @@ "undici-types": "~6.20.0" } }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@types/ws": { "version": "8.5.14", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", @@ -285,6 +310,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bson": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.2.tgz", + "integrity": "sha512-5afhLTjqDSA3akH56E+/2J6kTDuSIlBxyXPdQslj9hcIgOUE378xdOfZvC/9q3LifJNI6KR/juZ+d0NRNYBwXg==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -773,6 +807,15 @@ "node": ">= 0.10" } }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -806,6 +849,12 @@ "node": ">= 0.6" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -872,6 +921,134 @@ "node": "*" } }, + "node_modules/mongodb": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.13.0.tgz", + "integrity": "sha512-KeESYR5TEaFxOuwRqkOm3XOsMqCSkdeDMjaW5u2nuKfX7rqaofp7JQGoi7sVqQcNJTKuveNbzZtWMstb8ABP6Q==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.1", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.10.1.tgz", + "integrity": "sha512-5beTeBZnJNndRXU9rxPol0JmTWZMAtgkPbooROkGilswvrZALDERY4cJrGZmgGwDS9dl0mxiB7si+Mv9Yms2fg==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.1", + "kareem": "2.6.3", + "mongodb": "~6.13.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -967,6 +1144,15 @@ "node": ">= 0.10" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -1150,6 +1336,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1166,6 +1367,18 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ts-mixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", @@ -1239,6 +1452,28 @@ "node": ">= 8" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", diff --git a/package.json b/package.json index 6596424..5edecad 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "express": "^4.21.2", "fs": "^0.0.1-security", "moment-timezone": "^0.5.43", + "mongoose": "^8.10.1", "node-fetch": "^3.3.2" } -} \ No newline at end of file +} diff --git a/src/commands/staffs/createGiveaway.js b/src/commands/staffs/createGiveaway.js index 222f541..f3c41bc 100644 --- a/src/commands/staffs/createGiveaway.js +++ b/src/commands/staffs/createGiveaway.js @@ -277,8 +277,7 @@ export default { .setRequired(false) ), execute: async ({ client, interaction }) => { - if (await checkPermissions(interaction, defaultGiveawayPermissions)) - return; + await checkPermissions(interaction, defaultGiveawayPermissions); await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/commands/staffs/punishment.js b/src/commands/staffs/punishment.js index 6f8d389..f395b22 100644 --- a/src/commands/staffs/punishment.js +++ b/src/commands/staffs/punishment.js @@ -334,10 +334,9 @@ export default { reason = mainReason; } - addWarning(guild.id, target.id); - - const warnings = checkWarnings(guild.id, target.id); + await addWarning(guild.id, target.id); + const warnings = await checkWarnings(guild.id, target.id); const expiryTime = new Date(Date.now() + duration * 60 * 1000); await interaction.guild.members.fetch(guildMember); @@ -376,10 +375,7 @@ export default { }, { name: "Warnings", - value: `**${checkWarnings( - guild.id, - target.id - )} warnings** / 4 warnings`, + value: `**${warnings} warnings** / 4 warnings`, inline: false, }, { @@ -398,7 +394,7 @@ export default { reason: "Exceeded warning limit", }); return interaction.editReply({ - content: `${emoji_info} Member got ban because they received 4 warnings. They better be cool.`, + content: `${emojis.info} Member got ban because they received 4 warnings. They better be cool.`, }); } @@ -415,13 +411,12 @@ export default { .catch(console.error); await interaction.editReply({ - content: `## ${emoji_timeout} Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( + content: `## ${ + emojis.timeout + } Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( expiryTime, "R" - )}\n> "${reason}" reason.\n\nNow they have ${checkWarnings( - guild.id, - target.id - )} warnings.`, + )}\n> "${reason}" reason.\n\nNow they have ${warnings} warnings.`, }); } else { if (warnings == 1) { @@ -440,13 +435,12 @@ export default { .catch(console.error); return interaction.editReply({ - content: `## ${emoji_timeout} Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( + content: `## ${ + emojis.timeout + } Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( expiryTime, "R" - )}\n> "${reason}" reason.\n\n-# Now they have **${checkWarnings( - guild.id, - target.id - )}** warnings.`, + )}\n> "${reason}" reason.\n\n-# Now they have **${warnings}** warnings.`, flags: MessageFlags.Ephemeral, }); } @@ -469,10 +463,7 @@ export default { } Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( expiryTime, "R" - )}\n> "${reason}" reason.\n\nNow they have ${checkWarnings( - guild.id, - target.id - )} warnings.\n\n> _${ + )}\n> "${reason}" reason.\n\nNow they have ${warnings} warnings.\n\n> _${ emojis.important } Logs channel has not been settled. Please use command._`, flags: MessageFlags.Ephemeral, @@ -527,10 +518,7 @@ export default { } Time-outed\n> **Target:** ${target}\n> **Duration:** ${time( expiryTime, "R" - )}\n> "${reason}" reason.\n\nNow they have ${checkWarnings( - guild.id, - target.id - )} warnings.\n\n> _${ + )}\n> "${reason}" reason.\n\nNow they have ${warnings} warnings.\n\n> _${ emojis.important } Logs channel has not been settled. Please use command._`, flags: MessageFlags.Ephemeral, diff --git a/src/commands/staffs/setup.js b/src/commands/staffs/setup.js index 91ec113..0165fdc 100644 --- a/src/commands/staffs/setup.js +++ b/src/commands/staffs/setup.js @@ -17,7 +17,6 @@ import { basePermissions } from "../../resources/BotPermissions.js"; import { checkPermissions } from "../../functions/checkPermissions.js"; import { saveStaffRoleId, - saveStaffs, setupLoggingChannel, } from "../../functions/database.js"; @@ -472,13 +471,15 @@ export default { .setRequired(true) ) ), - execute: async ({ interaction, client }) => { + execute: async ({ interaction }) => { await checkPermissions(interaction, basePermissions); const guild = interaction.guild; // ticket system if (interaction.options.getSubcommand() == "ticket") { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + const embedDescription = interaction.options.getString("description"); const embedColor = interaction.options.getString("color"); @@ -486,6 +487,16 @@ export default { const banner = interaction.options.getAttachment("image"); const sendingChannel = interaction.options.getChannel("channel"); + if ( + !sendingChannel + .permissionsFor(interaction.guild.members.me) + .has(PermissionFlagsBits.SendMessages) + ) { + return interaction.editReply({ + content: `${emojis.important} I don't have permission to send messages in ${sendingChannel}!`, + }); + } + const embed = new EmbedBuilder() .setDescription( embedDescription @@ -513,13 +524,12 @@ export default { createticketButton ); - await interaction.reply({ + await interaction.editReply({ content: `${emojis.ticketCreated} Created the ticket system succesfully!`, flags: MessageFlags.Ephemeral, }); - saveStaffRoleId(guild.id, staffRole); - await saveStaffs(client, guild.id, staffRole); + await saveStaffRoleId(guild.id, staffRole); await sendingChannel.send({ embeds: [embed], @@ -545,11 +555,21 @@ export default { if (interaction.options.getSubcommand() == "logs") { await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - const logginChannel = interaction.options.getChannel("channel"); + const loggingChannel = interaction.options.getChannel("channel"); + + if ( + !loggingChannel + .permissionsFor(interaction.guild.members.me) + .has(PermissionFlagsBits.SendMessages) + ) { + return interaction.editReply({ + content: `${emojis.important} I don't have permission to send messages in ${loggingChannel}!`, + }); + } - setupLoggingChannel(guild.id, logginChannel.id); + await setupLoggingChannel(guild.id, loggingChannel.id); - await logginChannel.send({ + await loggingChannel.send({ content: `${emojis.info} Successfully setup the loggin channel.`, }); diff --git a/src/events/client/ClientReady.js b/src/events/client/ClientReady.js index edf4104..42ffe6c 100644 --- a/src/events/client/ClientReady.js +++ b/src/events/client/ClientReady.js @@ -8,5 +8,7 @@ export default { execute: async (client) => { client.user.setPresence(botPresence); console.log(chalk.green(`[READY] Logged in as ${client.user.tag}!`)); + + client.emit("mongoConnect"); }, }; diff --git a/src/events/mongo/mongoConnect.js b/src/events/mongo/mongoConnect.js new file mode 100644 index 0000000..465e9d5 --- /dev/null +++ b/src/events/mongo/mongoConnect.js @@ -0,0 +1,38 @@ +import mongoose from "mongoose"; + +export default { + name: "mongoConnect", + once: true, + async execute(_client) { + const mongoURI = process.env.MONGO_URI; + if (!mongoURI) { + console.error("❌ MONGO_URI is missing in the .env file!"); + process.exit(1); + } + + try { + await mongoose.connect(mongoURI); + console.log("✅ Connected to MongoDB!"); + } catch (error) { + console.error("❌ MongoDB Connection Error:", error); + process.exit(1); + } + + // Register Mongoose event listeners + mongoose.connection.on("connected", () => + console.log("🟢 Mongoose is connected.") + ); + mongoose.connection.on("disconnected", () => + console.warn("🟡 Mongoose is disconnected.") + ); + mongoose.connection.on("error", (err) => + console.error("🔴 Mongoose connection error:", err) + ); + mongoose.connection.on("reconnected", () => + console.log("🟢 Mongoose has reconnected.") + ); + mongoose.connection.on("close", () => + console.log("⚪ Mongoose connection closed.") + ); + }, +}; diff --git a/src/functions/database.js b/src/functions/database.js index 67f227b..83c3ac4 100644 --- a/src/functions/database.js +++ b/src/functions/database.js @@ -1,127 +1,62 @@ -import fs from "fs"; -import path from "path"; +import mongoose from "mongoose"; -const currentFilePath = import.meta.url; -const currentDirPath = path.dirname( - currentFilePath.replace(/^file:[/][/]/, "") -); -const dataDirectory = path.resolve(currentDirPath, "../../data"); -const usersDirectory = path.resolve(dataDirectory, "users"); - -// Ensure data directories exist -[usersDirectory, dataDirectory].forEach((dir) => { - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } +const guildSchema = new mongoose.Schema({ + guildId: { type: String, required: true, unique: true }, + staffRoleId: { type: String, default: null }, + loggingChannelId: { type: String, default: null }, + warnings: { type: Map, of: Number, default: {} }, }); -// Helper function to read and parse a JSON file -const readJsonFile = (filePath) => { - try { - if (!fs.existsSync(filePath)) return null; - const data = fs.readFileSync(filePath, "utf8"); - return JSON.parse(data); - } catch (err) { - console.error("Error reading JSON file:", err); - return null; - } -}; - -// Helper function to write JSON data to a file -const writeJsonFile = (filePath, data) => { - try { - fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); - } catch (err) { - console.error("Error writing JSON file:", err); - } -}; - -const filePath = (guildId) => path.resolve(dataDirectory, `${guildId}.json`); +const Guild = mongoose.model("Guild", guildSchema); // Staff Role -export function saveStaffRoleId(guildId, roleId) { - const file = filePath(guildId); - const guildData = readJsonFile(file) || {}; - guildData.staffRoleId = roleId; - writeJsonFile(file, guildData); +export async function saveStaffRoleId(guildId, roleId) { + await Guild.findOneAndUpdate( + { guildId }, + { staffRoleId: roleId }, + { upsert: true } + ); } -export function getStaffRoleId(guildId) { - const file = filePath(guildId); - const guildData = readJsonFile(file); - return guildData ? guildData.staffRoleId || null : null; +export async function getStaffRoleId(guildId) { + const guild = await Guild.findOne({ guildId }); + return guild?.staffRoleId || null; } // Warning System -export function addWarning(guildId, userId) { - const file = filePath(guildId); - const userData = readJsonFile(file) || {}; +export async function addWarning(guildId, userId) { + const update = { $inc: {} }; + update.$inc[`warnings.${userId}`] = 1; - userData[userId] = userData[userId] || { warnings: 0 }; - userData[userId].warnings++; + const guild = await Guild.findOneAndUpdate({ guildId }, update, { + upsert: true, + new: true, + }); - writeJsonFile(file, userData); + return guild.warnings[userId] || 0; } -export function checkWarnings(guildId, userId) { - const file = filePath(guildId); - const userData = readJsonFile(file) || {}; - return userData[userId]?.warnings || 0; +export async function checkWarnings(guildId, userId) { + try { + const guild = await Guild.findOne({ guildId }); + if (!guild || !guild.warnings) return 0; + return guild.warnings.get(userId) || 0; + } catch (error) { + console.error("Error checking warnings:", error); + return 0; + } } // Logging Channel -export function setupLoggingChannel(guildId, channelId) { - const file = filePath(guildId); - const guildData = readJsonFile(file) || {}; - guildData.loggingChannelId = channelId; - writeJsonFile(file, guildData); -} - -export function checkLoggingChannel(guildId) { - const file = filePath(guildId); - const guildData = readJsonFile(file); - return guildData ? guildData.loggingChannelId || null : null; -} - -// Linked roles -export async function saveStaffs(client, guildId, roleId) { - const guild = client.guilds.cache.get(guildId); - if (!guild) { - console.error("Guild not found."); - return; - } - - const staffRole = guild.roles.cache.get(roleId); - if (!staffRole) { - console.error("Staff role not found in the guild."); - return; - } - - const membersWithStaffRole = staffRole.members.map( - (member) => member.user.id +export async function setupLoggingChannel(guildId, channelId) { + await Guild.findOneAndUpdate( + { guildId }, + { loggingChannelId: channelId }, + { upsert: true } ); - - const file = filePath(guildId); - const guildData = readJsonFile(file) || {}; - guildData.staffMembers = membersWithStaffRole; - writeJsonFile(file, guildData); -} - -export async function getStaffUserId(guildId, userId) { - const file = filePath(guildId); - const guildData = readJsonFile(file); - const staffMembers = guildData?.staffMembers || []; - return staffMembers.includes(userId); } -// Save message count -export function saveMessageCount(guildId, userId) { - const filePath = path.join(usersDirectory, `${userId}.json`); - const userData = readJsonFile(filePath) || {}; - - userData.latestServer = guildId; - userData.messageCount = userData.messageCount || {}; - userData.messageCount[guildId] = (userData.messageCount[guildId] || 0) + 1; - - writeJsonFile(filePath, userData); +export async function checkLoggingChannel(guildId) { + const guild = await Guild.findOne({ guildId }); + return guild?.loggingChannelId || null; } From 4076a89cc950e2197ff4df68f101bcf10a7e79b0 Mon Sep 17 00:00:00 2001 From: Neodevils Date: Fri, 21 Feb 2025 22:01:27 +0300 Subject: [PATCH 4/5] Bump v2.3.1 --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd2524a..bf63a11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kaeru", - "version": "2.3.0", + "version": "2.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kaeru", - "version": "2.3.0", + "version": "2.3.1", "license": "ISC", "dependencies": { "@google/generative-ai": "^0.21.0", diff --git a/package.json b/package.json index 5edecad..8551d71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kaeru", - "version": "2.3.0", + "version": "2.3.1", "description": "A Discord bot is doing unique things.", "main": "index.js", "type": "module", @@ -37,4 +37,4 @@ "mongoose": "^8.10.1", "node-fetch": "^3.3.2" } -} +} \ No newline at end of file From 41ac5bdacd691274747e37311135576ccfe47292 Mon Sep 17 00:00:00 2001 From: Neodevils Date: Fri, 21 Feb 2025 22:02:20 +0300 Subject: [PATCH 5/5] deps: remove cookie-parser from dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 8551d71..1210b70 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "@google/generative-ai": "^0.21.0", "@iamtraction/google-translate": "^2.0.1", "chalk": "^5.4.1", - "cookie-parser": "^1.4.7", "discord.js": "^14.17.3", "dotenv": "^16.4.7", "express": "^4.21.2",