Skip to content

Commit 3bc9739

Browse files
committed
fixed minor issues
1 parent 8dece97 commit 3bc9739

3 files changed

Lines changed: 90 additions & 82 deletions

File tree

src/main/java/net/discordjug/javabot/systems/user_commands/format_code/FormatCodeDispatcher.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.dv8tion.jda.api.entities.Message;
77
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
88
import net.dv8tion.jda.api.interactions.commands.CommandInteraction;
9+
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
910
import org.jetbrains.annotations.Contract;
1011
import org.jetbrains.annotations.NotNull;
1112

@@ -44,7 +45,7 @@ public static void sendCode(Code code, @Nonnull CommandInteraction event, Messag
4445
MessageChannel channel = target.getChannel();
4546

4647
if (messages.size() > MAX_MESSAGES) {
47-
Responses.errorWithTitle(event.getHook(), "Code out of Bound", "The formatted result is too large to send. Please provide a smaller code snippet or use a paste service instead."
48+
Responses.errorWithTitle(event.getHook(), "Code out of Bounds", "The formatted result is too large to send. Please provide a smaller code snippet or use a paste service instead."
4849
).queue();
4950
return;
5051
}
@@ -55,26 +56,39 @@ public static void sendCode(Code code, @Nonnull CommandInteraction event, Messag
5556

5657
private static void sendChunksInOrder(MessageChannel channel, List<String> messages, int index, Message target, @Nonnull CommandInteraction event, long firstMessageID) {
5758
if (index >= messages.size()) {
58-
event.getHook().sendMessage("Your message has been set. If needed, you can change the language used for syntax highlighting below.")
59-
.setEphemeral(true)
60-
.setComponents(FormatCodeInteractionHandler.buildLanguageMenu(event.getUser().getIdLong(), messages.size(), firstMessageID))
61-
.queue();
59+
event.getHook().deleteOriginal().queue(_ ->
60+
event.getHook().sendMessage("Your message has been sent. If needed, you can change the language used for syntax highlighting below.")
61+
.setEphemeral(true)
62+
.setComponents(FormatCodeInteractionHandler.buildLanguageMenu(event.getUser().getIdLong(), messages.size(), firstMessageID))
63+
.queue()
64+
);
6265
return;
6366
}
64-
var action = channel.sendMessage(messages.get(index))
67+
MessageCreateAction action = channel.sendMessage(messages.get(index))
6568
.setAllowedMentions(List.of());
6669

6770
if (index == messages.size() - 1) {
68-
action.setComponents(buildActionRow(target, event.getUser().getIdLong(), messages.size()));
71+
if(messages.size() >1) {
72+
action.setComponents(buildMultiMessageActionRow(target, event.getUser().getIdLong(), messages.size(), firstMessageID));
73+
} else {
74+
action.setComponents(buildActionRow(target,event.getUser().getIdLong()));
75+
}
6976
}
7077

7178
action.queue(sent -> sendChunksInOrder(channel, messages, index + 1, target, event, index == 0 ? sent.getIdLong() : firstMessageID));
7279
}
7380

74-
@Contract("_,_,_ -> new")
75-
static @NotNull ActionRow buildActionRow(@NotNull Message target, long requesterId, int total) {
81+
@Contract("_,_,_,_ -> new")
82+
static @NotNull ActionRow buildMultiMessageActionRow(@NotNull Message target, long requesterId, int total, long firstMessageID) {
7683
return ActionRow.of(
77-
FormatCodeInteractionHandler.createDeleteAllButton(requesterId, total),
84+
FormatCodeInteractionHandler.createDeleteAllButton(requesterId, total, firstMessageID ),
85+
Button.link(target.getJumpUrl(), "View Original"));
86+
}
87+
88+
@Contract("_,_-> new")
89+
static @NotNull ActionRow buildActionRow(@NotNull Message target, long requesterId) {
90+
return ActionRow.of(
91+
InteractionUtils.createDeleteButton(requesterId),
7892
Button.link(target.getJumpUrl(), "View Original"));
7993
}
8094
}

src/main/java/net/discordjug/javabot/systems/user_commands/format_code/FormatCodeInteractionHandler.java

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.dv8tion.jda.api.entities.Member;
1313
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
1414
import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;
15+
import net.dv8tion.jda.api.interactions.components.ComponentInteraction;
1516
import org.jspecify.annotations.NonNull;
1617
import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler;
1718
import xyz.dynxsty.dih4jda.interactions.components.StringSelectMenuHandler;
@@ -34,22 +35,32 @@ public class FormatCodeInteractionHandler implements ButtonHandler, StringSelect
3435
/**
3536
* Builds the delete-all button placed on the last message of a code block.
3637
*
37-
* @param requesterID the id of the user allowed to delete the block
38-
* @param total the number of messages making up the block
38+
* @param requesterID the id of the user allowed to delete the block
39+
* @param total the number of messages making up the block
40+
* @param firstMessageID the id of first message to check update code block
3941
* @return the delete-all button
4042
*/
41-
public static Button createDeleteAllButton(long requesterID, int total) {
42-
return Button.secondary(ComponentIdBuilder.build(COMPONENT_ID, requesterID, total), "\uD83D\uDDD1\uFE0F");
43+
public static Button createDeleteAllButton(long requesterID, int total, long firstMessageID) {
44+
return Button.secondary(ComponentIdBuilder.build(COMPONENT_ID, requesterID, total,firstMessageID), "\uD83D\uDDD1\uFE0F");
4345
}
4446

45-
private static StringSelectMenu languageMenu(String customId) {
46-
return StringSelectMenu.create(customId)
47-
.setPlaceholder("Change language")
48-
.addOptions(Arrays.stream(Language.values())
49-
.filter(language -> language != Language.UNKNOWN)
50-
.map(language -> SelectOption.of(language.getDisplayName(), language.name()))
51-
.toList())
52-
.build();
47+
@Override
48+
public void handleButton(ButtonInteractionEvent event, @NonNull Button button) {
49+
if (!isValid(event)) {
50+
return;
51+
}
52+
String[] id = ComponentIdBuilder.split(event.getComponentId());
53+
54+
event.deferEdit().queue();
55+
56+
LinkedMessages.resolveBefore(event.getMessage(), Integer.parseInt(id[2]), true,
57+
messages -> {
58+
if (messages.getLast().getIdLong() == Long.parseLong(id[3])) {
59+
event.getChannel().purgeMessages(messages);
60+
} else {
61+
Responses.error(event.getHook(), "The code block could not be deleted. The messages may have been deleted.").queue();
62+
}
63+
}, () -> Responses.error(event.getHook(), "Could not delete the code block").queue());
5364
}
5465

5566
/**
@@ -65,58 +76,51 @@ public static ActionRow buildLanguageMenu(long requesterId, int total, long firs
6576
}
6677

6778
@Override
68-
public void handleButton(ButtonInteractionEvent event, @NonNull Button button) {
69-
String[] id = ComponentIdBuilder.split(event.getComponentId());
70-
long requesterId = Long.parseLong(id[1]);
71-
72-
Member member = event.getMember();
73-
if (member == null) {
74-
Responses.errorWithTitle(event, "Server Required", "This button may only be used inside a server.").queue();
75-
return;
76-
}
77-
if (!canManage(member, requesterId)) {
78-
Responses.errorWithTitle(event, "Access Denied", "You are not authorized to perform this action.").queue();
79+
public void handleStringSelectMenu(@NonNull StringSelectInteractionEvent event, @NonNull List<String> values) {
80+
if (!isValid(event)) {
7981
return;
8082
}
8183

84+
String[] id = ComponentIdBuilder.split(event.getComponentId());
85+
Language language = Language.fromString(values.getFirst());
86+
8287
event.deferEdit().queue();
8388

84-
LinkedMessages.resolveBefore(event.getMessage(), Integer.parseInt(id[2]),
85-
messages -> event.getChannel().purgeMessages(messages),
86-
() -> Responses.errorWithTitle(event.getHook(), "Undefined Behavior", "Could not delete the code block").queue());
89+
LinkedMessages.resolveBefore(event.getMessage(), Integer.parseInt(id[2]), false,
90+
messages -> {
91+
if (messages.getLast().getIdLong() == Long.parseLong(id[3])) {
92+
messages.forEach(message -> message.editMessage(withLanguage(message.getContentRaw(), language)).queue());
93+
} else {
94+
Responses.error(event.getHook(), "The code block could not be updated. The messages may have been deleted.").queue();
95+
}
96+
}, () -> Responses.error(event.getHook(), "Could not update the code block").queue());
8797
}
8898

89-
@Override
90-
public void handleStringSelectMenu(@NonNull StringSelectInteractionEvent event, @NonNull List<String> values) {
99+
private static StringSelectMenu languageMenu(String customId) {
100+
return StringSelectMenu.create(customId)
101+
.setPlaceholder("Change language")
102+
.addOptions(Arrays.stream(Language.values())
103+
.filter(language -> language != Language.UNKNOWN)
104+
.map(language -> SelectOption.of(language.getDisplayName(), language.name()))
105+
.toList())
106+
.build();
107+
}
108+
109+
private boolean isValid(ComponentInteraction event) {
91110
String[] id = ComponentIdBuilder.split(event.getComponentId());
92111
long requesterId = Long.parseLong(id[1]);
93112

94113
Member member = event.getMember();
95114
if (member == null) {
96-
Responses.errorWithTitle(event, "Server Required", "This menu may only be used inside a server.").queue();
97-
return;
115+
Responses.errorWithTitle(event, "Server Required", "This button may only be used inside a server.").queue();
116+
return false;
98117
}
99-
if (!canManage(member, requesterId)) {
118+
if (!(member.getIdLong() == requesterId || Checks.hasStaffRole(botConfig, member))) {
100119
Responses.errorWithTitle(event, "Access Denied", "You are not authorized to perform this action.").queue();
101-
return;
120+
return false;
102121
}
103122

104-
Language language = Language.fromString(values.getFirst());
105-
event.deferEdit().queue();
106-
107-
LinkedMessages.resolveAfter(event.getMessage(), Integer.parseInt(id[2]), messages -> {
108-
if (messages.getLast().getIdLong() == Long.parseLong(id[3])) {
109-
messages.forEach(message -> message.editMessage(withLanguage(message.getContentRaw(), language)).queue());
110-
} else {
111-
Responses.errorWithTitle(event.getHook(), "Merge Conflict", "The code block could not be updated. The messages may have been deleted.").queue();
112-
}
113-
}, () -> Responses.errorWithTitle(event.getHook(), "Undefined Behavior", "Could not update the code block").queue());
114-
}
115-
116-
private boolean canManage(Member member, long requesterId) {
117-
return member.getIdLong() == requesterId
118-
|| Checks.hasStaffRole(botConfig, member)
119-
|| member.isOwner();
123+
return true;
120124
}
121125

122126
/**

src/main/java/net/discordjug/javabot/systems/user_commands/format_code/LinkedMessages.java

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,42 +17,32 @@ private LinkedMessages() {
1717
}
1818

1919
/**
20-
* Resolves the block ending at {@code triggerMessage} (walking back {@code total} messages) and
21-
* passes the bot's own messages to {@code onResolved}, ordered from newest to oldest.
22-
* Runs {@code onError} if the block can't be safely resolved.
20+
* Resolves a block of messages ending at {@code triggerMessage} and passes the
21+
* bot's own messages to {@code onResolved}, ordered from newest to oldest.
22+
* If {@code inclusive} is {@code true}, {@code triggerMessage} is included in
23+
* the resolved block; otherwise, only the preceding {@code total} messages are
24+
* considered. Runs {@code onError} if the block can't be safely resolved.
2325
*
24-
* @param triggerMessage the last message of the block (carries the component)
25-
* @param total the number of messages in the block
26+
* @param triggerMessage the message marking the end of the block
27+
* @param total the number of messages to resolve
28+
* @param inclusive whether {@code triggerMessage} should be included in the resolved block
2629
* @param onResolved receives the bot's messages, ordered from newest to oldest
2730
* @param onError runs if the block can't be safely resolved
2831
*/
29-
static void resolveBefore(Message triggerMessage, int total, Consumer<List<Message>> onResolved, Runnable onError) {
30-
if (total <= 1) {
32+
static void resolveBefore(Message triggerMessage, int total, boolean inclusive,Consumer<List<Message>> onResolved, Runnable onError) {
33+
if (total <= 1 && inclusive) {
3134
verify(List.of(triggerMessage), total, onResolved, onError);
3235
return;
3336
}
34-
triggerMessage.getChannel().getHistoryBefore(triggerMessage.getIdLong(), total - 1).queue(history -> {
37+
triggerMessage.getChannel().getHistoryBefore(triggerMessage.getIdLong(), inclusive?total-1 :total).queue(history -> {
3538
List<Message> block = new ArrayList<>(history.getRetrievedHistory());
36-
block.add(triggerMessage);
39+
if (inclusive){
40+
block.addFirst(triggerMessage);
41+
}
3742
verify(block, total, onResolved, onError);
3843
});
3944
}
4045

41-
/**
42-
* Resolves the block of {@code total} messages sent after {@code anchorMessage} and passes the
43-
* bot's own messages to {@code onResolved}, ordered from newest to oldest.
44-
* Runs {@code onError} if the block can't be safely resolved.
45-
*
46-
* @param anchorMessage the message just before the block (carries the component)
47-
* @param total the number of messages in the block
48-
* @param onResolved receives the bot's messages, ordered from newest to oldest
49-
* @param onError runs if the block can't be safely resolved
50-
*/
51-
static void resolveAfter(Message anchorMessage, int total, Consumer<List<Message>> onResolved, Runnable onError) {
52-
anchorMessage.getChannel().getHistoryAfter(anchorMessage.getIdLong(), total).queue(history ->
53-
verify(history.getRetrievedHistory(), total, onResolved, onError));
54-
}
55-
5646
private static void verify(List<Message> messages, int total, Consumer<List<Message>> onResolved, Runnable onError) {
5747
List<Message> own = onlyOwn(messages);
5848
boolean allCodeBlocks = own.stream().allMatch(message -> message.getContentRaw().startsWith("```"));

0 commit comments

Comments
 (0)