3232import java .awt .Color ;
3333import java .time .Instant ;
3434import java .time .temporal .ChronoUnit ;
35+ import java .util .Collections ;
3536import java .util .List ;
3637import java .util .Objects ;
3738import java .util .Optional ;
@@ -189,7 +190,8 @@ private MessageCreateAction createModMessage(String reportReason,
189190 .setColor (AMBIENT_COLOR )
190191 .build ();
191192
192- String historyButtonId = generateComponentId (Lifespan .REGULAR , reportedMessage .authorId );
193+ String historyButtonId =
194+ generateComponentId (Lifespan .REGULAR , reportedMessage .authorId , "0" );
193195
194196 MessageCreateAction message =
195197 modMailAuditLog .sendMessageEmbeds (reportedMessageEmbed , reportReasonEmbed )
@@ -249,13 +251,20 @@ static ReportedMessage ofArgs(List<String> args) {
249251
250252 @ Override
251253 public void onButtonClick (ButtonInteractionEvent event , List <String > args ) {
252- event .deferReply ().setEphemeral (true ).queue ();
254+ event .deferEdit ().queue ();
255+
256+ Guild guild =
257+ Objects .requireNonNull (event .getGuild (), "Guild cannot be null for this command." );
258+ long guildId = guild .getIdLong ();
259+
260+ long reportedUserId = Long .parseLong (args .get (0 ));
261+ int targetPage = Integer .parseInt (args .get (1 ));
253262
254- long guildId = event . getGuild (). getIdLong ();
255- long reportedUserId = Long . parseLong ( args . getFirst ( ));
263+ List < ActionRecord > actions = new java . util . ArrayList <>(
264+ moderationActionsStore . getActionsByTargetAscending ( guildId , reportedUserId ));
256265
257- List < ActionRecord > actions =
258- moderationActionsStore . getActionsByTargetAscending ( guildId , reportedUserId );
266+ Collections . reverse ( actions );
267+ List < List < ActionRecord >> pages = ModerationUtils . groupActionsByPages ( actions );
259268
260269 event .getJDA ().retrieveUserById (reportedUserId ).queue (user -> {
261270 EmbedBuilder auditEmbed =
@@ -264,33 +273,49 @@ public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
264273 .setColor (Color .BLACK )
265274 .setDescription (ModerationUtils .createSummaryMessageDescription (actions ));
266275
267- List <List <ActionRecord >> pages = ModerationUtils .groupActionsByPages (actions );
268-
269276 if (pages .isEmpty ()) {
270- event .getHook ().sendMessageEmbeds (auditEmbed .build ()).queue ();
277+ event .getHook ()
278+ .editOriginalEmbeds (auditEmbed .build ())
279+ .setComponents (Collections .emptyList ())
280+ .queue ();
271281 return ;
272282 }
273283
284+ int currentPageIndex = Math .clamp (targetPage , 0 , pages .size () - 1 );
285+
274286 List <net .dv8tion .jda .api .requests .RestAction <MessageEmbed .Field >> fieldTasks =
275- pages .getLast ( )
287+ pages .get ( currentPageIndex )
276288 .stream ()
277289 .map (action -> ModerationUtils .actionToField (action , event .getJDA ()))
278290 .toList ();
279291
280292 net .dv8tion .jda .api .requests .RestAction .allOf (fieldTasks ).queue (fields -> {
293+ auditEmbed .clearFields ();
281294 fields .forEach (auditEmbed ::addField );
282295
283- if (pages .size () > 1 ) {
284- auditEmbed .setFooter (
285- "Showing page %d/%d (Most recent actions). Use /audit to view full history."
286- .formatted (pages .size (), pages .size ()));
287- }
296+ auditEmbed .setFooter ("Page %d/%d (Most recent first)"
297+ .formatted (currentPageIndex + 1 , pages .size ()));
298+
299+ String prevButtonId = generateComponentId (Lifespan .REGULAR ,
300+ String .valueOf (reportedUserId ), String .valueOf (currentPageIndex - 1 ));
301+ String nextButtonId = generateComponentId (Lifespan .REGULAR ,
302+ String .valueOf (reportedUserId ), String .valueOf (currentPageIndex + 1 ));
303+
304+ Button prevButton = Button .primary (prevButtonId , "◀ Previous" )
305+ .withDisabled (currentPageIndex == 0 );
306+
307+ Button nextButton = Button .primary (nextButtonId , "Next ▶" )
308+ .withDisabled (currentPageIndex == pages .size () - 1 );
309+
310+ event .getHook ()
311+ .editOriginalEmbeds (auditEmbed .build ())
312+ .setActionRow (prevButton , nextButton )
313+ .queue ();
288314
289- event .getHook ().sendMessageEmbeds (auditEmbed .build ()).queue ();
290- }, throwable -> event .getHook ()
315+ }, _ -> event .getHook ()
291316 .sendMessage ("Could not load moderation history fields." )
292317 .queue ());
293- }, throwable -> event .getHook ()
318+ }, _ -> event .getHook ()
294319 .sendMessage ("Could not retrieve audit data for this user." )
295320 .queue ());
296321 }
0 commit comments