@halpz/fetch 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/README.md +136 -0
  2. package/desktop.ini +6 -0
  3. package/index.js +66 -0
  4. package/package.json +25 -0
  5. package/src/client.js +74 -0
  6. package/src/index.js +69 -0
  7. package/src/processor/Moderator/ban.js +54 -0
  8. package/src/processor/Moderator/bans.js +313 -0
  9. package/src/processor/Moderator/chnick.js +56 -0
  10. package/src/processor/Moderator/chrole.js +62 -0
  11. package/src/processor/Moderator/deafen.js +51 -0
  12. package/src/processor/Moderator/index.js +27 -0
  13. package/src/processor/Moderator/kick.js +56 -0
  14. package/src/processor/Moderator/move.js +53 -0
  15. package/src/processor/Moderator/mute.js +51 -0
  16. package/src/processor/Moderator/timeout.js +77 -0
  17. package/src/processor/Moderator/undeafen.js +51 -0
  18. package/src/processor/Moderator/unmute.js +60 -0
  19. package/src/processor/Moderator/untimeout.js +49 -0
  20. package/src/processor/Music/index.js +18 -0
  21. package/src/processor/Music/join.js +52 -0
  22. package/src/processor/Music/leave.js +46 -0
  23. package/src/processor/Music/nplay.js +51 -0
  24. package/src/processor/Music/pause.js +53 -0
  25. package/src/processor/Music/play.js +116 -0
  26. package/src/processor/Music/queue.js +220 -0
  27. package/src/processor/Music/resume.js +53 -0
  28. package/src/processor/Music/setloop.js +35 -0
  29. package/src/processor/Music/shuffle.js +26 -0
  30. package/src/processor/Music/skip.js +64 -0
  31. package/src/processor/Music/stop.js +38 -0
  32. package/src/processor/Music/support/__add_to_queue__.js +236 -0
  33. package/src/processor/Music/support/playing.js +1 -0
  34. package/src/processor/Music/support/update.js +159 -0
  35. package/src/processor/Ultility/chat.js +45 -0
  36. package/src/processor/Ultility/index.js +7 -0
  37. package/src/processor/Ultility/ping.js +26 -0
  38. package/src/processor/Ultility/status.js +85 -0
  39. package/test/Commands/Moderator.js +464 -0
  40. package/test/Commands/Music.js +166 -0
  41. package/test/Commands/Ultility.js +327 -0
  42. package/test/Commands/test/test.js +50 -0
  43. package/test/index.js +126 -0
