From f955cea913ee6fb489e6bf0f1dfa53f4cb4da0aa Mon Sep 17 00:00:00 2001 From: BluDood Date: Thu, 27 Oct 2022 22:21:49 +0200 Subject: [PATCH] 2.0 --- .gitignore | 5 ++ README.md | 61 ++++++++++++++ assets/cli.png | Bin 0 -> 9344 bytes assets/dms.png | Bin 0 -> 49798 bytes assets/logs.png | Bin 0 -> 59776 bytes assets/neofetch.png | Bin 0 -> 20886 bytes commands/avatar.js | 31 ++++++++ commands/ban.js | 76 ++++++++++++++++++ commands/censor.js | 93 ++++++++++++++++++++++ commands/checkPerms.js | 30 +++++++ commands/define.js | 38 +++++++++ commands/kick.js | 72 +++++++++++++++++ commands/lock.js | 56 +++++++++++++ commands/neofetch.js | 80 +++++++++++++++++++ commands/ping.js | 8 ++ commands/purge.js | 126 +++++++++++++++++++++++++++++ commands/saveEmoji.js | 21 +++++ commands/timeout.js | 109 ++++++++++++++++++++++++++ commands/unban.js | 47 +++++++++++ commands/unlock.js | 56 +++++++++++++ commands/untimeout.js | 70 +++++++++++++++++ commands/yourmom.js | 39 +++++++++ console.js | 68 ++++++++++++++++ events/messageCreate.js | 33 ++++++++ events/messageDelete.js | 48 ++++++++++++ events/messageUpdate.js | 19 +++++ filters/phishing.js | 18 +++++ index.js | 64 +++++++++++++++ package.json | 20 +++++ setup.js | 93 ++++++++++++++++++++++ utils/checkBotPerms.js | 26 ++++++ utils/checkUserPerms.js | 10 +++ utils/deploy.js | 40 ++++++++++ utils/directMessage.js | 53 +++++++++++++ utils/log.js | 170 ++++++++++++++++++++++++++++++++++++++++ utils/moderation.js | 80 +++++++++++++++++++ utils/packagejson.js | 25 ++++++ utils/sleep.js | 1 + 38 files changed, 1786 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/cli.png create mode 100644 assets/dms.png create mode 100644 assets/logs.png create mode 100644 assets/neofetch.png create mode 100644 commands/avatar.js create mode 100644 commands/ban.js create mode 100644 commands/censor.js create mode 100644 commands/checkPerms.js create mode 100644 commands/define.js create mode 100644 commands/kick.js create mode 100644 commands/lock.js create mode 100644 commands/neofetch.js create mode 100644 commands/ping.js create mode 100644 commands/purge.js create mode 100644 commands/saveEmoji.js create mode 100644 commands/timeout.js create mode 100644 commands/unban.js create mode 100644 commands/unlock.js create mode 100644 commands/untimeout.js create mode 100644 commands/yourmom.js create mode 100644 console.js create mode 100644 events/messageCreate.js create mode 100644 events/messageDelete.js create mode 100644 events/messageUpdate.js create mode 100644 filters/phishing.js create mode 100644 index.js create mode 100644 package.json create mode 100644 setup.js create mode 100644 utils/checkBotPerms.js create mode 100644 utils/checkUserPerms.js create mode 100644 utils/deploy.js create mode 100644 utils/directMessage.js create mode 100644 utils/log.js create mode 100644 utils/moderation.js create mode 100644 utils/packagejson.js create mode 100644 utils/sleep.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b584073 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +package-lock.json +old/ +databases/* +config.json \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..078fecf --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# BluBot + +A self-hosted Discord bot with various moderation features and fun commands. Features a simple CLI and setup script for easy management. + +## Features + +- Automatic moderation + - Censor list (deprecated by Discord AutoMod?) + - Phish protection (powered by phish.sinking.yachts) +- Moderation + - Ban, kick, timeout members + - Purge messages by channel and/or user + - Lock channels +- Logging + - Any moderation action + - Deleted and edited messages + - Automatic moderation actions +- Misc + - Get user avatar + - Define a word using Urban Dictionary + - Neofetch-like status command + - Ping command + - Your Mom jokes (powered by yomomma.info) +- Setup + - Guided setup with customization options +- CLI + - Simple CLI with ASCII art and uptime command (more coming soon) + +## Setup + +0. Install NodeJS +1. Clone this repository +2. Run `npm run setup` and follow the steps +3. Run `npm install` to install dependencies +4. Run `npm start` to start the bot + +## Screenshots + +### Direct Messages + +![](assets/dms.png) + +### Logs + +![](assets/logs.png) + +### Neofetch command (Discord ANSI support) + +![](assets/neofetch.png) + +### CLI + +![](assets/cli.png) + +## Support + +Want to request a new feature or report a bug? + +[Join my Discord Server](https://blnk.ga/dc) +or +[send me an email](mailto:bludood@bludood.com)! diff --git a/assets/cli.png b/assets/cli.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd72eed6bf633b2116341283e6ec626d04a6c24 GIT binary patch literal 9344 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 literal 0 HcmV?d00001 diff --git a/assets/dms.png b/assets/dms.png new file mode 100644 index 0000000000000000000000000000000000000000..962916b039fa2b35f9df4b411e04011163120149 GIT binary patch literal 49798 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 z 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 C{DeXP literal 0 HcmV?d00001 diff --git a/assets/logs.png b/assets/logs.png new file mode 100644 index 0000000000000000000000000000000000000000..a0490b780d8d151a109641abd9f7cd5cb63c1404 GIT binary patch literal 59776 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 +H3B>5B% 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 Mw2bbSYdA#y7p!WVD*ylh literal 0 HcmV?d00001 diff --git a/assets/neofetch.png b/assets/neofetch.png new file mode 100644 index 0000000000000000000000000000000000000000..36559118d6830efaba040cb4f0cdf50fcf60f316 GIT binary patch literal 20886 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

^<@jX%#T`B+n-{NFnCl72#>Al8;r~>Wd{m-RTMb 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 literal 0 HcmV?d00001 diff --git a/commands/avatar.js b/commands/avatar.js new file mode 100644 index 0000000..5cd119b --- /dev/null +++ b/commands/avatar.js @@ -0,0 +1,31 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') + +module.exports = { + data: new SlashCommandBuilder() + .setName('avatar') + .setDescription("Get your or another user's avatar") + .addUserOption(option => + option.setName('target').setDescription('User to show avatar for') + ), + async execute(interaction) { + const user = interaction.options.getUser('target') || interaction.user + const avatar = format => user.avatarURL({ format }) + interaction.reply({ + embeds: [ + { + title: `${user.username}'s avatar`, + description: `Download as [png](${avatar('png')}), [jpeg](${avatar( + 'jpeg' + )}) or [webp](${avatar('webp')}).`, + color: accent, + image: { + url: avatar('png') + } + } + ] + }) + } +} diff --git a/commands/ban.js b/commands/ban.js new file mode 100644 index 0000000..d736204 --- /dev/null +++ b/commands/ban.js @@ -0,0 +1,76 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const directMessage = require('../utils/directMessage') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('ban') + .setDescription('Ban a member.') + .addUserOption(option => + option.setName('target').setDescription('User to ban').setRequired(true) + ) + .addStringOption(option => + option.setName('reason').setDescription('Reason for the ban') + ) + .addNumberOption(option => + option.setName('deletedays').setDescription('Days to delete messages') + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const target = interaction.options.getUser('target') + const reason = interaction.options.getString('reason') || 'N/A' + const days = interaction.options.getNumber('deletedays') || 0 + const member = await interaction.guild.members + .fetch({ user: target, force: true }) + .catch(() => null) + if (!member) + return interaction.reply({ + content: "I can't find that user!", + ephemeral: true + }) + if (!member.bannable) + return interaction.reply({ + content: "I can't ban that user!", + ephemeral: true + }) + await interaction.reply({ + embeds: [ + { + title: `${target.tag} banned.`, + color: accent + } + ], + ephemeral: true + }) + const dm = await directMessage(interaction.guild, target, 'ban', { + reason, + moderator: { + id: interaction.user.id + } + }) + if (!dm) + await interaction.followUp({ + content: 'I could not message that user!', + ephemeral: true + }) + await member.ban(target, { days: days, reason: reason }) + log(interaction.guild, 'ban', { + target: { + id: target.id, + tag: target.tag + }, + moderator: { + id: interaction.user.id + }, + reason + }) + } +} diff --git a/commands/censor.js b/commands/censor.js new file mode 100644 index 0000000..78395f8 --- /dev/null +++ b/commands/censor.js @@ -0,0 +1,93 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const fs = require('fs') +const checkUserPerms = require('../utils/checkUserPerms') + +module.exports = { + data: new SlashCommandBuilder() + .setName('censor') + .setDescription('Configure censored words') + .addSubcommand(subcommand => + subcommand + .setName('add') + .setDescription('Add a censored word') + .addStringOption(option => + option + .setName('word') + .setDescription('The word to censor') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName('remove') + .setDescription('Remove a censored word') + .addStringOption(option => + option + .setName('word') + .setDescription('The word to remove') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand.setName('list').setDescription('List all censored words') + ), + async execute(interaction) { + const word = interaction.options.getString('word')?.toLowerCase() + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + + if (interaction.options.getSubcommand() === 'add') { + const censored = JSON.parse(fs.readFileSync('./databases/censored.json')) + if (censored.map(c => c.word).includes(word)) + return await interaction.reply({ + content: 'This word is already censored!', + ephemeral: true + }) + censored.push({ + user: interaction.user.id, + word + }) + fs.writeFileSync('./databases/censored.json', JSON.stringify(censored)) + await interaction.reply({ + content: `Censored the word ${word}!`, + ephemeral: true + }) + } else if (interaction.options.getSubcommand() === 'remove') { + const censored = JSON.parse(fs.readFileSync('./databases/censored.json')) + const found = censored.find(c => c.word === word) + if (!found) + return await interaction.reply({ + content: 'This word is not censored!', + ephemeral: true + }) + const index = censored.indexOf(found) + censored.splice(index, 1) + fs.writeFileSync('./databases/censored.json', JSON.stringify(censored)) + await interaction.reply({ + content: `Removed censor for the word ${word}!`, + ephemeral: true + }) + } else if (interaction.options.getSubcommand() === 'list') { + const censored = JSON.parse(fs.readFileSync('./databases/censored.json')) + await interaction.reply({ + embeds: [ + { + title: 'Censored words', + color: accent, + fields: censored.map(c => ({ + name: c.word, + value: `Added by <@${c.user}>` + })) + } + ], + ephemeral: true + }) + } else return interaction.reply('Invalid option.') + } +} diff --git a/commands/checkPerms.js b/commands/checkPerms.js new file mode 100644 index 0000000..0e6fed7 --- /dev/null +++ b/commands/checkPerms.js @@ -0,0 +1,30 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') + +module.exports = { + data: new SlashCommandBuilder() + .setName('check') + .setDescription('Check if are allowed to moderate using this bot.'), + async execute(interaction) { + if (checkUserPerms(interaction)) + return interaction.reply({ + embeds: [ + { + title: `You are allowed to moderate using this bot!`, + color: accent + } + ] + }) + return interaction.reply({ + embeds: [ + { + title: `You are not allowed to moderate using this bot.`, + color: accent + } + ] + }) + } +} diff --git a/commands/define.js b/commands/define.js new file mode 100644 index 0000000..217093a --- /dev/null +++ b/commands/define.js @@ -0,0 +1,38 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const axios = require('axios').default + +module.exports = { + data: new SlashCommandBuilder() + .setName('define') + .setDescription('Define a word with Urban Dictionary!') + .addStringOption(option => + option + .setName('query') + .setDescription('Word to search for') + .setRequired(true) + ), + async execute(interaction) { + // my api ;) + const api = 'https://urbanapi.up.railway.app' + const query = interaction.options.getString('query') + interaction.deferReply() + const res = await axios + .get(`${api}/define/${query}`, { + validateStatus: false + }) + .catch(() => null) + if (!res?.data?.success) + return interaction.editReply('An error has occured!') + if (res.status === 404) + return interaction.editReply('Could not find that word!') + const embed = { + color: accent, + title: res.data.result[0].word, + description: res.data.result[0].description + } + return interaction.editReply({ embeds: [embed] }) + } +} diff --git a/commands/kick.js b/commands/kick.js new file mode 100644 index 0000000..44c527f --- /dev/null +++ b/commands/kick.js @@ -0,0 +1,72 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const directMessage = require('../utils/directMessage') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('kick') + .setDescription('Kick a member.') + .addUserOption(option => + option.setName('target').setDescription('User to kick').setRequired(true) + ) + .addStringOption(option => + option.setName('reason').setDescription('Reason for the kick') + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const target = interaction.options.getUser('target') + const reason = interaction.options.getString('reason') || 'N/A' + const member = await interaction.guild.members + .fetch({ user: target, force: true }) + .catch(() => null) + if (!member) + return interaction.reply({ + content: "I can't find that user!", + ephemeral: true + }) + if (!member.kickable) + return interaction.reply({ + content: "I can't kick that user!", + ephemeral: true + }) + await interaction.reply({ + embeds: [ + { + title: `${target.tag} kicked.`, + color: accent + } + ], + ephemeral: true + }) + const dm = await directMessage(interaction.guild, target, 'kick', { + reason, + moderator: { + id: interaction.user.id + } + }) + if (!dm) + await interaction.followUp({ + content: 'I could not message that user!', + ephemeral: true + }) + await member.kick(reason) + log(interaction.guild, 'kick', { + target: { + id: target.id, + tag: target.tag + }, + moderator: { + id: interaction.user.id + }, + reason + }) + } +} diff --git a/commands/lock.js b/commands/lock.js new file mode 100644 index 0000000..237b447 --- /dev/null +++ b/commands/lock.js @@ -0,0 +1,56 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('lock') + .setDescription('Lock a channel') + .addChannelOption(option => + option.setName('channel').setDescription('Channel to lock') + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const channel = + interaction.options.getChannel('channel') || interaction.channel + if (!channel) return interaction.reply('I cannot access that channel!') + if ( + !channel + .permissionsFor(interaction.guild.roles.everyone) + .has('SEND_MESSAGES') + ) + return interaction.reply('This channel is already locked!') + try { + channel.permissionOverwrites.edit(interaction.guild.roles.everyone, { + SEND_MESSAGES: false + }) + await interaction.reply({ + embeds: [ + { + title: `#${channel.name} locked.`, + color: accent + } + ] + }) + log(interaction.guild, 'lock', { + channel: { + id: channel.id, + name: channel.name + }, + moderator: { + id: interaction.user.id + } + }) + } catch (error) { + console.log(error) + interaction.reply('I cannot lock that channel!') + } + } +} diff --git a/commands/neofetch.js b/commands/neofetch.js new file mode 100644 index 0000000..90a9fa7 --- /dev/null +++ b/commands/neofetch.js @@ -0,0 +1,80 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const chalk = require('chalk') +const os = require('os') +const { getDependency, getVersion } = require('../utils/packagejson') + +module.exports = { + data: new SlashCommandBuilder() + .setName('neofetch') + .setDescription('Information about this bot') + .addBooleanOption(option => + option + .setName('minimal') + .setDescription( + 'Show minimal message without ASCII art. Better for mobile screens.' + ) + ), + async execute(interaction) { + const minimal = interaction.options.getBoolean('minimal') + let uptime = process.uptime() + const hours = Math.floor(uptime / 3600) + uptime %= 3600 + const minutes = Math.floor(uptime / 60) + const seconds = Math.floor(uptime % 60) + + const cpus = os.cpus() + const cpu_name = cpus[0].model + + // prettier-ignore + const info = [ + `${chalk.red("BluBot")} @ ${chalk.red(os.hostname())}`, + '', + `${chalk.red("Version")}: ${getVersion()}`, + `${chalk.red("node")}: ${process.version}`, + `${chalk.red("discord.js")}: v${getDependency('discord.js').version}`, + '', + `${chalk.red("Uptime")}: ${hours ? `${hours} hours, ` : ''}${minutes ? `${minutes} minutes and ` : ''}${seconds} seconds`, + `${chalk.red("Ping")}: ${interaction.client.ws.ping}ms`, + '', + `${chalk.red("OS")}: ${os.version()} ${os.arch()}`, + `${chalk.red("CPU")}: ${cpu_name} (${cpus.length})`, + `${chalk.red("Memory")}: ${Math.round(os.freemem() / 1000000)}MB / ${Math.round(os.totalmem() / 1000000)}MB`, + '', + `${chalk.black("██")}${chalk.red("██")}${chalk.green("██")}${chalk.yellow("██")}${chalk.blue("██")}${chalk.magenta("██")}${chalk.cyan("██")}${chalk.white("██")}` + ] + const ascii = [ + '', + ' .---::. .. ', + ' .=+++++=-::::::::-=+: ', + ' =+#*******+:..:=****+====- ', + ' *%%#**++++##**##++++**#%%* ', + ' -%%%%%%####+..+#####%%%%%. ', + ' :*%%%%%%%%+.:::*%%%%%%%%+ ', + ' :==+****+-.-+=-.-+****=. ', + ' :++=-----::::::::---- ', + ' -====----------------. ', + ' =======--::::::::::::=. ', + ' -=++=======:..........=. ', + ' .=++++======-::.....:::=. ', + ' :=++++======-::::::::--- ', + ' -++=+++++++=----------: ', + ' ==++++++++==--------: ', + ' ===++++++++=======: ', + ' ==-:=++++++++==++: ', + ' =+++++:..==. ', + ' .== -=. .. ', + ' ..::::-:::::..:::. ', + '' + ] + const offset = Math.floor((ascii.length - info.length) / 2) + return minimal + ? interaction.reply(`\`\`\`ansi\n \n ${info.join('\n ')}\n \`\`\``) + : interaction.reply( + `\`\`\`ansi\n${chalk.blue( + ascii + .map((a, i) => ' ' + a + ' ' + (info[i - offset] || '')) + .join('\n') + )}\n\n\n\`\`\`` + ) + } +} diff --git a/commands/ping.js b/commands/ping.js new file mode 100644 index 0000000..d16aef2 --- /dev/null +++ b/commands/ping.js @@ -0,0 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') + +module.exports = { + data: new SlashCommandBuilder().setName('ping').setDescription('Pong!'), + async execute(interaction) { + return interaction.reply(`Pong! (${interaction.client.ws.ping}ms)`) + } +} diff --git a/commands/purge.js b/commands/purge.js new file mode 100644 index 0000000..a426205 --- /dev/null +++ b/commands/purge.js @@ -0,0 +1,126 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('purge') + .setDescription('Purge messages.') + .addSubcommand(subcommand => + subcommand + .setName('channel') + .setDescription('Purge messages by channel') + .addNumberOption(option => + option + .setName('amount') + .setDescription('Amount of messages to purge (max 100)') + .setRequired(true) + ) + .addChannelOption(option => + option + .setName('channel') + .setDescription('Channel to purge messages in') + ) + ) + .addSubcommand(subcommand => + subcommand + .setName('user') + .setDescription('Purge messages by user') + .addUserOption(option => + option + .setName('user') + .setDescription('User to purge messages for') + .setRequired(true) + ) + .addNumberOption(option => + option + .setName('amount') + .setDescription('Amount of messages to purge (max 100)') + .setRequired(true) + ) + .addChannelOption(option => + option + .setName('channel') + .setDescription('Channel to purge messages in') + ) + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const amount = interaction.options.getNumber('amount') + const channel = + interaction.options.getChannel('channel') || interaction.channel + const user = interaction.options.getUser('user') + + if (amount > 100) + return interaction.reply('You can only purge up to 100 messages at once.') + if (amount < 1) + return interaction.reply('You must purge at least 1 message.') + + const command = interaction.options.getSubcommand() + if (command === 'channel') { + await channel.bulkDelete(amount) + await interaction.reply({ + embeds: [ + { + title: `Purged ${amount} message${amount === 1 ? '' : 's'} in #${ + channel.name + }!`, + color: accent + } + ], + ephemeral: true + }) + log(interaction.guild, 'purge', { + moderator: { + id: interaction.user.id + }, + channel: { + id: channel.id + }, + amount + }) + return + } else if (command === 'user') { + const messages = channel.messages.fetch({ limit: 100 }) + const userMessages = (await messages) + .filter(m => m.author.id === user.id) + .toJSON() + .splice(0, amount) + if (userMessages.length === 0) + return interaction.reply('Could not find any messages by that user.') + await channel.bulkDelete(userMessages) + await interaction.reply({ + embeds: [ + { + title: `Purged ${amount} message${amount == 1 ? '' : 's'} by ${ + user.tag + } in #${channel.name}!`, + color: accent + } + ], + ephemeral: true + }) + log(interaction.guild, 'purge', { + target: { + id: user.id, + tag: user.tag + }, + moderator: { + id: interaction.user.id + }, + channel: { + id: channel.id + }, + amount + }) + return + } + } +} diff --git a/commands/saveEmoji.js b/commands/saveEmoji.js new file mode 100644 index 0000000..02a3e56 --- /dev/null +++ b/commands/saveEmoji.js @@ -0,0 +1,21 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') + +module.exports = { + data: new SlashCommandBuilder() + .setName('saveemoji') + .setDescription('Converts an emoji to an image.') + .addStringOption(option => + option + .setName('emoji') + .setDescription('Emoji to convert') + .setRequired(true) + ), + async execute(interaction) { + const emojiName = interaction.options.getString('emoji') + const isCustom = emojiName.startsWith('<:') && emojiName.endsWith('>') + const emoji = isCustom + ? `https://cdn.discordapp.com/emojis/${emojiName.match(/[0-9]+/)[0]}.png` + : `https://emojicdn.elk.sh/${emojiName}?style=apple` + return interaction.reply(emoji) + } +} diff --git a/commands/timeout.js b/commands/timeout.js new file mode 100644 index 0000000..aed36e3 --- /dev/null +++ b/commands/timeout.js @@ -0,0 +1,109 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const directMessage = require('../utils/directMessage') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('timeout') + .setDescription('Time out a member.') + .addUserOption(option => + option + .setName('target') + .setDescription('User to timeout') + .setRequired(true) + ) + .addStringOption(option => + option + .setName('duration') + .setDescription('Duration for the timeout (s, m, h, d, w, M, y)') + .setRequired(true) + ) + .addStringOption(option => + option.setName('reason').setDescription('Reason for the timeout') + ), + async execute(interaction) { + const target = interaction.options.getUser('target') + const reason = interaction.options.getString('reason') || 'N/A' + const member = await interaction.guild.members + .fetch({ user: target, force: true }) + .catch(() => null) + if (!member) + return interaction.reply({ + content: "I can't find that user!", + ephemeral: true + }) + if (!member.moderatable) + return interaction.reply({ + content: "I can't timeout that user!", + ephemeral: true + }) + const durationUnits = { + s: 1000, + m: 60000, + h: 3600000, + d: 86400000, + w: 604800000, + M: 2592000000, + y: 31536000000 + } + const unitNames = { + s: 'second', + m: 'minute', + h: 'hour', + d: 'day', + w: 'week', + M: 'month', + y: 'year' + } + const [amount, unit] = + interaction.options + .getString('duration') + .match(/([0-9]+)([a-zA-Z]{1})/) + ?.splice(1) || [] + if (!durationUnits[unit]) + return await interaction.reply({ + content: `${unit} is not a valid unit!`, + ephemeral: true + }) + const duration = parseInt(amount) * durationUnits[unit] + await interaction.reply({ + embeds: [ + { + title: `${target.tag} timed out.`, + color: accent + } + ], + ephemeral: true + }) + const dm = await directMessage(interaction.guild, target, 'timeout', { + reason, + moderator: { + id: interaction.user.id + }, + duration: `Duration: ${amount} ${unitNames[unit]}${ + amount == 1 ? '' : 's' + }` + }) + if (!dm) + await interaction.followUp({ + content: 'I could not message that user!', + ephemeral: true + }) + await member.timeout(duration, reason) + log(interaction.guild, 'timeout', { + target: { + id: target.id, + tag: target.tag + }, + moderator: { + id: interaction.user.id + }, + reason, + duration: `${amount} ${unitNames[unit]}${amount == 1 ? '' : 's'}` + }) + } +} diff --git a/commands/unban.js b/commands/unban.js new file mode 100644 index 0000000..c46ac4d --- /dev/null +++ b/commands/unban.js @@ -0,0 +1,47 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('unban') + .setDescription('Revokes the ban for a member.') + .addUserOption(option => + option.setName('target').setDescription('User to unban').setRequired(true) + ) + .addStringOption(option => + option.setName('reason').setDescription('Reason for the unban') + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const target = interaction.options.getUser('target') + const reason = interaction.options.getString('reason') || 'N/A' + await interaction.guild.members.unban(target) + await interaction.reply({ + embeds: [ + { + title: `${target.tag} unbanned.`, + color: accent + } + ], + ephemeral: true + }) + log(interaction.guild, 'unban', { + target: { + id: target.id, + tag: target.tag + }, + moderator: { + id: interaction.user.id + }, + reason + }) + } +} diff --git a/commands/unlock.js b/commands/unlock.js new file mode 100644 index 0000000..8a5d6a8 --- /dev/null +++ b/commands/unlock.js @@ -0,0 +1,56 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('unlock') + .setDescription('Unlock a channel') + .addChannelOption(option => + option.setName('channel').setDescription('Channel to unlock') + ), + async execute(interaction) { + if (!checkUserPerms(interaction)) + return interaction.reply({ + content: 'You do not have permission to do that!', + ephemeral: true + }) + const channel = + interaction.options.getChannel('channel') || interaction.channel + if (!channel) return interaction.reply('I cannot access that channel!') + if ( + channel + .permissionsFor(interaction.guild.roles.everyone) + .has('SEND_MESSAGES') + ) + return interaction.reply('This channel is not locked!') + try { + channel.permissionOverwrites.edit(interaction.guild.roles.everyone, { + SEND_MESSAGES: null + }) + await interaction.reply({ + embeds: [ + { + title: `#${channel.name} unlocked.`, + color: accent + } + ] + }) + log(interaction.guild, 'unlock', { + channel: { + id: channel.id, + name: channel.name + }, + moderator: { + id: interaction.user.id + } + }) + } catch (error) { + console.log(error) + interaction.reply('I cannot unlock that channel!') + } + } +} diff --git a/commands/untimeout.js b/commands/untimeout.js new file mode 100644 index 0000000..5463027 --- /dev/null +++ b/commands/untimeout.js @@ -0,0 +1,70 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const { + customization: { accent } +} = require('../config.json') +const checkUserPerms = require('../utils/checkUserPerms') +const directMessage = require('../utils/directMessage') +const log = require('../utils/log') + +module.exports = { + data: new SlashCommandBuilder() + .setName('untimeout') + .setDescription('Remove the timeout a member.') + .addUserOption(option => + option + .setName('target') + .setDescription('User to remove timeout for') + .setRequired(true) + ) + .addStringOption(option => + option.setName('reason').setDescription('Reason for the timeout removal') + ), + async execute(interaction) { + const target = interaction.options.getUser('target') + const reason = interaction.options.getString('reason') || 'N/A' + const member = await interaction.guild.members + .fetch({ user: target, force: true }) + .catch(() => null) + if (!member) + return interaction.reply({ + content: "I can't find that user!", + ephemeral: true + }) + if (!member.moderatable) + return interaction.reply({ + content: "I can't remove the timeout for that user!", + ephemeral: true + }) + await interaction.reply({ + embeds: [ + { + title: `Removed timeout for ${target.tag}.`, + color: accent + } + ], + ephemeral: true + }) + const dm = await directMessage(interaction.guild, target, 'untimeout', { + reason, + moderator: { + id: interaction.user.id + } + }) + if (!dm) + await interaction.followUp({ + content: 'I could not message that user!', + ephemeral: true + }) + await member.timeout(null, reason) + log(interaction.guild, 'untimeout', { + target: { + id: target.id, + tag: target.tag + }, + moderator: { + id: interaction.user.id + }, + reason + }) + } +} diff --git a/commands/yourmom.js b/commands/yourmom.js new file mode 100644 index 0000000..0026a38 --- /dev/null +++ b/commands/yourmom.js @@ -0,0 +1,39 @@ +const { SlashCommandBuilder } = require('@discordjs/builders') +const axios = require('axios').default +const { + customization: { accent } +} = require('../config.json') + +module.exports = { + data: new SlashCommandBuilder() + .setName('yourmom') + .setDescription("yo momma so phat she couldn't run this command"), + async execute(interaction) { + const joke = await axios.get('https://api.yomomma.info').catch(() => null) + if (joke?.data.joke) + interaction.reply({ + embeds: [ + { + title: joke.data.joke, + color: accent, + footer: { + text: `Powered by api.yomomma.info` + } + } + ] + }) + else { + interaction.reply({ + embeds: [ + { + title: 'Yo momma so phat she rolled over the cables and broke them', + color: accent, + footer: { + text: 'I was not able to fetch a joke from api.yomomma.info.' + } + } + ] + }) + } + } +} diff --git a/console.js b/console.js new file mode 100644 index 0000000..e8f526a --- /dev/null +++ b/console.js @@ -0,0 +1,68 @@ +const chalk = require('chalk') +const sleep = require('./utils/sleep') + +async function motd(tag) { + console.clear() + const ascii = `______ _ ______ _ +| ___ \\ | | ___ \\ | | +| |_/ / |_ _| |_/ / ___ | |_ +| ___ \\ | | | | ___ \\/ _ \\| __| +| |_/ / | |_| | |_/ / (_) | |_ +\\____/|_|\\__,_\\____/ \\___/ \\__| +=============================== +`.split('\n') + for (let line of ascii) { + console.log(chalk.hex('#0064FF')(line)) + await sleep(50) + } + tag && console.log(`Welcome to BluBot! Your bot (${tag}) is now running.`) + console.log('Press h for help.') +} + +const commands = { + h: () => { + console.log(` + [h] Show this help page + [m] Show the MOTD + [u] Show uptime + [q] Quit + `) + }, + m: motd, + u: () => { + let uptime = process.uptime() + const hours = Math.floor(uptime / 3600) + uptime %= 3600 + const minutes = Math.floor(uptime / 60) + const seconds = Math.floor(uptime % 60) + console.log( + chalk.yellow( + `\nUptime: ${hours ? `${hours} hours, ` : ''}${ + minutes ? `${minutes} minutes and ` : '' + }${seconds} seconds.` + ) + ) + }, + q: () => { + console.log('Goodbye!') + process.exit() + } +} + +module.exports = { + init: () => { + console.clear() + console.log(chalk.yellow('Starting BluBot...')) + process.stdin.setRawMode?.(true) + process.stdin.resume() + process.stdin.setEncoding('utf8') + + process.stdin.on('data', key => { + if (key === '\u0003') process.exit() + const found = commands[key] + if (!found) return + found() + }) + }, + motd +} diff --git a/events/messageCreate.js b/events/messageCreate.js new file mode 100644 index 0000000..fe164c1 --- /dev/null +++ b/events/messageCreate.js @@ -0,0 +1,33 @@ +const fs = require('fs') +const phishing = require('../filters/phishing').check +const log = require('../utils/log') + +module.exports = { + event: 'messageCreate', + async listener(message) { + if (message.author.bot) return + const phishingLinks = await phishing(message.content) + if (phishingLinks && phishingLinks.length !== 0) { + await message.delete() + const messaged = JSON.parse(fs.readFileSync('./databases/messaged.json')) + if (messaged[message.author.id]?.time > Date.now() / 1000) return + message.author.send( + "Sorry, you can't send that link here!\nThe link was referring to a known phishing scam, so i deleted the message for you." + ) + if (!messaged[message.author.id]) messaged[message.author.id] = {} + messaged[message.author.id].time = Date.now() / 1000 + 300 + fs.writeFileSync('./databases/messaged.json', JSON.stringify(messaged)) + log(message.guild, 'phish', { + channel: { + id: message.channel.id + }, + target: { + id: message.author.id, + tag: message.author.tag + }, + content: message.content, + site: phishingLinks.join('\n') + }) + } + } +} diff --git a/events/messageDelete.js b/events/messageDelete.js new file mode 100644 index 0000000..23cd406 --- /dev/null +++ b/events/messageDelete.js @@ -0,0 +1,48 @@ +const fs = require('fs') +const log = require('../utils/log') +const sleep = require('../utils/sleep') + +module.exports = { + event: 'messageDelete', + async listener(message) { + if (!fs.existsSync('./databases/deleted.txt')) + fs.writeFileSync('./databases/deleted.txt', 'false', 'utf-8') + if (fs.readFileSync('./databases/deleted.txt', 'utf-8') === 'true') { + return fs.writeFileSync('./databases/deleted.txt', 'false', 'utf-8') + } + if (!message.guild) return + await sleep(1000) + const fetchedLogs = await message.guild.fetchAuditLogs({ + limit: 1, + type: 'MESSAGE_DELETE' + }) + const deletionLog = fetchedLogs.entries.first() + const { executor, target } = deletionLog || {} + if ( + target?.id === message.author.id && + deletionLog.createdAt > message.createdAt + ) + log(message.guild, 'messageDelete', { + moderator: { + id: executor.id + }, + content: message.content, + channel: { + id: message.channel.id + }, + target: { + id: message.author.id + } + }) + else + log(message.guild, 'messageDelete', { + content: message.content, + channel: { + id: message.channel.id + }, + target: { + id: message.author.id + } + }) + } +} diff --git a/events/messageUpdate.js b/events/messageUpdate.js new file mode 100644 index 0000000..78c942d --- /dev/null +++ b/events/messageUpdate.js @@ -0,0 +1,19 @@ +const fs = require('fs') +const log = require('../utils/log') + +module.exports = { + event: 'messageUpdate', + async listener(oldMessage, newMessage) { + if (oldMessage.content === newMessage.content) return + log(newMessage.guild, 'messageEdit', { + oldMessage: oldMessage.content, + content: newMessage.content, + target: { + id: newMessage.author.id + }, + channel: { + id: newMessage.channel.id + } + }) + } +} diff --git a/filters/phishing.js b/filters/phishing.js new file mode 100644 index 0000000..ffe1ed5 --- /dev/null +++ b/filters/phishing.js @@ -0,0 +1,18 @@ +const axios = require('axios').default + +module.exports = { + check: async message => { + const matches = message.match(/(http|https)(:\/\/)[a-zA-Z0-9\-\.]+/gm) + if (!matches) return null + const detected = [] + for (let match of matches) { + const domain = match.split('://')[1] + const phish = await axios + .get(`https://phish.sinking.yachts/v2/check/${domain}`) + .catch(() => null) + if (!phish?.data) continue + detected.push(match) + } + return detected + } +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..edee210 --- /dev/null +++ b/index.js @@ -0,0 +1,64 @@ +const { Client, Collection, Intents } = require('discord.js') +const fs = require('fs') +const deploy = require('./utils/deploy') +const bconsole = require('./console') + +if (!fs.existsSync('./config.json')) { + console.log( + "Looks like you haven't set up the bot yet! Please run 'npm run setup' and try again." + ) + process.exit() +} + +const client = new Client({ + intents: [ + Intents.FLAGS.GUILDS, + Intents.FLAGS.GUILD_MESSAGES, + Intents.FLAGS.GUILD_VOICE_STATES + ] +}) + +client.commands = new Collection() +const commandFiles = fs + .readdirSync('./commands') + .filter(file => file.endsWith('.js')) +for (const file of commandFiles) { + const command = require(`./commands/${file}`) + client.commands.set(command.data.name, command) +} + +bconsole.init() +client.once('ready', async c => { + bconsole.motd(c.user.tag) + deploy(c.user.id) +}) + +for (const eventFile of fs + .readdirSync('./events') + .filter(file => file.endsWith('.js'))) { + const event = require(`./events/${eventFile}`) + client.on(event.event, event.listener) +} + +client.on('unhandledRejection', error => { + console.log(error) +}) + +client.on('error', error => { + console.log(error) +}) + +client.on('interactionCreate', async interaction => { + if (interaction.isButton()) return + const command = client.commands.get(interaction.commandName) + if (command) { + try { + await command.execute(interaction) + } catch (error) { + console.error(error) + } + } +}) + +const { token } = require('./config.json') +client.login(token) diff --git a/package.json b/package.json new file mode 100644 index 0000000..0d7fe02 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "blubot", + "version": "2.0", + "description": "Discord moderation bot", + "main": "index.js", + "scripts": { + "start": "node index.js", + "setup": "node setup.js" + }, + "author": "BluDood", + "license": "ISC", + "dependencies": { + "@discordjs/builders": "^0.9.0", + "@discordjs/rest": "^0.2.0-canary.0", + "axios": "^0.24.0", + "chalk": "^4.1.2", + "discord-api-types": "^0.25.2", + "discord.js": "^13.6.0" + } +} diff --git a/setup.js b/setup.js new file mode 100644 index 0000000..0d288df --- /dev/null +++ b/setup.js @@ -0,0 +1,93 @@ +const fs = require('fs') + +const current = { + guildId: null, + token: null, + customization: { + accent: null, + colors: { + good: null, + medium: null, + bad: null + } + }, + modRoles: [], + channels: { + logs: null + } +} + +function readline() { + return new Promise(resolve => { + process.stdin.once('data', d => { + resolve(d.toString().trim()) + }) + }) +} + +;(async () => { + if (fs.existsSync('config.json')) { + console.log('Configuration file already exists! Overwrite? [y/N]') + const overwrite = (await readline()).toLowerCase() + if (overwrite === '' || overwrite === 'n') { + console.log('Abort.') + process.exit() + } + } + console.log( + 'Welcome to the BluBot setup!\nThis script will set up your bot with its token, guild, channels and roles.\nPress Enter to continue...' + ) + await readline() + console.log('Please enter your Discord bot token:') + current.token = await readline() + console.log( + 'Now enter the guild ID of your server. You can find this by enabling Developer Mode and right-clicking your guild.' + ) + current.guildId = await readline() + console.log( + "That's a really nice server you got! Just kidding, i'm not sentient ;(\nWould you like to customize your bot with custom colors for embeds? [y/N]" + ) + const customColors = (await readline()).toLowerCase() + if (customColors === 'y') { + console.log( + 'Alright. Please enter a HEX color you would like as an accent color. This will apply to generic embeds. Leave blank for default.' + ) + current.customization.accent = await readline() + console.log( + 'Now enter a HEX color you would like as a "good" color. This will apply to embeds which remove a moderation. Leave blank for default.' + ) + current.customization.colors.good = await readline() + console.log( + 'Now enter a HEX color you would like as a "medium" color. This will apply to embeds which add a semi-fatal moderation like a kick or timeout. Leave blank for default.' + ) + current.customization.colors.medium = await readline() + console.log( + 'Now enter a HEX color you would like as a "bad" color. This will apply to embeds which add a fatal moderation like a ban. Leave blank for default.' + ) + current.customization.colors.bad = await readline() + } + console.log( + (customColors === 'y' ? '' : "Alright, i'll use the default colors. ") + + 'Now, time to set up your moderation roles. Enter all your moderation role IDs here, separated by a comma.' + ) + current.modRoles = (await readline()).split(',').map(r => parseInt(r.trim())) + console.log("Got that. Now enter the channel you'd like me to send logs to:") + current.channels.logs = parseInt((await readline()).trim()) + console.log(` +Guild ID: ${current.guildId} +Bot token: ${current.token} +Moderator Roles: ${current.modRoles.join(', ')} +Logging channel: ${current.channels.logs} +Does this look correct? [Y/n] + `) + const correct = (await readline()).toLowerCase() + if (!(correct === '' || correct === 'y')) { + console.log('Abort.') + process.exit() + } + fs.writeFileSync('config.json', JSON.stringify(current)) + console.log( + "Success! Install dependencies with the command 'npm install', and start the bot with 'npm start'!" + ) + process.exit() +})() diff --git a/utils/checkBotPerms.js b/utils/checkBotPerms.js new file mode 100644 index 0000000..31019ce --- /dev/null +++ b/utils/checkBotPerms.js @@ -0,0 +1,26 @@ +module.exports = interaction => { + const requiredPerms = [ + 'KICK_MEMBERS', + 'BAN_MEMBERS', + 'ADD_REACTIONS', + 'VIEW_AUDIT_LOG', + 'VIEW_CHANNEL', + 'SEND_MESSAGES', + 'MANAGE_MESSAGES', + 'EMBED_LINKS', + 'ATTACH_FILES', + 'READ_MESSAGE_HISTORY', + 'CONNECT', + 'SPEAK', + 'CHANGE_NICKNAME', + 'MANAGE_NICKNAMES', + 'MANAGE_ROLES', + 'MODERATE_MEMBERS' + ] + const currentPerms = interaction.guild.me.permissions.serialize() + const missingPerms = requiredPerms.filter( + perm => currentPerms[perm] === false + ) + if (missingPerms.length === 0) return true + return missingPerms +} diff --git a/utils/checkUserPerms.js b/utils/checkUserPerms.js new file mode 100644 index 0000000..8c1cdab --- /dev/null +++ b/utils/checkUserPerms.js @@ -0,0 +1,10 @@ +const { modRoles } = require('../config.json') +module.exports = interaction => { + const roles = interaction.member.roles.cache.map(r => r.id) + if ( + roles.some(id => modRoles.includes(id)) || + interaction.member.permissions.has('ADMINISTRATOR') + ) + return true + return false +} diff --git a/utils/deploy.js b/utils/deploy.js new file mode 100644 index 0000000..b83f2fe --- /dev/null +++ b/utils/deploy.js @@ -0,0 +1,40 @@ +const sleep = require('./sleep') + +module.exports = id => { + const fs = require('fs') + const crypto = require('crypto') + const { REST } = require('@discordjs/rest') + const { Routes } = require('discord-api-types/v9') + const { guildId, token } = require('../config.json') + + const commands = [] + const commandFiles = fs + .readdirSync('./commands') + .filter(file => file.endsWith('.js')) + + for (const file of commandFiles) { + const command = require(`../commands/${file}`) + commands.push(command.data.toJSON()) + } + const commandsHash = crypto + .createHash('sha256') + .update(JSON.stringify(commands)) + .digest('hex') + if (!fs.existsSync('./databases/commandsHash.txt')) + fs.writeFileSync('./databases/commandsHash.txt', '') + if (fs.readFileSync('./databases/commandsHash.txt', 'utf-8') === commandsHash) + return + fs.writeFileSync('./databases/commandsHash.txt', commandsHash) + + const rest = new REST({ version: '9' }).setToken(token) + + rest + .put(Routes.applicationGuildCommands(id, guildId), { body: commands }) + .then(() => + // so it doesn't interfere with the console animation + sleep(1000).then(() => + console.log('Successfully updated guild commands.') + ) + ) + .catch(console.error) +} diff --git a/utils/directMessage.js b/utils/directMessage.js new file mode 100644 index 0000000..cd365a0 --- /dev/null +++ b/utils/directMessage.js @@ -0,0 +1,53 @@ +module.exports = async (guild, target, type, info) => { + const { + customization: { accent, colors }, + channels: { logs } + } = require('../config.json') + const template = { + title: '', + fields: [ + { + name: 'Reason', + value: info.reason || 'N/A' + }, + { + name: 'Moderator', + value: `<@${info.moderator?.id}>` + } + ] + } + const types = { + ban: () => { + const embed = JSON.parse(JSON.stringify(template)) + embed.title = `You have been banned in ${guild.name}!` + embed.color = colors.bad || '#f45450' + return embed + }, + kick: () => { + const embed = JSON.parse(JSON.stringify(template)) + embed.title = `You have been kicked from ${guild.name}!` + embed.color = colors.bad || '#f45450' + return embed + }, + timeout: () => { + const embed = JSON.parse(JSON.stringify(template)) + embed.title = `You have been timed out in ${guild.name}!` + embed.color = colors.medium || '#fdbc40' + embed.fields.splice(1, 0, { + name: 'Duration', + value: info.duration + }) + return embed + }, + untimeout: () => { + const embed = JSON.parse(JSON.stringify(template)) + embed.title = `Your timeout has been removed in ${guild.name}!` + embed.color = colors.good || '#36c84b' + return embed + } + } + const embed = types[type] + if (!embed) return + const dm = await target.send({ embeds: [embed()] }).catch(() => null) + return dm !== null ? true : false +} diff --git a/utils/log.js b/utils/log.js new file mode 100644 index 0000000..54f4bfd --- /dev/null +++ b/utils/log.js @@ -0,0 +1,170 @@ +module.exports = (guild, type, info) => { + const { + customization: { accent, colors }, + channels: { logs } + } = require('../config.json') + const templates = { + moderate: { + title: '', + fields: [ + { + name: 'User', + value: `<@${info.target?.id}>` + }, + { + name: 'Reason', + value: info.reason || 'N/A' + }, + { + name: 'Responsible Moderator', + value: `<@${info.moderator?.id}>` + }, + { + name: 'Time', + value: `\n` + } + ] + }, + channel: { + title: '', + fields: [ + { + name: 'Channel', + value: `<#${info.channel?.id}>` + }, + { + name: 'Responsible Moderator', + value: `<@${info.moderator?.id}>` + }, + { + name: 'Time', + value: `\n` + } + ] + }, + message: { + title: '', + fields: [ + { + name: 'User', + value: `<@${info.target?.id}>` + }, + { + name: 'Message', + value: info.content + }, + { + name: 'Channel', + value: `<#${info.channel?.id}>` + }, + { + name: 'Time', + value: `\n` + } + ] + } + } + const types = { + ban: () => { + const embed = JSON.parse(JSON.stringify(templates.moderate)) + embed.title = `Banned ${info.target.tag}` + embed.color = colors.bad || '#f45450' + return embed + }, + unban: () => { + const embed = JSON.parse(JSON.stringify(templates.moderate)) + embed.title = `Unbanned ${info.target.tag}` + embed.color = colors.good || '#36c84b' + return embed + }, + kick: () => { + const embed = JSON.parse(JSON.stringify(templates.moderate)) + embed.title = `Kicked ${info.target.tag}` + embed.color = colors.bad || '#f45450' + return embed + }, + timeout: () => { + const embed = JSON.parse(JSON.stringify(templates.moderate)) + embed.title = `Timed out ${info.target.tag}` + embed.color = colors.medium || '#fdbc40' + embed.fields.splice(2, 0, { + name: 'Duration', + value: `${info.duration}` + }) + return embed + }, + untimeout: () => { + const embed = JSON.parse(JSON.stringify(templates.moderate)) + embed.title = `Removed timeout for ${info.target.tag}` + embed.color = colors.good || '#36c84b' + return embed + }, + messageDelete: () => { + const embed = JSON.parse(JSON.stringify(templates.message)) + embed.title = `Message deleted by ${ + info.moderator ? 'moderator' : 'user' + }` + embed.color = colors.bad || '#f45450' + if (info.moderator) + embed.fields.splice(2, 0, { + name: 'Responsible Moderator', + value: `<@${info.moderator.id}>` + }) + return embed + }, + messageEdit: () => { + const embed = JSON.parse(JSON.stringify(templates.message)) + embed.title = 'Message edited' + embed.color = colors.medium || '#fdbc40' + embed.fields.splice(1, 0, { + name: 'Old Message', + value: info.oldMessage + }) + return embed + }, + purge: () => { + const embed = JSON.parse(JSON.stringify(templates.channel)) + embed.title = `Purged ${info.amount} message${ + info.amount === 1 ? '' : 's' + }${info.target ? ` by ${info.target.tag}` : ''}` + embed.color = colors.medium || '#fdbc40' + if (info.target) + embed.fields.splice(0, 0, { + name: 'User', + value: `<@${info.target.id}>` + }) + return embed + }, + lock: () => { + const embed = JSON.parse(JSON.stringify(templates.channel)) + embed.title = `Locked #${info.channel.name}` + embed.color = colors.medium || '#fdbc40' + return embed + }, + unlock: () => { + const embed = JSON.parse(JSON.stringify(templates.channel)) + embed.title = `Unlocked #${info.channel.name}` + embed.color = colors.good || '#36c84b' + return embed + }, + phish: () => { + const embed = JSON.parse(JSON.stringify(templates.message)) + embed.title = `Deleted phishing site by ${info.target.tag}` + embed.color = colors.bad || '#f45450' + embed.fields.splice(3, 0, { + name: 'Harmful Site', + value: info.site + }) + return embed + } + } + const embed = types[type] + if (!embed) return + guild.channels.cache.get(logs).send({ embeds: [embed()] }) +} diff --git a/utils/moderation.js b/utils/moderation.js new file mode 100644 index 0000000..8134f92 --- /dev/null +++ b/utils/moderation.js @@ -0,0 +1,80 @@ +const log = require('./log') + +// unused for now, don't look + +async function ban(target, reason, deleteMessages) { + if (!target.bannable) return 'that user is not bannable!' + const ban = await target + .ban(target, { days: deleteMessages, reason: reason }) + .catch(() => false) + if (ban == false) return 'I could not ban that user!' + return true +} + +async function unban(guild, target, reason) { + const bans = await guild.bans.fetch() + if (!bans.has(target.id)) return 'that user is not banned!' + const unban = await guild.members.unban(target, reason).catch(() => false) + if (unban == false) return 'an unknown error occurred!' + return true +} + +async function kick(target, reason) { + if (!target.kickable) return 'that user is not kickable!' + const kick = await target.kick(reason).catch(() => false) + if (kick == false) return 'an unknown error occurred!' + return true +} + +async function timeout(target, reason, duration) { + if (!target.moderatable) return 'that user is not moderatable!' + const timeout = await target.timeout(duration, reason).catch(() => false) + if (timeout == false) return 'an unknown error occurred!' + return true +} + +async function untimeout(target, reason) { + if (!target.moderatable) return 'that user is not moderatable!' + const untimeout = await target.timeout(null, reason).catch(() => false) + if (untimeout == false) return 'an unknown error occurred!' + return true +} + +async function purge(channel, amount, reason, target) { + if (!channel.manageable) return 'that channel is not manageable!' + let messages = await channel.messages + .fetch({ limit: amount }, { cache: false, force: true }) + .catch(() => false) + if (target) messages = messages.filter(m => m.author.id == target.id) + if (messages == false) return 'an unknown error occurred!' + if (messages.size == 0) return 'there are no messages to purge!' + const purge = channel.bulkDelete(messages, reason).catch(() => false) + if (purge == false) return 'an unknown error occurred!' + return true +} + +module.exports = { + checkBotPerms: interaction => { + return require('./checkBotPerms')(interaction) + }, + checkUserPerms: interaction => { + return require('./checkUserPerms')(interaction) + }, + moderate: (moderator, target, reason, type, options) => { + let = true + if (type == 'ban') { + const result = ban(target, reason, options.deleteMessages) + if (result !== true) su + } else if (type == 'kick') { + const result = kick(target, reason) + } else if (type == 'timeout') { + const result = timeout(target, reason, options.duration) + } + log(moderator.guild, type, { + moderator, + reason, + target + }) + }, + unmoderate: (moderator, target, reason, type) => {} +} diff --git a/utils/packagejson.js b/utils/packagejson.js new file mode 100644 index 0000000..8b60489 --- /dev/null +++ b/utils/packagejson.js @@ -0,0 +1,25 @@ +const fs = require('fs') + +function readPackage() { + return JSON.parse(fs.readFileSync('./package.json')) +} + +function getAllDependencies() { + const deps = Object.entries(readPackage().dependencies) + return deps.map(d => ({ + name: d[0], + version: d[1].replace('^', '') + })) +} + +module.exports = { + getDependency: name => { + const all = getAllDependencies() + const found = all.find(d => d.name === name) + if (!found) return null + return found + }, + getVersion: () => { + return readPackage().version + } +} diff --git a/utils/sleep.js b/utils/sleep.js new file mode 100644 index 0000000..50bb37c --- /dev/null +++ b/utils/sleep.js @@ -0,0 +1 @@ +module.exports = ms => new Promise(r => setTimeout(r, ms))