55import net .discordjug .javabot .data .config .BotConfig ;
66import net .discordjug .javabot .util .Checks ;
77import net .discordjug .javabot .util .Responses ;
8+ import net .dv8tion .jda .api .components .Component ;
89import net .dv8tion .jda .api .components .actionrow .ActionRow ;
910import net .dv8tion .jda .api .components .buttons .Button ;
1011import net .dv8tion .jda .api .components .selections .SelectOption ;
1112import net .dv8tion .jda .api .components .selections .StringSelectMenu ;
1213import net .dv8tion .jda .api .entities .Member ;
1314import net .dv8tion .jda .api .entities .Message ;
14- import java .util .stream .Stream ;
15+
16+ import java .util .ArrayList ;
17+
1518import net .dv8tion .jda .api .events .interaction .component .ButtonInteractionEvent ;
1619import net .dv8tion .jda .api .events .interaction .component .StringSelectInteractionEvent ;
1720import org .jspecify .annotations .NonNull ;
@@ -40,8 +43,8 @@ public class FormatCodeInteractionHandler implements ButtonHandler, StringSelect
4043 * @param total the number of messages making up the block
4144 * @return the delete-all button
4245 */
43- public static Button createDeleteAllButton (long requesterID , int total ){
44- return Button .secondary (ComponentIdBuilder .build (COMPONENT_ID ,requesterID ,total ),"\uD83D \uDDD1 \uFE0F " );
46+ public static Button createDeleteAllButton (long requesterID , int total ) {
47+ return Button .secondary (ComponentIdBuilder .build (COMPONENT_ID , requesterID , total ), "\uD83D \uDDD1 \uFE0F " );
4548 }
4649
4750 private static StringSelectMenu languageMenu (String customId ) {
@@ -85,7 +88,7 @@ public void handleButton(ButtonInteractionEvent event, @NonNull Button button) {
8588
8689 LinkedMessages .resolveBefore (event .getMessage (), Integer .parseInt (id [2 ]),
8790 messages -> event .getChannel ().purgeMessages (messages ),
88- () -> Responses .error (event .getHook (),"Could not delete the code block" ).queue ());
91+ () -> Responses .error (event .getHook (), "Could not delete the code block" ).queue ());
8992 }
9093
9194 @ Override
@@ -106,32 +109,38 @@ public void handleStringSelectMenu(@NonNull StringSelectInteractionEvent event,
106109 Language language = Language .fromString (values .getFirst ());
107110 event .deferEdit ().queue ();
108111
109- Runnable onError = () -> Responses .error (event .getHook (),
110- "Could not update the code block — it may have changed or no longer be yours." ).queue ();
111112 LinkedMessages .resolveAfter (event .getMessage (), Integer .parseInt (id [2 ]),
112113 messages -> {
113114 if (ownsBlock (messages , event .getUser ().getIdLong ())) {
114115 messages .forEach (message ->
115116 message .editMessage (withLanguage (message .getContentRaw (), language )).queue ());
116117 } else {
117- onError . run ();
118+ Responses . error ( event . getHook (), "Could not update the code block — it may have changed or no longer be yours." ). queue ();
118119 }
119- },
120- onError );
120+ }, () -> Responses .error (event .getHook (), "Could not update the code block — it may have changed or no longer be yours." ).queue ());
121121 }
122122
123123 private static boolean ownsBlock (List <Message > messages , long userId ) {
124- Message last = messages .get (messages .size () - 1 );
125- boolean lastIsUsers = buttonsOf (last ).anyMatch (button -> isDeleteButtonOf (button , userId ));
126- boolean noOtherHasButton = messages .subList (0 , messages .size () - 1 ).stream ()
127- .flatMap (FormatCodeInteractionHandler ::buttonsOf )
128- .noneMatch (FormatCodeInteractionHandler ::isDeleteButton );
124+ Message last = messages .getFirst ();
125+ boolean lastIsUsers = buttonsOf (last ).stream ().anyMatch (button -> isDeleteButtonOf (button , userId ));
126+ boolean noOtherHasButton = messages .size () <= 1 ;
127+ for (Message message : messages .subList (0 ,messages .size ()-1 )){
128+ for (Button button : buttonsOf (message )){
129+ if (isDeleteButton (button )){
130+ noOtherHasButton = true ;
131+ }
132+ }
133+ }
129134 return lastIsUsers && noOtherHasButton ;
130135 }
131136
132- private static Stream <Button > buttonsOf (Message message ) {
133- return message .getComponents ().stream ()
134- .flatMap (component -> component instanceof ActionRow row ? row .getButtons ().stream () : Stream .of ());
137+ private static List <Button > buttonsOf (Message message ) {
138+ for (Component component : message .getComponents ()) {
139+ if (component instanceof ActionRow row ) {
140+ return row .getButtons ();
141+ }
142+ }
143+ return new ArrayList <>();
135144 }
136145
137146 private static boolean isDeleteButton (Button button ) {
0 commit comments