├── .gitignore ├── README.md ├── config.json ├── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # staff-application 2 | A discord bot for staff application using modal 3 | 4 | 5 | ## Setup 6 | 7 | **Create `.env` file and use variables blow** 8 | ```bash 9 | TOKEN=YOUR_DISCORD_TOKEN 10 | ``` 11 | 12 | **Config:** 13 |
14 | `admins` - users ids to allow to use `!send` command that sent embed with apply button. 15 |
16 | `submitChannel` - channel id for all submitted forms sent to 17 |
18 | `embedChannel` - channel if for apply button sent to 19 |
20 | `staffRoles` - roles ids to add to the member after accepting him 21 | 22 | **Example config:** 23 | ```json 24 | { 25 | "admins": ["596227913209217024"], 26 | "submitChannel": "", 27 | "embedChannel": "", 28 | "staffRoles": ["899989194884153344", "899987560808452146"] 29 | } 30 | ``` 31 | 32 | ## 🖼 Images 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "admins": ["596227913209217024"], 3 | "submitChannel": "960942616667648052", 4 | "embedChannel": "", 5 | "staffRoles": ["899989194884153344", "899987560808452146"] 6 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { 2 | Client, 3 | EmbedBuilder, 4 | ActionRowBuilder, 5 | ButtonBuilder, 6 | ButtonStyle, 7 | ModalBuilder, 8 | TextInputStyle, 9 | TextInputBuilder 10 | } = require('discord.js'); 11 | const client = new Client({ intents: ['Guilds', 'MessageContent', 'GuildMessages'] }); 12 | const config = require('./config.json'); 13 | require('dotenv').config(); 14 | 15 | client.on('ready', () => { 16 | console.log(`Logged in as ${client.user.tag}`); 17 | }) 18 | 19 | client.on('messageCreate', (message) => { 20 | if (message.content === '!send') { 21 | if (!config.admins.includes(message.author.id)) return; 22 | const embed = new EmbedBuilder() 23 | .setTitle('Apply for Staff') 24 | .setDescription('Click the button blow to apply for staff') 25 | .setColor('Red') 26 | const row = new ActionRowBuilder() 27 | .addComponents( 28 | new ButtonBuilder() 29 | .setStyle(ButtonStyle.Success) 30 | .setLabel('Apply') 31 | .setCustomId('apply') 32 | ) 33 | const channel = message.guild.channels.cache.get(config.embedChannel); 34 | if (!channel) return; 35 | channel.send({ 36 | embeds: [embed], 37 | components: [row] 38 | }) 39 | } 40 | }) 41 | 42 | client.on('interactionCreate', async (interaction) => { 43 | if (interaction.isButton()) { 44 | // show modal 45 | if (interaction.customId === 'apply') { 46 | const modal = new ModalBuilder() 47 | .setTitle('Staff Application') 48 | .setCustomId('staff_apply') 49 | 50 | const nameComponent = new TextInputBuilder() 51 | .setCustomId('staff_name') 52 | .setLabel("What's your name") 53 | .setMinLength(2) 54 | .setMaxLength(25) 55 | .setRequired(true) 56 | .setPlaceholder('Ahmed') 57 | .setStyle(TextInputStyle.Short) 58 | 59 | const ageComponent = new TextInputBuilder() 60 | .setCustomId('staff_age') 61 | .setLabel("Your age") 62 | .setMinLength(1) 63 | .setMaxLength(3) 64 | .setStyle(TextInputStyle.Short) 65 | .setPlaceholder('18') 66 | .setRequired(true) 67 | 68 | const whyYou = new TextInputBuilder() 69 | .setCustomId('staff_why_you') 70 | .setLabel("Why you should be staff here") 71 | .setMinLength(10) 72 | .setMaxLength(120) 73 | .setStyle(TextInputStyle.Paragraph) 74 | .setPlaceholder(`Tell us the reason for wanting to be staff in ${interaction.guild.name}`) 75 | .setRequired(true) 76 | 77 | const rows = [nameComponent, ageComponent, whyYou].map( 78 | (component) => new ActionRowBuilder().addComponents(component) 79 | ) 80 | 81 | modal.addComponents(...rows); 82 | interaction.showModal(modal); 83 | // end of modal 84 | } 85 | 86 | // Accept and deny buttons 87 | if (interaction.customId === 'staff_accept') { 88 | // TODO: save user id in json or sum instead of getting id from embed footer 89 | const getIdFromFooter = interaction.message.embeds[0].footer.text; 90 | const getMember = await interaction.guild.members.fetch(getIdFromFooter); 91 | await getMember.roles.add(config.staffRoles).catch((err) => { 92 | console.error(err) 93 | return interaction.reply({ 94 | content: ":x: There was an error when a try to add roles for the user." 95 | }) 96 | }); 97 | interaction.reply({ 98 | content: `✅ Added roles for **${getMember.user.tag}**, Accepted by ${interaction.user.tag}` 99 | }) 100 | await getMember.send({ 101 | content: `Hey ${getMember.user.tag}, You have been accepted for staff application. 🎉 **congratulations** 🎉` 102 | }).catch(() => { 103 | return interaction.message.reply(':x: There was an error when i try to send message to the user.') 104 | }) 105 | const newDisabledRow = new ActionRowBuilder() 106 | .setComponents( 107 | new ButtonBuilder() 108 | .setCustomId('staff_accept_ended') 109 | .setDisabled() 110 | .setStyle(ButtonStyle.Success) 111 | .setLabel('Accept') 112 | ) 113 | .addComponents( 114 | new ButtonBuilder() 115 | .setCustomId('staff_deny_ended') 116 | .setDisabled() 117 | .setStyle(ButtonStyle.Danger) 118 | .setLabel('Deny') 119 | ) 120 | interaction.message.edit({ components: [newDisabledRow] }) 121 | } 122 | if (interaction.customId === 'staff_deny') { 123 | // TODO: save user id in json or sum instead of getting id from embed footer 124 | const getIdFromFooter = interaction.message.embeds[0].footer?.text; 125 | const getMember = await interaction.guild.members.fetch(getIdFromFooter); 126 | await getMember.send({ 127 | content: `Hey ${getMember.user.tag} sorry you have been rejected for staff application.` 128 | }).catch(e => {}) 129 | interaction.reply({ 130 | content: `:x: ${getMember.user.tag} has been rejected by ${interaction.user.tag}.` 131 | }) 132 | const newDisabledRow = new ActionRowBuilder() 133 | .setComponents( 134 | new ButtonBuilder() 135 | .setCustomId('staff_accept_ended') 136 | .setDisabled() 137 | .setStyle(ButtonStyle.Success) 138 | .setLabel('Accept') 139 | ) 140 | .addComponents( 141 | new ButtonBuilder() 142 | .setCustomId('staff_deny_ended') 143 | .setDisabled() 144 | .setStyle(ButtonStyle.Danger) 145 | .setLabel('Deny') 146 | ) 147 | interaction.message.edit({ components: [newDisabledRow] }) 148 | } 149 | } 150 | if (interaction.isModalSubmit()) { 151 | if (interaction.customId === 'staff_apply') { 152 | const staffName = interaction.fields.getTextInputValue('staff_name'); 153 | const staffAge = interaction.fields.getTextInputValue('staff_age'); 154 | const staffWhyYou = interaction.fields.getTextInputValue('staff_why_you'); 155 | if (isNaN(staffAge)) { 156 | return interaction.reply({ 157 | content: ":x: Your age must be a number, please resend the form.", 158 | ephemeral: true 159 | }) 160 | } 161 | if (!isNaN(staffName)) { 162 | return interaction.reply({ 163 | content: ":x: Your name must not includes a number.", 164 | ephemeral: true 165 | }) 166 | } 167 | interaction.reply({ 168 | content: '✅ Your staff application has been submit successfully.', 169 | ephemeral: true 170 | }) 171 | const staffSubmitChannel = interaction.guild.channels.cache.get(config.submitChannel); 172 | if (!staffSubmitChannel) return; 173 | const embed = new EmbedBuilder() 174 | .setAuthor({ name: interaction.user.tag, iconURL: interaction.user.displayAvatarURL() }) 175 | .setColor('Blue') 176 | .setTimestamp() 177 | .setFooter({ text: interaction.user.id }) 178 | .setThumbnail(interaction.user.displayAvatarURL()) 179 | .addFields( 180 | { 181 | name: "Name:", 182 | value: staffName 183 | }, 184 | { 185 | name: "Age:", 186 | value: staffAge 187 | }, 188 | { 189 | name: "Why you should be staff here:", 190 | value: staffWhyYou 191 | } 192 | ) 193 | const row = new ActionRowBuilder() 194 | .addComponents( 195 | new ButtonBuilder() 196 | .setCustomId('staff_accept') 197 | .setLabel('Accept') 198 | .setStyle(ButtonStyle.Success) 199 | ) 200 | .addComponents( 201 | new ButtonBuilder() 202 | .setCustomId('staff_deny') 203 | .setLabel('Deny') 204 | .setStyle(ButtonStyle.Danger) 205 | ) 206 | staffSubmitChannel.send({ 207 | embeds: [embed], 208 | components: [row] 209 | }) 210 | } 211 | } 212 | }) 213 | 214 | client.login(process.env.TOKEN); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "staff-application", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "1.0.0", 9 | "license": "ISC", 10 | "dependencies": { 11 | "discord.js": "^14.0.0-dev.1649160496-402514f", 12 | "dotenv": "^16.0.0" 13 | } 14 | }, 15 | "node_modules/@discordjs/builders": { 16 | "version": "0.13.0-dev.1649160523-402514f", 17 | "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.13.0-dev.1649160523-402514f.tgz", 18 | "integrity": "sha512-10yl4OIa0YE8tVYdCunbU374HW8X2gqkxwJaWGXjJbqmyWCvbgvxQwHYPhjvEgda8NMAoQyafHVpTAFjbttU4Q==", 19 | "dependencies": { 20 | "@sindresorhus/is": "^4.4.0", 21 | "discord-api-types": "^0.29.0", 22 | "fast-deep-equal": "^3.1.3", 23 | "ts-mixer": "^6.0.0", 24 | "tslib": "^2.3.1", 25 | "zod": "^3.11.6" 26 | }, 27 | "engines": { 28 | "node": ">=16.9.0" 29 | } 30 | }, 31 | "node_modules/@discordjs/collection": { 32 | "version": "0.6.0-dev.1649160495-402514f", 33 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.6.0-dev.1649160495-402514f.tgz", 34 | "integrity": "sha512-AIoWLKLB6SZXojB0oiWMfCmrKFwzmCYWa2DEEcZzo3hMTDd13Vxi30WCuXnqriG7tmYdvDEf3E9r3Z5kdm/igQ==", 35 | "engines": { 36 | "node": ">=16.9.0" 37 | } 38 | }, 39 | "node_modules/@discordjs/rest": { 40 | "version": "0.4.0-dev.1649160494-402514f", 41 | "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.4.0-dev.1649160494-402514f.tgz", 42 | "integrity": "sha512-9ST4gpRO1bRjHo3CivKqjkEKjRJIa1rJI9Q/DDZlanMgGfNjXlJzJ4RCBaiZpXUwCvllPO/YF/kYM3vc5Ys5Ag==", 43 | "dependencies": { 44 | "@discordjs/collection": "^0.6.0-dev", 45 | "@sapphire/async-queue": "^1.2.0", 46 | "@sapphire/snowflake": "^3.1.0", 47 | "@types/node-fetch": "^2.5.12", 48 | "discord-api-types": "^0.29.0", 49 | "form-data": "^4.0.0", 50 | "node-fetch": "^2.6.7", 51 | "tslib": "^2.3.1" 52 | }, 53 | "engines": { 54 | "node": ">=16.9.0" 55 | } 56 | }, 57 | "node_modules/@sapphire/async-queue": { 58 | "version": "1.3.1", 59 | "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", 60 | "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==", 61 | "engines": { 62 | "node": ">=v14.0.0", 63 | "npm": ">=7.0.0" 64 | } 65 | }, 66 | "node_modules/@sapphire/snowflake": { 67 | "version": "3.2.1", 68 | "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.1.tgz", 69 | "integrity": "sha512-vmZq1I6J6iNRQVXP+N9HzOMOY4ORB3MunoFeWCw/aBnZTf1cDgDvP0RZFQS53B1TN95AIgFY9T+ItQ/fWAUYWQ==", 70 | "engines": { 71 | "node": ">=v14.0.0", 72 | "npm": ">=7.0.0" 73 | } 74 | }, 75 | "node_modules/@sindresorhus/is": { 76 | "version": "4.6.0", 77 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 78 | "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 79 | "engines": { 80 | "node": ">=10" 81 | }, 82 | "funding": { 83 | "url": "https://github.com/sindresorhus/is?sponsor=1" 84 | } 85 | }, 86 | "node_modules/@types/node": { 87 | "version": "17.0.23", 88 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 89 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" 90 | }, 91 | "node_modules/@types/node-fetch": { 92 | "version": "2.6.1", 93 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 94 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 95 | "dependencies": { 96 | "@types/node": "*", 97 | "form-data": "^3.0.0" 98 | } 99 | }, 100 | "node_modules/@types/node-fetch/node_modules/form-data": { 101 | "version": "3.0.1", 102 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 103 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 104 | "dependencies": { 105 | "asynckit": "^0.4.0", 106 | "combined-stream": "^1.0.8", 107 | "mime-types": "^2.1.12" 108 | }, 109 | "engines": { 110 | "node": ">= 6" 111 | } 112 | }, 113 | "node_modules/@types/ws": { 114 | "version": "8.5.3", 115 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", 116 | "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", 117 | "dependencies": { 118 | "@types/node": "*" 119 | } 120 | }, 121 | "node_modules/asynckit": { 122 | "version": "0.4.0", 123 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 124 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 125 | }, 126 | "node_modules/combined-stream": { 127 | "version": "1.0.8", 128 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 129 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 130 | "dependencies": { 131 | "delayed-stream": "~1.0.0" 132 | }, 133 | "engines": { 134 | "node": ">= 0.8" 135 | } 136 | }, 137 | "node_modules/delayed-stream": { 138 | "version": "1.0.0", 139 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 140 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 141 | "engines": { 142 | "node": ">=0.4.0" 143 | } 144 | }, 145 | "node_modules/discord-api-types": { 146 | "version": "0.29.0", 147 | "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.29.0.tgz", 148 | "integrity": "sha512-Ekq1ICNpOTVajXKZguNFrsDeTmam+ZeA38txsNLZnANdXUjU6QBPIZLUQTC6MzigFGb0Tt8vk4xLnXmzv0shNg==" 149 | }, 150 | "node_modules/discord.js": { 151 | "version": "14.0.0-dev.1649160496-402514f", 152 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.0.0-dev.1649160496-402514f.tgz", 153 | "integrity": "sha512-aG+r+3j+YHvQqjzu0o4Y6/dJIBt2yTNrNTu57u+QD498xloaZ6tk9e3J6WoeeCLyM97cgevoDva9DEHtgQlKgQ==", 154 | "dependencies": { 155 | "@discordjs/builders": "^0.13.0-dev", 156 | "@discordjs/collection": "^0.6.0-dev", 157 | "@discordjs/rest": "^0.4.0-dev", 158 | "@sapphire/snowflake": "^3.1.0", 159 | "@types/ws": "^8.2.2", 160 | "discord-api-types": "^0.29.0", 161 | "fast-deep-equal": "^3.1.3", 162 | "lodash.snakecase": "^4.1.1", 163 | "undici": "^4.14.1", 164 | "ws": "^8.5.0" 165 | }, 166 | "engines": { 167 | "node": ">=16.9.0" 168 | } 169 | }, 170 | "node_modules/dotenv": { 171 | "version": "16.0.0", 172 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", 173 | "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", 174 | "engines": { 175 | "node": ">=12" 176 | } 177 | }, 178 | "node_modules/fast-deep-equal": { 179 | "version": "3.1.3", 180 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 181 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 182 | }, 183 | "node_modules/form-data": { 184 | "version": "4.0.0", 185 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 186 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 187 | "dependencies": { 188 | "asynckit": "^0.4.0", 189 | "combined-stream": "^1.0.8", 190 | "mime-types": "^2.1.12" 191 | }, 192 | "engines": { 193 | "node": ">= 6" 194 | } 195 | }, 196 | "node_modules/lodash.snakecase": { 197 | "version": "4.1.1", 198 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 199 | "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" 200 | }, 201 | "node_modules/mime-db": { 202 | "version": "1.52.0", 203 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 204 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 205 | "engines": { 206 | "node": ">= 0.6" 207 | } 208 | }, 209 | "node_modules/mime-types": { 210 | "version": "2.1.35", 211 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 212 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 213 | "dependencies": { 214 | "mime-db": "1.52.0" 215 | }, 216 | "engines": { 217 | "node": ">= 0.6" 218 | } 219 | }, 220 | "node_modules/node-fetch": { 221 | "version": "2.6.7", 222 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 223 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 224 | "dependencies": { 225 | "whatwg-url": "^5.0.0" 226 | }, 227 | "engines": { 228 | "node": "4.x || >=6.0.0" 229 | }, 230 | "peerDependencies": { 231 | "encoding": "^0.1.0" 232 | }, 233 | "peerDependenciesMeta": { 234 | "encoding": { 235 | "optional": true 236 | } 237 | } 238 | }, 239 | "node_modules/tr46": { 240 | "version": "0.0.3", 241 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 242 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 243 | }, 244 | "node_modules/ts-mixer": { 245 | "version": "6.0.1", 246 | "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", 247 | "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" 248 | }, 249 | "node_modules/tslib": { 250 | "version": "2.3.1", 251 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 252 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 253 | }, 254 | "node_modules/undici": { 255 | "version": "4.16.0", 256 | "resolved": "https://registry.npmjs.org/undici/-/undici-4.16.0.tgz", 257 | "integrity": "sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw==", 258 | "engines": { 259 | "node": ">=12.18" 260 | } 261 | }, 262 | "node_modules/webidl-conversions": { 263 | "version": "3.0.1", 264 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 265 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 266 | }, 267 | "node_modules/whatwg-url": { 268 | "version": "5.0.0", 269 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 270 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 271 | "dependencies": { 272 | "tr46": "~0.0.3", 273 | "webidl-conversions": "^3.0.0" 274 | } 275 | }, 276 | "node_modules/ws": { 277 | "version": "8.5.0", 278 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 279 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 280 | "engines": { 281 | "node": ">=10.0.0" 282 | }, 283 | "peerDependencies": { 284 | "bufferutil": "^4.0.1", 285 | "utf-8-validate": "^5.0.2" 286 | }, 287 | "peerDependenciesMeta": { 288 | "bufferutil": { 289 | "optional": true 290 | }, 291 | "utf-8-validate": { 292 | "optional": true 293 | } 294 | } 295 | }, 296 | "node_modules/zod": { 297 | "version": "3.14.4", 298 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.4.tgz", 299 | "integrity": "sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw==", 300 | "funding": { 301 | "url": "https://github.com/sponsors/colinhacks" 302 | } 303 | } 304 | }, 305 | "dependencies": { 306 | "@discordjs/builders": { 307 | "version": "0.13.0-dev.1649160523-402514f", 308 | "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.13.0-dev.1649160523-402514f.tgz", 309 | "integrity": "sha512-10yl4OIa0YE8tVYdCunbU374HW8X2gqkxwJaWGXjJbqmyWCvbgvxQwHYPhjvEgda8NMAoQyafHVpTAFjbttU4Q==", 310 | "requires": { 311 | "@sindresorhus/is": "^4.4.0", 312 | "discord-api-types": "^0.29.0", 313 | "fast-deep-equal": "^3.1.3", 314 | "ts-mixer": "^6.0.0", 315 | "tslib": "^2.3.1", 316 | "zod": "^3.11.6" 317 | } 318 | }, 319 | "@discordjs/collection": { 320 | "version": "0.6.0-dev.1649160495-402514f", 321 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.6.0-dev.1649160495-402514f.tgz", 322 | "integrity": "sha512-AIoWLKLB6SZXojB0oiWMfCmrKFwzmCYWa2DEEcZzo3hMTDd13Vxi30WCuXnqriG7tmYdvDEf3E9r3Z5kdm/igQ==" 323 | }, 324 | "@discordjs/rest": { 325 | "version": "0.4.0-dev.1649160494-402514f", 326 | "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.4.0-dev.1649160494-402514f.tgz", 327 | "integrity": "sha512-9ST4gpRO1bRjHo3CivKqjkEKjRJIa1rJI9Q/DDZlanMgGfNjXlJzJ4RCBaiZpXUwCvllPO/YF/kYM3vc5Ys5Ag==", 328 | "requires": { 329 | "@discordjs/collection": "^0.6.0-dev", 330 | "@sapphire/async-queue": "^1.2.0", 331 | "@sapphire/snowflake": "^3.1.0", 332 | "@types/node-fetch": "^2.5.12", 333 | "discord-api-types": "^0.29.0", 334 | "form-data": "^4.0.0", 335 | "node-fetch": "^2.6.7", 336 | "tslib": "^2.3.1" 337 | } 338 | }, 339 | "@sapphire/async-queue": { 340 | "version": "1.3.1", 341 | "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", 342 | "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==" 343 | }, 344 | "@sapphire/snowflake": { 345 | "version": "3.2.1", 346 | "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.1.tgz", 347 | "integrity": "sha512-vmZq1I6J6iNRQVXP+N9HzOMOY4ORB3MunoFeWCw/aBnZTf1cDgDvP0RZFQS53B1TN95AIgFY9T+ItQ/fWAUYWQ==" 348 | }, 349 | "@sindresorhus/is": { 350 | "version": "4.6.0", 351 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 352 | "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" 353 | }, 354 | "@types/node": { 355 | "version": "17.0.23", 356 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 357 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" 358 | }, 359 | "@types/node-fetch": { 360 | "version": "2.6.1", 361 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 362 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 363 | "requires": { 364 | "@types/node": "*", 365 | "form-data": "^3.0.0" 366 | }, 367 | "dependencies": { 368 | "form-data": { 369 | "version": "3.0.1", 370 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 371 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 372 | "requires": { 373 | "asynckit": "^0.4.0", 374 | "combined-stream": "^1.0.8", 375 | "mime-types": "^2.1.12" 376 | } 377 | } 378 | } 379 | }, 380 | "@types/ws": { 381 | "version": "8.5.3", 382 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", 383 | "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", 384 | "requires": { 385 | "@types/node": "*" 386 | } 387 | }, 388 | "asynckit": { 389 | "version": "0.4.0", 390 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 391 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 392 | }, 393 | "combined-stream": { 394 | "version": "1.0.8", 395 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 396 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 397 | "requires": { 398 | "delayed-stream": "~1.0.0" 399 | } 400 | }, 401 | "delayed-stream": { 402 | "version": "1.0.0", 403 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 404 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 405 | }, 406 | "discord-api-types": { 407 | "version": "0.29.0", 408 | "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.29.0.tgz", 409 | "integrity": "sha512-Ekq1ICNpOTVajXKZguNFrsDeTmam+ZeA38txsNLZnANdXUjU6QBPIZLUQTC6MzigFGb0Tt8vk4xLnXmzv0shNg==" 410 | }, 411 | "discord.js": { 412 | "version": "14.0.0-dev.1649160496-402514f", 413 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.0.0-dev.1649160496-402514f.tgz", 414 | "integrity": "sha512-aG+r+3j+YHvQqjzu0o4Y6/dJIBt2yTNrNTu57u+QD498xloaZ6tk9e3J6WoeeCLyM97cgevoDva9DEHtgQlKgQ==", 415 | "requires": { 416 | "@discordjs/builders": "^0.13.0-dev", 417 | "@discordjs/collection": "^0.6.0-dev", 418 | "@discordjs/rest": "^0.4.0-dev", 419 | "@sapphire/snowflake": "^3.1.0", 420 | "@types/ws": "^8.2.2", 421 | "discord-api-types": "^0.29.0", 422 | "fast-deep-equal": "^3.1.3", 423 | "lodash.snakecase": "^4.1.1", 424 | "undici": "^4.14.1", 425 | "ws": "^8.5.0" 426 | } 427 | }, 428 | "dotenv": { 429 | "version": "16.0.0", 430 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", 431 | "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" 432 | }, 433 | "fast-deep-equal": { 434 | "version": "3.1.3", 435 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 436 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 437 | }, 438 | "form-data": { 439 | "version": "4.0.0", 440 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 441 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 442 | "requires": { 443 | "asynckit": "^0.4.0", 444 | "combined-stream": "^1.0.8", 445 | "mime-types": "^2.1.12" 446 | } 447 | }, 448 | "lodash.snakecase": { 449 | "version": "4.1.1", 450 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 451 | "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" 452 | }, 453 | "mime-db": { 454 | "version": "1.52.0", 455 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 456 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 457 | }, 458 | "mime-types": { 459 | "version": "2.1.35", 460 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 461 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 462 | "requires": { 463 | "mime-db": "1.52.0" 464 | } 465 | }, 466 | "node-fetch": { 467 | "version": "2.6.7", 468 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 469 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 470 | "requires": { 471 | "whatwg-url": "^5.0.0" 472 | } 473 | }, 474 | "tr46": { 475 | "version": "0.0.3", 476 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 477 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 478 | }, 479 | "ts-mixer": { 480 | "version": "6.0.1", 481 | "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", 482 | "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" 483 | }, 484 | "tslib": { 485 | "version": "2.3.1", 486 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 487 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 488 | }, 489 | "undici": { 490 | "version": "4.16.0", 491 | "resolved": "https://registry.npmjs.org/undici/-/undici-4.16.0.tgz", 492 | "integrity": "sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw==" 493 | }, 494 | "webidl-conversions": { 495 | "version": "3.0.1", 496 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 497 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 498 | }, 499 | "whatwg-url": { 500 | "version": "5.0.0", 501 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 502 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 503 | "requires": { 504 | "tr46": "~0.0.3", 505 | "webidl-conversions": "^3.0.0" 506 | } 507 | }, 508 | "ws": { 509 | "version": "8.5.0", 510 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 511 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 512 | "requires": {} 513 | }, 514 | "zod": { 515 | "version": "3.14.4", 516 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.4.tgz", 517 | "integrity": "sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw==" 518 | } 519 | } 520 | } 521 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "staff-application", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "discord.js": "^14.0.0-dev.1649160496-402514f", 14 | "dotenv": "^16.0.0" 15 | } 16 | } 17 | --------------------------------------------------------------------------------