├── .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 |
--------------------------------------------------------------------------------