├── .gitignore ├── package.json └── src └── bot.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | config 4 | package-lock.json -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "modmail-discord-bot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node ./src/bot.js", 9 | "dev": "nodemon ./src/bot.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/ansonfoong/ModMail-Discord-Bot.git" 14 | }, 15 | "keywords": [], 16 | "author": "Anson Foong", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/ansonfoong/ModMail-Discord-Bot/issues" 20 | }, 21 | "homepage": "https://github.com/ansonfoong/ModMail-Discord-Bot#readme", 22 | "devDependencies": { 23 | "nodemon": "^1.19.4" 24 | }, 25 | "dependencies": { 26 | "discord.js": "github:discordjs/discord.js#master", 27 | "dotenv": "^8.2.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/bot.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const discord = require('discord.js'); 3 | const client = new discord.Client(); 4 | 5 | client.login(process.env.BOT_TOKEN); 6 | 7 | const openedTickets = new Map(); 8 | 9 | client.on('ready', () => console.log(`${client.user.tag}`)); 10 | client.on('message', async (message) => { 11 | if(message.author.bot) return; 12 | if(message.channel.type === 'dm' && !openedTickets.has(message.author.id)) { 13 | // Check the Guilds the Bot and User have in common. 14 | openedTickets.set(message.author.id); 15 | let userId = message.author.id; 16 | var memberGuilds = []; 17 | let user = client.users.get(userId); 18 | client.guilds.forEach(guild => { 19 | guild.members.has(user.id) ? memberGuilds.push(guild) : null 20 | }); 21 | let embed = new discord.MessageEmbed(); 22 | embed.setTitle(`Please choose which server`); 23 | let desc = ''; 24 | memberGuilds.forEach(guild => desc += guild.name + '\n'); 25 | embed.setDescription(`${desc}`); 26 | let msg = await message.channel.send(embed); 27 | let msgFilter = m => m.author.id === message.author.id; 28 | let collected = await msg.channel.awaitMessages(msgFilter, { max: 1 }); 29 | let guild = memberGuilds.find(g => g.name.toLowerCase() === collected.first().content); 30 | openedTickets.set(message.author.id, guild); 31 | message.channel.send("Your message has been received, we will be with you shortly."); 32 | client.emit('modMessage', message, user, guild); 33 | } 34 | }); 35 | 36 | client.on('modMessage', async (message, user, guild) => { 37 | // Find channel for guild... 38 | let channel = guild.channels.find(c => c.name === 'mod-mail'); 39 | let embed = new discord.MessageEmbed(); 40 | embed.setTitle("New Message from: " + user.tag); 41 | embed.addField("Guild", `${guild.name}`); 42 | embed.setDescription(`Message: ${message.content}`); 43 | let msg = await channel.send(embed); 44 | 45 | await msg.react('✅'); 46 | await msg.react('❎'); 47 | 48 | let reactionFilter = (reaction, user) => (reaction.emoji.name === '✅' || reaction.emoji.name === '❎') && !user.bot; 49 | 50 | let collector = new discord.ReactionCollector(msg, reactionFilter, { max: 1 }); 51 | collector.on('end', async collected => { 52 | console.log(collected); 53 | if(collected.first().emoji.name === '✅') { 54 | console.log(guild.id); 55 | let newChannel = await guild.channels.create(`${user.id}-channel`, { 56 | type: 'text', 57 | permissionOverwrites: [ 58 | { 59 | id: guild.id, 60 | deny: ['VIEW_CHANNEL'] 61 | }, 62 | { 63 | id: '533096507667382289', 64 | allow: ['VIEW_CHANNEL'] 65 | } 66 | ] 67 | }).catch(err => console.log(err)); 68 | newChannel.send("Case created for " + user.tag); 69 | let msgFilter = (m) => !m.author.bot; 70 | let messageCollector = newChannel.createMessageCollector(msgFilter); 71 | messageCollector.on('collect', m => { 72 | user.send(m); 73 | }); 74 | messageCollector.on('end', collected => { 75 | console.log('done') 76 | }); 77 | let DMChannelCollector = user.dmChannel.createMessageCollector(msgFilter); 78 | DMChannelCollector.on('collect', m => { 79 | newChannel.send(m); 80 | }); 81 | DMChannelCollector.on('end', c => console.log('done')); 82 | } 83 | else if(collected.first().emoji.name === '❎') { 84 | user.send("Request denied.") 85 | openedTickets.delete(user.id); 86 | } 87 | }); 88 | }); --------------------------------------------------------------------------------