@@ -0,0 +1,220 @@
1
+ const { CommandInteraction } = require('discord.js');
2
+ const { useQueue, useMainPlayer } = require('discord-player')
3
+ const _ = require('lodash')
4
+ const playing = require('./support/playing')
5
+ const { update_component, update_embed } = require('./support/update')
6
+
7
+ module.exports = see_queue
8
+
9
+ /**
10
+ *
11
+ * all activities:
12
+ *
13
+ * - See queue | Supported ✅
14
+ * - Delete track(s) | Supported ✅
15
+ * - Skip to track | Supported ✅
16
+ * @param {CommandInteraction} interaction
17
+ */
18
+
19
+ async function see_queue(client, interaction) {
20
+
21
+ var user;
22
+ if (interaction.deferred) {
23
+ user = interaction.user;
24
+ }
25
+ else {
26
+ user = interaction.author
27
+ }
28
+
29
+ var embeds = await update_embed(client, interaction);
30
+
31
+ var curr_page = 0;
32
+ var max_page = embeds.length - 1;
33
+
34
+ var view = await update_component(curr_page, max_page, embeds);
35
+
36
+ var response = (interaction.deferred)
37
+
38
+ ? await interaction.followUp({
39
+ embeds: [embeds[curr_page]],
40
+ components: view,
41
+ })
42
+ : await interaction.reply({
43
+ embeds: [embeds[curr_page]],
44
+ components: view,
45
+ });
46
+
47
+ while (true) {
48
+ const collectorFilter = i => i.user.id === user.id;
49
+ try {
50
+ const confirmation = await response.awaitMessageComponent({ filter: collectorFilter });
51
+ // const collector = response.createMessageComponentCollector({ componentType: ComponentType.StringSelect, time: 3_600_000 });
52
+
53
+ if (confirmation.customId === '<<') {
54
+ curr_page = 0;
55
+ view = await update_component(curr_page, max_page, embeds);
56
+ await confirmation.update({ embeds: [embeds[curr_page]], components: view });
57
+ }
58
+ else if (confirmation.customId === '<') {
59
+ curr_page--;
60
+ view = await update_component(curr_page, max_page, embeds);
61
+ await confirmation.update({ embeds: [embeds[curr_page]], components: view });
62
+ }
63
+ else if (confirmation.customId === '>') {
64
+ curr_page++;
65
+ view = await update_component(curr_page, max_page, embeds);
66
+ await confirmation.update({ embeds: [embeds[curr_page]], components: view });
67
+ }
68
+ else if (confirmation.customId === '>>') {
69
+ curr_page = max_page;
70
+ view = await update_component(curr_page, max_page, embeds);
71
+ await confirmation.update({ embeds: [embeds[curr_page]], components: view });
72
+ }
73
+ else if (confirmation.customId === 'noice') {
74
+ await confirmation.update({ content: "You have chosen this track:", embeds: [embeds[curr_page]], components: [] })
75
+
76
+ return;
77
+ }
78
+ else if (confirmation.customId === 'nope') {
79
+ await confirmation.update({ embeds: [embeds[curr_page]], components: [] })
80
+
81
+ return;
82
+ }
83
+ else if (confirmation.customId === 'delete') {
84
+
85
+
86
+ const selection = Number(confirmation.values[0]) - 1;
87
+ var infront;
88
+ if (selection < 1) {
89
+ infront = [];
90
+ }
91
+ else {
92
+ infront = client.ctrack[interaction.guildId].slice(0, selection);
93
+ }
94
+
95
+ const inafter = client.ctrack[interaction.guildId].slice(selection + 1);
96
+ const selected = client.ctrack[interaction.guildId][selection];
97
+
98
+ client.ctrack[interaction.guildId] = infront;
99
+
100
+ if (_.get(client.isloop, interaction.guildId, undefined) === '2') {
101
+ inafter.forEach(url => {
102
+ client.ctrack[interaction.guildId].push(url)
103
+ });
104
+ }
105
+
106
+ if (selection == 0) {
107
+ useQueue(confirmation.guildId).node.stop();
108
+
109
+ await playing(client, interaction);
110
+ }
111
+
112
+ await new Promise((resolve) => setTimeout(resolve, 1000));
113
+ const deleted_track = (await useMainPlayer().search(selected))._data.tracks[0].title
114
+
115
+ embeds = await update_embed(client, interaction);
116
+
117
+ var curr_page = 0;
118
+ var max_page = embeds.length - 1;
119
+
120
+ var view = await update_component(curr_page, max_page, embeds);
121
+
122
+ await confirmation.update({
123
+ content: `You have deleted track ${deleted_track}`,
124
+ embeds: [embeds[curr_page]],
125
+ components: view,
126
+ });
127
+ }
128
+ else if (confirmation.customId === 'skip') {
129
+
130
+ const selection = Number(confirmation.values[0]) - 1;
131
+
132
+ const bruh = ((await useMainPlayer().search(client.ctrack[interaction.guildId][selection]))._data.tracks[0].title == useQueue(interaction.guildId).currentTrack.title);
133
+
134
+
135
+ if (bruh === false) {
136
+ const infront = (selection !== 0) ?
137
+ client.ctrack[interaction.guildId].slice(0, selection) : [];
138
+
139
+ const inafter = client.ctrack[interaction.guildId].slice(selection);
140
+
141
+ client.ctrack[interaction.guildId] = inafter;
142
+
143
+ if (_.get(client.isloop, interaction.guildId, undefined) === '2') {
144
+ infront.forEach(url => {
145
+ client.ctrack[interaction.guildId].push(url)
146
+ });
147
+ }
148
+ else if (client.isloop[interaction.guildId] !== '1') {
149
+ infront.forEach(url => {
150
+ client.ptrack[interaction.guildId].push(url)
151
+ });
152
+ }
153
+
154
+ const queue = useQueue(confirmation.guildId);
155
+
156
+ const curr_track = queue.currentTrack.title;
157
+
158
+ useQueue(confirmation.guildId).node.stop();
159
+
160
+ await playing(client, interaction);
161
+
162
+ await new Promise((resolve) => setTimeout(resolve, 1000));
163
+
164
+ const skiped_track = (await useMainPlayer().search(client.ctrack[interaction.guildId][0]))._data.tracks[0].title
165
+
166
+ embeds = await update_embed(client, interaction);
167
+
168
+ var curr_page = 0;
169
+ var max_page = embeds.length - 1;
170
+
171
+ var view = await update_component(curr_page, max_page, embeds);
172
+
173
+ await confirmation.update({
174
+ content: `You have skiped track ${curr_track} to ${skiped_track}`,
175
+ embeds: [embeds[curr_page]],
176
+ components: view,
177
+ });
178
+ }
179
+ else {
180
+
181
+ embeds = await update_embed(client, interaction);
182
+
183
+ var curr_page = 0;
184
+ var max_page = embeds.length - 1;
185
+
186
+ var view = await update_component(curr_page, max_page, embeds);
187
+
188
+ const queue = useQueue(confirmation.guildId);
189
+
190
+ const curr_track = queue.currentTrack.title;
191
+
192
+ await confirmation.update({
193
+ content: `You can't skop track ${curr_track}`,
194
+ embeds: [embeds[curr_page]],
195
+ components: view,
196
+ });
197
+ }
198
+ }
199
+ else if (confirmation.customId === 'reset') {
200
+
201
+
202
+ embeds = await update_embed(client, interaction);
203
+
204
+ var curr_page = 0;
205
+ var max_page = embeds.length - 1;
206
+
207
+ var view = await update_component(curr_page, max_page, embeds);
208
+
209
+ await confirmation.update({
210
+ embeds: [embeds[curr_page]],
211
+ components: view,
212
+ });
213
+ }
214
+
215
+ } catch (e) {
216
+ await interaction.editReply({ content: `Confirmation not received with error, cancelling...\nError: ${e}`, components: [] });
217
+ return [];
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,53 @@
1
+ const { CommandInteraction, EmbedBuilder } = require('discord.js');
2
+ const { useQueue } = require('discord-player')
3
+
4
+ module.exports = resuming
5
+
6
+ /**
7
+ *
8
+ * @param {CommandInteraction} interaction
9
+ */
10
+
11
+ async function resuming(client, interaction) {
12
+
13
+ const queue = useQueue(interaction.guildId);
14
+
15
+ if (queue.node.isPaused()) {
16
+ queue.node.setPaused(false)
17
+
18
+ return [
19
+ new EmbedBuilder()
20
+ .setTitle(`I have resumed the queue`)
21
+ .setThumbnail(queue.currentTrack.thumbnail)
22
+ .setColor(client.get_color())
23
+ .addFields([
24
+ {
25
+ name: `Current track:`,
26
+ value: `${queue.currentTrack.title}`
27
+ },
28
+ {
29
+ name: `Author:`,
30
+ value: `${queue.currentTrack.author}`,
31
+ },
32
+ {
33
+ name: `Now timestamp:`,
34
+ value: `${queue.node.getTimestamp().current.label} / ${queue.node.getTimestamp().total.label}`
35
+ }
36
+ ])
37
+ ]
38
+ }
39
+ else {
40
+ return [
41
+ new EmbedBuilder()
42
+ .setColor(client.get_color())
43
+ .addFields([
44
+ {
45
+ name: `I can't resume the queue`,
46
+ value: `Reason : I'm not pausing now`
47
+ }
48
+ ])
49
+ ]
50
+ }
51
+
52
+
53
+ }
@@ -0,0 +1,35 @@
1
+ const { CommandInteraction, EmbedBuilder } = require('discord.js');
2
+ const { useQueue } = require('discord-player')
3
+
4
+
5
+ module.exports = set_loop
6
+
7
+ /**
8
+ *
9
+ *
10
+ * @param {CommandInteraction} interaction
11
+ */
12
+
13
+ async function set_loop(client, interaction, mode) {
14
+
15
+ const queue = useQueue(interaction.guildId);
16
+
17
+ queue.setRepeatMode(Number(mode))
18
+ client.isloop[interaction.guildId] = mode;
19
+
20
+ var bruh = {
21
+ 0: 'Disabled Repeated mode',
22
+ 1: 'Track Repeated mode',
23
+ 2: 'Queue Repeated mode',
24
+ 3: 'Autoplay Mode'
25
+ }
26
+
27
+ return [
28
+ new EmbedBuilder()
29
+ .setColor(client.get_color())
30
+ .addFields({
31
+ name: `Current queue repeated mode has been changed`,
32
+ value: `Current: ${bruh[Number(mode)]}`
33
+ })
34
+ ]
35
+ }
@@ -0,0 +1,26 @@
1
+ const { CommandInteraction, EmbedBuilder } = require('discord.js');
2
+
3
+ module.exports = shuffling
4
+
5
+ /**
6
+ *
7
+ *
8
+ * @param {CommandInteraction} interaction
9
+ */
10
+
11
+ async function shuffling(client, interaction) {
12
+
13
+ var array = client.ctrack[interaction.guildId];
14
+ for (let i = array.length - 1; i > 0; i--) {
15
+ const j = Math.floor(Math.random() * (i + 1));
16
+ [array[i], array[j]] = [array[j], array[i]];
17
+ }
18
+
19
+ client.ctrack[interaction.guildId] = array;
20
+
21
+ return [
22
+ new EmbedBuilder()
23
+ .setColor(client.get_color())
24
+ .setTitle(`Your queue has been shuffled`)
25
+ ]
26
+ }
@@ -0,0 +1,64 @@
1
+ const { CommandInteraction, EmbedBuilder } = require('discord.js');
2
+ const { useQueue, useMainPlayer } = require('discord-player')
3
+ const _ = require('lodash')
4
+ const playing = require('./support/playing')
5
+
6
+ module.exports = skipping
7
+
8
+ /**
9
+ *
10
+ * @param {CommandInteraction} interaction
11
+ */
12
+
13
+ async function skipping(client, interaction) {
14
+ const infront = client.ctrack[interaction.guildId].shift();
15
+ const inafter = client.ctrack[interaction.guildId].slice(1);
16
+
17
+ client.ctrack[interaction.guildId] = inafter;
18
+
19
+ if (_.get(client.isloop, interaction.guildId, undefined) === '2') {
20
+ client.ctrack[interaction.guildId].push(infront)
21
+ }
22
+ else if (_.get(client.isloop, interaction.guildId, undefined) === '0') {
23
+ client.ptrack[interaction.guildId].push(infront)
24
+ }
25
+
26
+ const queue = useQueue(interaction.guildId);
27
+
28
+ const curr_track = queue.currentTrack.title;
29
+
30
+ useQueue(interaction.guildId).node.stop();
31
+
32
+ await playing(client, interaction);
33
+
34
+ await new Promise((resolve) => setTimeout(resolve, 1000));
35
+ var skiped_track;
36
+
37
+ if (client.ctrack[interaction.guildId].length > 0) {
38
+ skiped_track = (await useMainPlayer().search(client.ctrack[interaction.guildId][0]))._data.tracks[0].title
39
+ }
40
+ else {
41
+ return [
42
+ new EmbedBuilder()
43
+ .setFooter({
44
+ text: `Page 1 of 1`,
45
+ })
46
+ .setColor(client.get_color())
47
+ .addFields(
48
+ {
49
+ name: `Your queue don't have any track`,
50
+ value: ' '
51
+ }
52
+ )]
53
+ }
54
+
55
+ return [
56
+ new EmbedBuilder()
57
+ .setTitle(`You have skipped track ${curr_track}`)
58
+ .setColor(client.get_color())
59
+ .setFields({
60
+ name: `Current track:`,
61
+ value: `${skiped_track}`
62
+ })
63
+ ]
64
+ }
@@ -0,0 +1,38 @@
1
+ const { CommandInteraction, EmbedBuilder } = require('discord.js');
2
+ const { useQueue } = require('discord-player')
3
+
4
+ module.exports = stopping
5
+ /**
6
+ *
7
+ *
8
+ * @param {CommandInteraction} interaction
9
+ */
10
+
11
+ async function stopping(client, interaction) {
12
+ const queue = useQueue(interaction.guildId);
13
+
14
+ if (!queue.deleted) {
15
+ const channell = queue.channel;
16
+ client.ctrack[interaction.guildId] = []
17
+
18
+ queue.setRepeatMode(0);
19
+
20
+ queue.clear();
21
+
22
+ queue.node.stop();
23
+
24
+ queue.delete();
25
+
26
+ return [
27
+ new EmbedBuilder()
28
+ .setColor(client.get_color())
29
+ .setTitle(`I have stopped and leaved ${channell}`)
30
+ ]
31
+ }
32
+
33
+ return [
34
+ new EmbedBuilder()
35
+ .setColor(client.get_color())
36
+ .setTitle(`I have stopped and leaved Voice channel`)
37
+ ]
38
+ }
@@ -0,0 +1,236 @@
1
+ const {
2
+ CommandInteraction,
3
+ EmbedBuilder,
4
+ ActionRowBuilder,
5
+ ButtonBuilder,
6
+ ButtonStyle,
7
+ } = require("discord.js");
8
+ var _ = require("lodash");
9
+ const { discordClient } = require("../../../client");
10
+ const { QueryType, useMainPlayer } = require("discord-player");
11
+
12
+ /**
13
+ *
14
+ * @param {CommandInteraction} interaction
15
+ * @param {string} prompt
16
+ */
17
+ async function add_to_queue(client, interaction, prompt, mode) {
18
+ var videos = await check_prompt(client, interaction, prompt, mode);
19
+
20
+ return videos;
21
+ }
22
+
23
+ module.exports = add_to_queue;
24
+
25
+ /**
26
+ * @param {discordClient} client
27
+ * @param {CommandInteraction} interaction
28
+ * @param {string} prompt
29
+ * @returns
30
+ */
31
+ async function check_prompt(client, interaction, prompt, mode) {
32
+ const user = interaction.deferred ? interaction.user : interaction.author;
33
+ const player = useMainPlayer();
34
+ var searchResult;
35
+
36
+ if (mode == "youtube") {
37
+ searchResult = await player.search(prompt, {
38
+ requestedBy: interaction.user,
39
+
40
+ searchEngine: QueryType.YOUTUBE_SEARCH,
41
+ });
42
+ } else if (mode == "spotify") {
43
+ searchResult = await player.search(prompt, {
44
+ requestedBy: interaction.user,
45
+ searchEngine: QueryType.SPOTIFY_SEARCH,
46
+ });
47
+ } else if (mode == "soundcloud") {
48
+ searchResult = await player.search(prompt, {
49
+ requestedBy: interaction.user,
50
+ searchEngine: QueryType.SOUNDCLOUD_SEARCH,
51
+ });
52
+ }
53
+
54
+ const vidsresult = searchResult.tracks;
55
+ var embeds = [];
56
+ var color = client.get_color();
57
+
58
+ vidsresult.forEach((item) => {
59
+ var time = item.duration;
60
+ var timee = time.split(":");
61
+
62
+ timee = timee.reverse();
63
+
64
+ var hours, minutes, seconds, days, weeks, months, years;
65
+
66
+ seconds = Number(timee[0]);
67
+ minutes = Number(timee[1]);
68
+ hours = timee.length > 2 ? Number(timee[2]) : 0;
69
+
70
+ days = Math.floor(hours / 24);
71
+ weeks = Math.floor(days / 7);
72
+ months = Math.floor(weeks / 4);
73
+ years = Math.floor(months / 12);
74
+
75
+ months = months % 12;
76
+ hours = hours % 24;
77
+ days = days % 7;
78
+ weeks = weeks % 4;
79
+
80
+ var dur = "";
81
+
82
+ dur += years !== 0 ? `${years} years ` : ` `;
83
+ dur += months !== 0 ? `${months} months ` : ` `;
84
+ dur += weeks !== 0 ? `${weeks} weeks ` : ` `;
85
+ dur += days !== 0 ? `${days} days ` : ` `;
86
+ dur += hours !== 0 ? `${hours} hours ` : ` `;
87
+ dur += minutes !== 0 ? `${minutes} minutes ` : ` `;
88
+ dur += seconds !== 0 ? `${seconds} seconds ` : ` `;
89
+
90
+ const embeb = new EmbedBuilder()
91
+ .setColor(color)
92
+ .setDescription("Chose your track:)")
93
+ .setThumbnail(item.thumbnail)
94
+ .addFields(
95
+ {
96
+ name: "Track's name:",
97
+ value: item.title,
98
+ inline: false,
99
+ },
100
+ {
101
+ name: "Author:",
102
+ value: item.author,
103
+ inline: false,
104
+ },
105
+ {
106
+ name: "Duration:",
107
+ value: dur,
108
+ inline: false,
109
+ }
110
+ );
111
+
112
+ embeds.push({
113
+ embeb: embeb,
114
+ link: item.url,
115
+ });
116
+ });
117
+
118
+ var curr_page = 0;
119
+ var max_page = vidsresult.length - 1;
120
+
121
+ var view = await update_component(curr_page, max_page);
122
+
123
+ var response = interaction.deferred
124
+ ? await interaction.followUp({
125
+ embeds: [embeds[curr_page].embeb],
126
+ components: view,
127
+ })
128
+ : await interaction.reply({
129
+ embeds: [embeds[curr_page].embeb],
130
+ components: view,
131
+ });
132
+
133
+ var done = false;
134
+ while (done == false) {
135
+ const collectorFilter = (i) => i.user.id === user.id;
136
+ try {
137
+ const confirmation = await response.awaitMessageComponent({
138
+ filter: collectorFilter,
139
+ });
140
+
141
+ if (confirmation.customId === "<<") {
142
+ curr_page = 0;
143
+ view = await update_component(curr_page, max_page);
144
+ await confirmation.update({
145
+ embeds: [embeds[curr_page].embeb],
146
+ components: view,
147
+ });
148
+ } else if (confirmation.customId === "<") {
149
+ curr_page--;
150
+ view = await update_component(curr_page, max_page);
151
+ await confirmation.update({
152
+ embeds: [embeds[curr_page].embeb],
153
+ components: view,
154
+ });
155
+ } else if (confirmation.customId === ">") {
156
+ curr_page++;
157
+ view = await update_component(curr_page, max_page);
158
+ await confirmation.update({
159
+ embeds: [embeds[curr_page].embeb],
160
+ components: view,
161
+ });
162
+ } else if (confirmation.customId === ">>") {
163
+ curr_page = max_page;
164
+ view = await update_component(curr_page, max_page);
165
+ await confirmation.update({
166
+ embeds: [embeds[curr_page].embeb],
167
+ components: view,
168
+ });
169
+ } else if (confirmation.customId === "noice") {
170
+ await confirmation.update({
171
+ content: "You have chosen this track:",
172
+ embeds: [embeds[curr_page].embeb],
173
+ components: [],
174
+ });
175
+
176
+ return [embeds[curr_page].link];
177
+ } else if (confirmation.customId === "nope") {
178
+ await confirmation.update({
179
+ content: "You haven't chosen any track",
180
+ embeds: [],
181
+ components: [],
182
+ });
183
+
184
+ return [];
185
+ }
186
+ } catch (e) {
187
+ await response.edit({
188
+ content: `Confirmation not received with error, cancelling...\nError: ${e}`,
189
+ components: [],
190
+ });
191
+ return [];
192
+ }
193
+ }
194
+ }
195
+
196
+ async function update_component(curr, maxx) {
197
+ var butt1 = new ButtonBuilder()
198
+ .setLabel("<<")
199
+ .setCustomId("<<")
200
+ .setStyle(ButtonStyle.Primary)
201
+ .setDisabled(curr == 0 ? true : false);
202
+
203
+ var butt2 = new ButtonBuilder()
204
+ .setLabel("<")
205
+ .setCustomId("<")
206
+ .setStyle(ButtonStyle.Primary)
207
+ .setDisabled(curr == 0 ? true : false);
208
+
209
+ var butt3 = new ButtonBuilder()
210
+ .setLabel(">")
211
+ .setCustomId(">")
212
+ .setStyle(ButtonStyle.Primary)
213
+ .setDisabled(curr == maxx ? true : false);
214
+
215
+ var butt4 = new ButtonBuilder()
216
+ .setLabel(">>")
217
+ .setCustomId(">>")
218
+ .setStyle(ButtonStyle.Primary)
219
+ .setDisabled(curr == maxx ? true : false);
220
+
221
+ var confirm = new ButtonBuilder()
222
+ .setLabel("✅")
223
+ .setCustomId("noice")
224
+ .setStyle(ButtonStyle.Success);
225
+
226
+ var nope = new ButtonBuilder()
227
+ .setLabel("❌")
228
+ .setCustomId("nope")
229
+ .setStyle(ButtonStyle.Danger);
230
+
231
+ var view1 = new ActionRowBuilder().addComponents(butt2, butt4, confirm);
232
+
233
+ var view2 = new ActionRowBuilder().addComponents(butt1, butt3, nope);
234
+
235
+ return [view1, view2];
236
+ }