diff --git a/config.json b/config.json index 4a47ef2..a00ca4d 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,6 @@ { "guild": { - "id": "143824995867557888" + "id": "590200804850401311" }, "channel": { "bot": "733359360968884244", diff --git a/package-lock.json b/package-lock.json index c030b37..d9605de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rocabot", - "version": "0.0.1", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rocabot", - "version": "0.0.1", + "version": "1.0.0", "license": "ISC", "dependencies": { "@discordjs/builders": "^0.6.0", @@ -14,6 +14,7 @@ "discord-api-types": "^0.22.0", "discord.js": "^13.1.0", "dotenv": "^10.0.0", + "simple-git": "^3.7.1", "ts-node": "^10.2.1" }, "devDependencies": { @@ -254,6 +255,19 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, "node_modules/@sapphire/async-queue": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", @@ -529,10 +543,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -1235,8 +1248,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -1435,6 +1447,20 @@ "node": ">=8" } }, + "node_modules/simple-git": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.7.1.tgz", + "integrity": "sha512-+Osjtsumbtew2y9to0pOYjNzSIr4NkKGBg7Po5SUtjQhaJf2QBmiTX/9E9cv9rmc7oUiSGFIB9e7ys5ibnT9+A==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/steveukx/" + } + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -1927,6 +1953,19 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, "@sapphire/async-queue": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", @@ -2136,10 +2175,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -2675,8 +2713,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "natural-compare": { "version": "1.4.0", @@ -2815,6 +2852,16 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "simple-git": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.7.1.tgz", + "integrity": "sha512-+Osjtsumbtew2y9to0pOYjNzSIr4NkKGBg7Po5SUtjQhaJf2QBmiTX/9E9cv9rmc7oUiSGFIB9e7ys5ibnT9+A==", + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.3" + } + }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", diff --git a/package.json b/package.json index 6889032..87bad04 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "discord-api-types": "^0.22.0", "discord.js": "^13.1.0", "dotenv": "^10.0.0", + "simple-git": "^3.7.1", "ts-node": "^10.2.1" }, "devDependencies": { diff --git a/src/commands/admin.js b/src/commands/admin.js index f40e51b..ffd2eda 100644 --- a/src/commands/admin.js +++ b/src/commands/admin.js @@ -3,6 +3,9 @@ */ const { MessageActionRow, MessageButton} = require('discord.js'); const { SlashCommandBuilder } = require('@discordjs/builders'); +const fs = require('fs'); +const simpleGit = require('simple-git'); + // Global config const config = require('../../config.json'); @@ -57,6 +60,7 @@ module.exports = { ['Send lang role prompt', 'sendLangRolePrompt'], ['Send PSDK access prompt', 'sendPSDKAccessPrompt'], ['Send Event prompt', 'sendEventPrompt'], + ['Manage allowed URLs and TLDs', 'manageUrlAndTlds'] ])), // Command permissions @@ -164,12 +168,64 @@ module.exports = { ); break; + + case 'manageUrlAndTlds': + replyChannel = interaction.channelId; + + replyEmbed = { + color: 0x5aa264, + title: 'command ran', + description: 'yay', + }; + + //Clone Repo + simpleGit() + .clone('https://github.com/Walven/rocaBot.git') + .then(() => { + simpleGit(__dirname + '/../../rocaBot') + //REMOVE THIS BEFORE PROD + .fetch(['--all']) + .checkout('messageFilter') + .branch() + .then((resp) => { + //Extract args from message + let newUrlToAdd = 'twitch.ittt'; + + //Write to whitelist + fs.mkdirSync(__dirname + '/../../rocaBot/src/events/message', {recursive: true}, ) + fs.appendFileSync(__dirname + '/../../rocaBot/src/events/message/url_whitelist.txt', newUrlToAdd, { flag: 'a+' }); + console.log('wrote to filedd'); + + //Commit & push + simpleGit(__dirname + '/../../rocaBot') + .addConfig('user.name', 'Rocabot') + .addConfig('user.email', 'rocabot@dev.fr') + .status() + .add(__dirname + '/../../rocaBot/src/events/message/url_whitelist.txt') + .status() + .commit('Added new url from runtime') + .push('origin', 'messageFilter') + .then((pushResp) => console.log('push finished', pushResp)) + .catch((err) => console.error('failed: ', err)); + }) + + + }) + .catch((err) => console.error('Could not clone: ', err)); + + break; + } - const row = new MessageActionRow() - .addComponents(buttons); - interaction.guild.channels.cache.get(replyChannel).send({ embeds: [replyEmbed], components: [row] }); - await interaction.reply({ content: 'Message sent!', ephemeral: true }); + /*if (buttons.length) { + const row = new MessageActionRow() + .addComponents(buttons); + interaction.guild.channels.cache.get(replyChannel).send({ embeds: [replyEmbed], components: [row] }); + } else { + interaction.guild.channels.cache.get(replyChannel).send({ embeds: [replyEmbed] }); + }*/ + + //await interaction.reply({ content: 'Message sent!', ephemeral: true }); }, }; \ No newline at end of file diff --git a/src/events/message.js b/src/events/message.js new file mode 100644 index 0000000..854f735 --- /dev/null +++ b/src/events/message.js @@ -0,0 +1,37 @@ +const { readFileSync } = require('fs'); +const os = require('os'); + +//stolen from https://regexr.com/2rj36 +const URL_REGEX = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi; + +module.exports = { + name: 'messageCreate', + once: false, + execute: (client, message) => { + //Check for unkickable roles + const userRoles = message.member.roles.cache; + let userIsStaff = false; + userRoles.forEach(role => { + if (role.name === 'staff') { + userIsStaff = true; + } + }); + if (userIsStaff) return; + + let messageUrls = message.content.match(URL_REGEX); + if (!messageUrls) return; + + const allowedUrls = readFileSync(__dirname + '/message/url_whitelist.txt', 'utf-8').split(os.EOL); + const deniedMessageUrls = messageUrls.filter(messageUrl => !allowedUrls.includes(messageUrl)); + + const allowedTlds = readFileSync(__dirname + '/message/tld_whitelist.txt', 'utf-8').split(os.EOL); + const deniedMessageTlds = messageUrls.filter(messageUrl => !allowedTlds.includes(messageUrl.split('.').pop())); + + if (deniedMessageTlds.length) { + message.member.kick(`Posted link with invalid tld ${deniedMessageTlds.join(', ')}`); + } + if (deniedMessageUrls.length) { + message.delete().catch(console.error); + } + }, +}; \ No newline at end of file diff --git a/src/events/message/tld_whitelist.txt b/src/events/message/tld_whitelist.txt new file mode 100644 index 0000000..fc5d5c4 --- /dev/null +++ b/src/events/message/tld_whitelist.txt @@ -0,0 +1,6 @@ +fr +com +net +eu +info +org \ No newline at end of file diff --git a/src/events/message/url_whitelist.txt b/src/events/message/url_whitelist.txt new file mode 100644 index 0000000..0e2ccc2 --- /dev/null +++ b/src/events/message/url_whitelist.txt @@ -0,0 +1 @@ +blatwitch.ittt \ No newline at end of file diff --git a/src/index.js b/src/index.js index eae6e72..b660d70 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,7 @@ require('dotenv').config({ path: __dirname + '/../.env' }); const fs = require('fs'); const { Client, Collection, Intents } = require('discord.js'); -const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS] }); +const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_MESSAGES] }); // Set local commands client.commands = new Collection();