Skip to content

Commit 0a4adfe

Browse files
committed
allow deleting responses of own messages/commands with delete button
1 parent 250741e commit 0a4adfe

File tree

9 files changed

+47
-47
lines changed

9 files changed

+47
-47
lines changed

src/main/java/net/javadiscord/javabot/listener/GitHubLinkListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
3636
if (!content.getFirst().isBlank() && !content.getSecond().isBlank()) {
3737
event.getMessage().reply(String.format("```%s\n%s\n```", content.getSecond(), StringUtils.standardSanitizer().compute(content.getFirst())))
3838
.setAllowedMentions(List.of())
39-
.setActionRow(Button.secondary(InteractionUtils.DELETE_ORIGINAL_TEMPLATE, "\uD83D\uDDD1️"), Button.link(matcher.group(), "View on GitHub"))
39+
.setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()), Button.link(matcher.group(), "View on GitHub"))
4040
.queue();
4141
}
4242
}

src/main/java/net/javadiscord/javabot/listener/JobChannelCloseOldPostsListener.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
99
import net.dv8tion.jda.api.events.channel.ChannelCreateEvent;
1010
import net.dv8tion.jda.api.hooks.ListenerAdapter;
11-
import net.dv8tion.jda.api.interactions.components.buttons.Button;
1211
import net.javadiscord.javabot.data.config.BotConfig;
1312
import net.javadiscord.javabot.util.InteractionUtils;
1413

