1212import net .dv8tion .jda .api .entities .Member ;
1313import net .dv8tion .jda .api .events .interaction .component .ButtonInteractionEvent ;
1414import net .dv8tion .jda .api .events .interaction .component .StringSelectInteractionEvent ;
15+ import net .dv8tion .jda .api .interactions .components .ComponentInteraction ;
1516import org .jspecify .annotations .NonNull ;
1617import xyz .dynxsty .dih4jda .interactions .components .ButtonHandler ;
1718import 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 /**
0 commit comments