Skip to content

Commit 0b37f70

Browse files
committed
Refactor moderation modals
1 parent 6bd23f6 commit 0b37f70

24 files changed

Lines changed: 281 additions & 361 deletions

src/commands/guild/BaseLockCommand.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import Command from '../Command.js';
22
import {
3+
channelMention,
4+
EmbedBuilder,
35
LabelBuilder,
4-
ModalBuilder,
6+
MessageFlags,
57
PermissionFlagsBits,
68
PermissionsBitField,
79
TextInputBuilder,
810
TextInputStyle,
9-
EmbedBuilder, MessageFlags, channelMention,
1011
} from 'discord.js';
1112
import ChannelWrapper from '../../discord/ChannelWrapper.js';
1213
import ErrorEmbed from '../../formatting/embeds/ErrorEmbed.js';
1314
import {channelSelectMenu} from '../../util/channels.js';
1415
import Confirmation from '../../database/Confirmation.js';
1516
import {timeAfter} from '../../util/timeutils.js';
1617
import ChannelSettings from '../../settings/ChannelSettings.js';
18+
import BetterModalBuilder from "../../formatting/components/BetterModalBuilder.js";
1719

1820
/**
1921
* @typedef {object} ComponentStrings
@@ -56,20 +58,20 @@ export default class BaseLockCommand extends Command {
5658
return;
5759
}
5860

59-
const modal = new ModalBuilder()
61+
const modal = new BetterModalBuilder()
6062
.setTitle(this.#getString('modal_title'));
6163

6264
const global = interaction.options.getBoolean('global');
6365
if (!global) {
64-
modal.addLabelComponents(
66+
modal.addLabelComponent(
6567
new LabelBuilder()
6668
.setLabel('Channels')
6769
.setDescription(this.#getString('modal_channels_description'))
6870
.setStringSelectMenuComponent(channelSelectMenu(channels).setCustomId('channels'))
6971
);
7072
}
7173

72-
modal.addLabelComponents(
74+
modal.addLabelComponent(
7375
new LabelBuilder()
7476
.setLabel('Lock message')
7577
.setDescription(this.#getString('modal_message_description'))

src/commands/user/BanCommand.js

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
ModalBuilder,
3-
PermissionFlagsBits,
4-
PermissionsBitField,
5-
} from 'discord.js';
1+
import {PermissionFlagsBits, PermissionsBitField,} from 'discord.js';
62
import MemberWrapper from '../../discord/MemberWrapper.js';
73
import {parseTime} from '../../util/timeutils.js';
84
import colors from '../../util/colors.js';
@@ -12,10 +8,11 @@ import Confirmation from '../../database/Confirmation.js';
128
import UserActionEmbed from '../../formatting/embeds/UserActionEmbed.js';
139
import config from '../../bot/Config.js';
1410
import {deferReplyOnce, replyOrEdit} from '../../util/interaction.js';
15-
import ReasonInput from '../../modals/inputs/ReasonInput.js';
16-
import CommentInput from '../../modals/inputs/CommentInput.js';
17-
import DeleteMessageHistoryInput from '../../modals/inputs/DeleteMessageHistoryInput.js';
18-
import DurationInput from '../../modals/inputs/DurationInput.js';
11+
import BetterModalBuilder from "../../formatting/components/BetterModalBuilder.js";
12+
import ReasonInput from "../../formatting/components/ReasonInput.js";
13+
import CommentInput from "../../formatting/components/CommentInput.js";
14+
import DurationInput from "../../formatting/components/DurationInput.js";
15+
import DeleteMessageHistoryInput from "../../formatting/components/DeleteMessageHistoryInput.js";
1916

2017
/**
2118
* @import {DurationConfirmationData} from './UserCommand.js';
@@ -138,35 +135,32 @@ export default class BanCommand extends UserCommand {
138135
return;
139136
}
140137

141-
await interaction.showModal(new ModalBuilder()
138+
await interaction.showModal(new BetterModalBuilder()
142139
.setTitle(`Ban ${await member.displayName()}`.substring(0, MODAL_TITLE_LIMIT))
143140
.setCustomId(`ban:${member.user.id}`)
144-
.addComponents(
145-
new ReasonInput().toActionRow(),
146-
new CommentInput().toActionRow(),
147-
new DurationInput().toActionRow(),
148-
new DeleteMessageHistoryInput().toActionRow(),
149-
));
141+
.addLabelComponent(new ReasonInput(this))
142+
.addLabelComponent(new CommentInput(this))
143+
.addLabelComponent(new DurationInput(this.getName()))
144+
.addLabelComponent(new DeleteMessageHistoryInput(this.getName()))
145+
);
150146
}
151147

152148
async executeModal(interaction) {
153149
let reason, duration, deleteMessageTime, comment;
154-
for (const row of interaction.components) {
155-
for (const component of row.components) {
156-
switch (component.customId) {
157-
case 'reason':
158-
reason = component.value || 'No reason provided';
159-
break;
160-
case 'comment':
161-
comment = component.value || null;
162-
break;
163-
case 'duration':
164-
duration = parseTime(component.value);
165-
break;
166-
case 'delete':
167-
deleteMessageTime = parseTime(component.value);
168-
break;
169-
}
150+
for (let label of interaction.components) {
151+
switch (label.component.customId) {
152+
case 'reason':
153+
reason = label.component.value || 'No reason provided';
154+
break;
155+
case 'comment':
156+
comment = label.component.value || null;
157+
break;
158+
case 'duration':
159+
duration = parseTime(label.component.value);
160+
break;
161+
case 'delete':
162+
deleteMessageTime = parseTime(label.component.value);
163+
break;
170164
}
171165
}
172166

src/commands/user/KickCommand.js

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
ModalBuilder,
3-
PermissionFlagsBits,
4-
PermissionsBitField,
5-
} from 'discord.js';
1+
import {PermissionFlagsBits, PermissionsBitField,} from 'discord.js';
62
import MemberWrapper from '../../discord/MemberWrapper.js';
73
import colors from '../../util/colors.js';
84
import {MODAL_TITLE_LIMIT} from '../../util/apiLimits.js';
@@ -11,8 +7,9 @@ import Confirmation from '../../database/Confirmation.js';
117
import UserActionEmbed from '../../formatting/embeds/UserActionEmbed.js';
128
import config from '../../bot/Config.js';
139
import {deferReplyOnce, replyOrEdit} from '../../util/interaction.js';
14-
import ReasonInput from '../../modals/inputs/ReasonInput.js';
15-
import CommentInput from '../../modals/inputs/CommentInput.js';
10+
import ReasonInput from "../../formatting/components/ReasonInput.js";
11+
import CommentInput from "../../formatting/components/CommentInput.js";
12+
import BetterModalBuilder from "../../formatting/components/BetterModalBuilder.js";
1613

1714
/**
1815
* @import {ConfirmationData} from './UserCommand.js';
@@ -102,27 +99,24 @@ export default class KickCommand extends UserCommand {
10299
return;
103100
}
104101

105-
await interaction.showModal(new ModalBuilder()
102+
await interaction.showModal(new BetterModalBuilder()
106103
.setTitle(`Kick ${await member.displayName()}`.substring(0, MODAL_TITLE_LIMIT))
107104
.setCustomId(`kick:${member.user.id}`)
108-
.addComponents(
109-
new ReasonInput().toActionRow(),
110-
new CommentInput().toActionRow(),
111-
));
105+
.addLabelComponent(new ReasonInput(this))
106+
.addLabelComponent(new CommentInput(this))
107+
);
112108
}
113109

114110
async executeModal(interaction) {
115111
let reason, comment;
116-
for (const row of interaction.components) {
117-
for (const component of row.components) {
118-
switch (component.customId) {
119-
case 'reason':
120-
reason = component.value || 'No reason provided';
121-
break;
122-
case 'comment':
123-
comment = component.value || null;
124-
break;
125-
}
112+
for (let label of interaction.components) {
113+
switch (label.component.customId) {
114+
case 'reason':
115+
reason = label.component.value || 'No reason provided';
116+
break;
117+
case 'comment':
118+
comment = label.component.value || null;
119+
break;
126120
}
127121
}
128122

src/commands/user/MuteCommand.js

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
ModalBuilder,
3-
PermissionFlagsBits,
4-
PermissionsBitField,
5-
} from 'discord.js';
1+
import {PermissionFlagsBits, PermissionsBitField,} from 'discord.js';
62
import MemberWrapper from '../../discord/MemberWrapper.js';
73
import {formatTime, parseTime} from '../../util/timeutils.js';
84
import colors from '../../util/colors.js';
@@ -13,9 +9,10 @@ import ErrorEmbed from '../../formatting/embeds/ErrorEmbed.js';
139
import UserActionEmbed from '../../formatting/embeds/UserActionEmbed.js';
1410
import config from '../../bot/Config.js';
1511
import {deferReplyOnce, replyOrEdit} from '../../util/interaction.js';
16-
import ReasonInput from '../../modals/inputs/ReasonInput.js';
17-
import CommentInput from '../../modals/inputs/CommentInput.js';
18-
import DurationInput from '../../modals/inputs/DurationInput.js';
12+
import ReasonInput from "../../formatting/components/ReasonInput.js";
13+
import CommentInput from "../../formatting/components/CommentInput.js";
14+
import DurationInput from "../../formatting/components/DurationInput.js";
15+
import BetterModalBuilder from "../../formatting/components/BetterModalBuilder.js";
1916

2017
/**
2118
* @import {DurationConfirmationData} from './UserCommand.js';
@@ -137,31 +134,28 @@ export default class MuteCommand extends UserCommand {
137134
return;
138135
}
139136

140-
await interaction.showModal(new ModalBuilder()
137+
await interaction.showModal(new BetterModalBuilder()
141138
.setTitle(`Mute ${await member.displayName()}`.substring(0, MODAL_TITLE_LIMIT))
142139
.setCustomId(`mute:${member.user.id}`)
143-
.addComponents(
144-
new ReasonInput().toActionRow(),
145-
new CommentInput().toActionRow(),
146-
new DurationInput().toActionRow(),
147-
));
140+
.addLabelComponent(new ReasonInput(this))
141+
.addLabelComponent(new CommentInput(this))
142+
.addLabelComponent(new DurationInput(this.getName()))
143+
);
148144
}
149145

150146
async executeModal(interaction) {
151147
let reason, duration, comment;
152-
for (const row of interaction.components) {
153-
for (const component of row.components) {
154-
switch (component.customId) {
155-
case 'reason':
156-
reason = component.value || 'No reason provided';
157-
break;
158-
case 'comment':
159-
comment = component.value || null;
160-
break;
161-
case 'duration':
162-
duration = parseTime(component.value);
163-
break;
164-
}
148+
for (let label of interaction.components) {
149+
switch (label.component.customId) {
150+
case 'reason':
151+
reason = label.component.value || 'No reason provided';
152+
break;
153+
case 'comment':
154+
comment = label.component.value || null;
155+
break;
156+
case 'duration':
157+
duration = parseTime(label.component.value);
158+
break;
165159
}
166160
}
167161

src/commands/user/PardonCommand.js

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import {
2-
bold, escapeMarkdown,
3-
ModalBuilder,
4-
PermissionFlagsBits,
5-
PermissionsBitField
6-
} from 'discord.js';
1+
import {bold, escapeMarkdown, PermissionFlagsBits, PermissionsBitField} from 'discord.js';
72
import MemberWrapper from '../../discord/MemberWrapper.js';
83
import colors from '../../util/colors.js';
94
import {MODAL_TITLE_LIMIT} from '../../util/apiLimits.js';
@@ -12,9 +7,10 @@ import EmbedWrapper from '../../formatting/embeds/EmbedWrapper.js';
127
import {formatNumber, inlineEmojiIfExists} from '../../util/format.js';
138
import {deferReplyOnce, replyOrEdit} from '../../util/interaction.js';
149
import UserCommand from './UserCommand.js';
15-
import ReasonInput from '../../modals/inputs/ReasonInput.js';
16-
import CommentInput from '../../modals/inputs/CommentInput.js';
17-
import CountInput from '../../modals/inputs/CountInput.js';
10+
import ReasonInput from "../../formatting/components/ReasonInput.js";
11+
import CommentInput from "../../formatting/components/CommentInput.js";
12+
import BetterModalBuilder from "../../formatting/components/BetterModalBuilder.js";
13+
import StrikeCountInput from "../../formatting/components/StrikeCountInput.js";
1814

1915
export default class PardonCommand extends UserCommand {
2016

@@ -96,31 +92,28 @@ export default class PardonCommand extends UserCommand {
9692
return;
9793
}
9894

99-
await interaction.showModal(new ModalBuilder()
95+
await interaction.showModal(new BetterModalBuilder()
10096
.setTitle(`Pardon ${await member.displayName()}`.substring(0, MODAL_TITLE_LIMIT))
10197
.setCustomId(`pardon:${member.user.id}`)
102-
.addComponents(
103-
new ReasonInput().toActionRow(),
104-
new CommentInput().toActionRow(),
105-
new CountInput().toActionRow(),
106-
));
98+
.addLabelComponent(new ReasonInput(this))
99+
.addLabelComponent(new CommentInput(this))
100+
.addLabelComponent(new StrikeCountInput("Number of strikes you want to pardon."))
101+
);
107102
}
108103

109104
async executeModal(interaction) {
110105
let reason, comment, count;
111-
for (const row of interaction.components) {
112-
for (const component of row.components) {
113-
switch (component.customId) {
114-
case 'reason':
115-
reason = component.value || 'No reason provided';
116-
break;
117-
case 'comment':
118-
comment = component.value || null;
119-
break;
120-
case 'count':
121-
count = parseInt(component.value);
122-
break;
123-
}
106+
for (let label of interaction.components) {
107+
switch (label.component.customId) {
108+
case 'reason':
109+
reason = label.component.value || 'No reason provided';
110+
break;
111+
case 'comment':
112+
comment = label.component.value || null;
113+
break;
114+
case 'count':
115+
count = parseInt(label.component.value);
116+
break;
124117
}
125118
}
126119

0 commit comments

Comments
 (0)