@@ -17,9 +16,9 @@
1716
*/
1817
@RequiredArgsConstructor
1918
public class JobChannelCloseOldPostsListener extends ListenerAdapter {
20-
19+
2120
private final BotConfig botConfig;
22-
21+
2322
@Override
2423
public void onChannelCreate(ChannelCreateEvent event) {
2524
if (event.getChannel().getType() != ChannelType.GUILD_PUBLIC_THREAD) {
@@ -30,10 +29,10 @@ public void onChannelCreate(ChannelCreateEvent event) {
3029
botConfig.get(event.getGuild()).getModerationConfig().getJobChannelId()) {
3130
return;
3231
}
33-
34-
32+
33+
3534
boolean postClosed = false;
36-
35+
3736
for (ThreadChannel otherPost : post.getParentChannel().getThreadChannels()) {
3837
if (otherPost.getOwnerIdLong() == post.getOwnerIdLong() &&
3938
otherPost.getIdLong() != post.getIdLong() &&
@@ -56,9 +55,7 @@ public void onChannelCreate(ChannelCreateEvent event) {
5655
.setDescription("Since only one open post is allowed per user, older posts have been closed")
5756
.setColor(Color.YELLOW)
5857
.build())
59-
.addActionRow(Button.secondary(
60-
InteractionUtils.DELETE_ORIGINAL_TEMPLATE,
61-
"\uD83D\uDDD1️"))
58+
.addActionRow(InteractionUtils.createDeleteButton(post.getOwnerIdLong()))
6259
.queue();
6360
}
6461
}

src/main/java/net/javadiscord/javabot/listener/QOTWSubmissionListener.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
66
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
77
import net.dv8tion.jda.api.hooks.ListenerAdapter;
8-
import net.dv8tion.jda.api.interactions.components.buttons.Button;
98
import net.javadiscord.javabot.data.config.BotConfig;
109
import net.javadiscord.javabot.data.config.guild.QOTWConfig;
1110
import net.javadiscord.javabot.util.InteractionUtils;
@@ -35,7 +34,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
3534
Please keep in mind that messages **over 2000 characters** get split in half due to webhook limitations.
3635
If you want to make sure that your submission is properly formatted, split your message into smaller chunks instead.""",
3736
event.getAuthor().getAsMention())
38-
.setActionRow(Button.secondary(InteractionUtils.DELETE_ORIGINAL_TEMPLATE, "\uD83D\uDDD1️"))
37+
.setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()))
3938
.queue();
4039
}
4140
}

src/main/java/net/javadiscord/javabot/systems/help/AutoCodeFormatter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.dv8tion.jda.api.entities.Guild;
66
import net.dv8tion.jda.api.entities.MessageEmbed;
77
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
8-
import net.dv8tion.jda.api.interactions.components.buttons.Button;
98
import net.javadiscord.javabot.data.config.BotConfig;
109
import net.javadiscord.javabot.systems.moderation.AutoMod;
1110
import net.javadiscord.javabot.systems.user_preferences.UserPreferenceService;
@@ -124,9 +123,8 @@ private void sendFormatHint(MessageReceivedEvent event) {
124123
event.getMessage()
125124
.replyEmbeds(formatHintEmbed(event.getGuild()))
126125
.addActionRow(
127-
Button.secondary(InteractionUtils.DELETE_ORIGINAL_TEMPLATE, "\uD83D\uDDD1️")
128-
)
129-
.queue();
126+
InteractionUtils.createDeleteButton(event.getAuthor().getIdLong())
127+
).queue();
130128
}
131129

132130
private void replaceUnformattedCode(String msg, int codeStartIndex, int codeEndIndex, MessageReceivedEvent event) {

src/main/java/net/javadiscord/javabot/systems/help/HelpListener.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,9 @@ private void replyCloseSuggestionIfPatternMatches(Message msg) {
162162
Note that you will not be able to send further messages here after this post have been closed but you will be able to create new posts.
163163
""")
164164
.addActionRow(
165-
createCloseSuggestionButton(msg.getChannel()
166-
.asThreadChannel()),
167-
Button.secondary(
168-
InteractionUtils.DELETE_ORIGINAL_TEMPLATE,
169-
"\uD83D\uDDD1️"
170-
)
171-
)
172-
.queue();
165+
createCloseSuggestionButton(msg.getChannel().asThreadChannel()),
166+
InteractionUtils.createDeleteButton(msg.getAuthor().getIdLong())
167+
).queue();
173168
recentlyCloseSuggestedPosts.put(
174169
postId,
175170
System.currentTimeMillis() + SUGGEST_CLOSE_TIMEOUT

src/main/java/net/javadiscord/javabot/systems/user_commands/format_code/FormatAndIndentCodeMessageContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public FormatAndIndentCodeMessageContext() {
2727
public void execute(@NotNull MessageContextInteractionEvent event) {
2828
event.replyFormat("```java\n%s\n```", IndentationHelper.formatIndentation(StringUtils.standardSanitizer().compute(event.getTarget().getContentRaw()), IndentationHelper.IndentationType.TABS))
2929
.setAllowedMentions(List.of())
30-
.setComponents(FormatCodeCommand.buildActionRow(event.getTarget()))
30+
.setComponents(FormatCodeCommand.buildActionRow(event.getTarget(), event.getUser().getIdLong()))
3131
.queue();
3232
}
3333
}

src/main/java/net/javadiscord/javabot/systems/user_commands/format_code/FormatCodeCommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public FormatCodeCommand() {
5656
}
5757

5858
@Contract("_ -> new")
59-
static @NotNull ActionRow buildActionRow(@NotNull Message target) {
60-
return ActionRow.of(Button.secondary(InteractionUtils.DELETE_ORIGINAL_TEMPLATE, "\uD83D\uDDD1️"),
59+
static @NotNull ActionRow buildActionRow(@NotNull Message target, long requesterId) {
60+
return ActionRow.of(InteractionUtils.createDeleteButton(requesterId),
6161
Button.link(target.getJumpUrl(), "View Original"));
6262
}
6363

@@ -78,7 +78,7 @@ public void execute(@NotNull SlashCommandInteractionEvent event) {
7878
if (target != null) {
7979
event.getHook().sendMessageFormat("```%s\n%s\n```", format, IndentationHelper.formatIndentation(StringUtils.standardSanitizer().compute(target.getContentRaw()),IndentationHelper.IndentationType.valueOf(indentation)))
8080
.setAllowedMentions(List.of())
81-
.setComponents(buildActionRow(target))
81+
.setComponents(buildActionRow(target, event.getUser().getIdLong()))
8282
.queue();
8383
} else {
8484
Responses.error(event.getHook(), "Could not find message; please specify a message id.").queue();
@@ -93,7 +93,7 @@ public void execute(@NotNull SlashCommandInteractionEvent event) {
9393
event.getChannel().retrieveMessageById(messageId).queue(
9494
target -> event.getHook().sendMessageFormat("```%s\n%s\n```", format, IndentationHelper.formatIndentation(StringUtils.standardSanitizer().compute(target.getContentRaw()), IndentationHelper.IndentationType.valueOf(indentation)))
9595
.setAllowedMentions(List.of())
96-
.setComponents(buildActionRow(target))
96+
.setComponents(buildActionRow(target, event.getUser().getIdLong()))
9797
.queue(),
9898
e -> Responses.error(event.getHook(), "Could not retrieve message with id: " + messageId).queue());
9999
}

src/main/java/net/javadiscord/javabot/systems/user_commands/format_code/FormatCodeMessageContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public FormatCodeMessageContext() {
2525
public void execute(@NotNull MessageContextInteractionEvent event) {
2626
event.replyFormat("```java\n%s\n```", StringUtils.standardSanitizer().compute(event.getTarget().getContentRaw()))
2727
.setAllowedMentions(List.of())
28-
.setComponents(FormatCodeCommand.buildActionRow(event.getTarget()))
28+
.setComponents(FormatCodeCommand.buildActionRow(event.getTarget(), event.getUser().getIdLong()))
2929
.queue();
3030
}
3131
}

src/main/java/net/javadiscord/javabot/util/InteractionUtils.java

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@
5151
@AutoDetectableComponentHandler("utils")
5252
@RequiredArgsConstructor
5353
public class InteractionUtils implements ButtonHandler, ModalHandler, StringSelectMenuHandler {
54-
/**
55-
* Template Interaction ID for deleting the original Message.
56-
*/
57-
public static final String DELETE_ORIGINAL_TEMPLATE = "utils:delete";
5854
/**
5955
* Template Interaction ID for banning a single member from the current guild.
6056
*/
@@ -72,6 +68,11 @@ public class InteractionUtils implements ButtonHandler, ModalHandler, StringSele
7268
*/
7369
public static final String WARN_TEMPLATE = "utils:warn:%s";
7470

71+
/**
72+
* Template Interaction ID for deleting the original Message.
73+
*/
74+
private static final String DELETE_ORIGINAL_TEMPLATE = "utils:delete:%d";
75+
7576
private final NotificationService notificationService;
7677
private final BotConfig botConfig;
7778
private final WarnRepository warnRepository;
@@ -83,28 +84,38 @@ public class InteractionUtils implements ButtonHandler, ModalHandler, StringSele
8384
* of the message, a staff member, or the owner.
8485
*
8586
* @param interaction The button interaction.
87+
* @param componentId The split id of the interaction component.
8688
* @return the {@link ReplyCallbackAction} for responding to the request
8789
*/
8890
@CheckReturnValue
89-
private InteractionCallbackAction<?> delete(@NotNull ButtonInteraction interaction) {
91+
private InteractionCallbackAction<?> delete(@NotNull ButtonInteraction interaction, String[] componentId) {
9092
Member member = interaction.getMember();
9193
if (member == null) {
9294
return Responses.warning(interaction, "Could not get member.");
9395
}
9496
GuildConfig config = botConfig.get(interaction.getGuild());
9597
Message msg = interaction.getMessage();
96-
if (
97-
member.getUser().getIdLong() == msg.getAuthor().getIdLong() ||
98-
member.getRoles().contains(config.getModerationConfig().getStaffRole()) ||
99-
member.isOwner()
100-
) {
98+
99+
String authorId = "";
100+
101+
if (componentId.length>1) {
102+
authorId = componentId[1];
103+
}
104+
105+
if (authorId.equals(member.getUser().getId()) ||
106+
member.getRoles().contains(config.getModerationConfig().getStaffRole()) ||
107+
member.isOwner()) {
101108
msg.delete().queue();
102109
return interaction.deferEdit();
103110
} else {
104111
return Responses.warning(interaction, "You don't have permission to delete this message.");
105112
}
106113
}
107114

115+
public static Button createDeleteButton(long senderId) {
116+
return Button.secondary(DELETE_ORIGINAL_TEMPLATE.formatted(senderId), "\uD83D\uDDD1️");
117+
}
118+
108119
private void kick(ModalInteraction interaction, @NotNull Guild guild, String memberId, String reason) {
109120
if(!interaction.getMember().hasPermission(Permission.KICK_MEMBERS)) {
110121
Responses.error(interaction.getHook(), "Missing permissions").queue();
@@ -119,7 +130,7 @@ private void kick(ModalInteraction interaction, @NotNull Guild guild, String mem
119130
}, error -> Responses.error(interaction.getHook(), "Could not find member: " + error.getMessage()).queue()
120131
);
121132
}
122-
133+
123134
private void warn(ModalInteraction interaction, @NotNull Guild guild, String memberId, WarnSeverity severity, String reason) {
124135
if(!interaction.getMember().hasPermission(Permission.MODERATE_MEMBERS)) {
125136
Responses.error(interaction.getHook(), "Missing permissions").queue();
@@ -149,7 +160,7 @@ private void ban(ModalInteraction interaction, @NotNull Guild guild, String memb
149160
}, error -> Responses.error(interaction.getHook(), "Could not find member: " + error.getMessage()).queue()
150161
);
151162
}
152-
163+
153164
private void resolveIfInReport(MessageChannelUnion currentChannel, User actioner) {
154165
if (!currentChannel.getType().isThread()) {
155166
return;
@@ -178,9 +189,9 @@ public void handleButton(@NotNull ButtonInteractionEvent event, @NotNull Button
178189
Responses.error(event.getHook(), "This button may only be used in context of a server.").queue();
179190
return;
180191
}
181-
192+
182193
(switch (id[1]) {
183-
case "delete" -> delete(event.getInteraction());
194+
case "delete" -> delete(event.getInteraction(), id);
184195
case "kick" -> generateModal(event, "Kick user");
185196
case "ban" -> generateModal(event, "Ban user");
186197
case "unban" -> generateModal(event, "Unban user");
@@ -209,21 +220,21 @@ public void handleModal(@Nonnull ModalInteractionEvent event, @Nonnull List<Moda
209220
}
210221
String reason = "None";
211222
WarnSeverity severity = WarnSeverity.MEDIUM;
212-
223+
213224
if (id.length > 3) {
214225
try {
215226
severity = WarnSeverity.valueOf(id[3]);
216227
} catch (IllegalArgumentException e) {
217228
ExceptionLogger.capture(e, "Cannot load warn severity");
218229
}
219230
}
220-
231+
221232
for (ModalMapping mapping : mappings) {
222233
if ("reason".equals(mapping.getId())) {
223234
reason = mapping.getAsString();
224235
}
225236
}
226-
237+
227238
switch (id[1]) {
228239
case "kick" -> kick(event.getInteraction(), event.getGuild(), id[2], reason);
229240
case "ban" -> ban(event.getInteraction(), event.getGuild(), id[2], reason);

0 commit comments

Comments
 (0)