|
5 | 5 | import net.dv8tion.jda.api.JDA; |
6 | 6 | import net.dv8tion.jda.api.entities.*; |
7 | 7 | import net.dv8tion.jda.api.entities.emoji.Emoji; |
| 8 | +import net.dv8tion.jda.api.interactions.components.buttons.Button; |
8 | 9 | import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle; |
9 | 10 | import net.dv8tion.jda.api.requests.RestAction; |
10 | 11 | import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; |
11 | 12 | import net.dv8tion.jda.internal.interactions.component.ButtonImpl; |
12 | 13 | import net.dv8tion.jda.internal.requests.CompletedRestAction; |
| 14 | +import net.javadiscord.javabot.Bot; |
13 | 15 | import net.javadiscord.javabot.data.config.guild.HelpConfig; |
14 | 16 | import net.javadiscord.javabot.systems.help.model.ChannelReservation; |
15 | 17 | import net.javadiscord.javabot.util.ExceptionLogger; |
16 | 18 | import net.javadiscord.javabot.util.Responses; |
| 19 | +import net.javadiscord.javabot.util.StringResourceCache; |
| 20 | +import net.javadiscord.javabot.util.StringUtils; |
17 | 21 | import org.jetbrains.annotations.NotNull; |
18 | 22 |
|
19 | 23 | import java.sql.SQLException; |
@@ -55,14 +59,15 @@ public HelpChannelUpdater(JDA jda, HelpConfig config, List<ChannelSemanticCheck> |
55 | 59 | @Override |
56 | 60 | public void run() { |
57 | 61 | for (TextChannel channel : config.getReservedChannelCategory().getTextChannels()) { |
58 | | - this.checkReservedChannel(channel).queue(); |
| 62 | + checkReservedChannel(channel).queue(); |
59 | 63 | } |
60 | 64 | for (TextChannel channel : config.getOpenChannelCategory().getTextChannels()) { |
61 | | - this.checkOpenChannel(channel).queue(); |
| 65 | + checkOpenChannel(channel).queue(); |
62 | 66 | } |
63 | | - this.balanceChannels(); |
64 | | - if (config.getHelpOverviewChannel() != null) { |
65 | | - this.updateHelpOverview(); |
| 67 | + balanceChannels(); |
| 68 | + // periodically update the Help Channel Overview Message |
| 69 | + if (config.getHelpOverviewMessageIds() != null && !config.getHelpOverviewMessageIds().isEmpty()) { |
| 70 | + updateHelpOverview(); |
66 | 71 | } |
67 | 72 | } |
68 | 73 |
|
@@ -366,49 +371,63 @@ private RestAction<?> semanticMessageCheck(TextChannel channel, User owner, List |
366 | 371 | } |
367 | 372 |
|
368 | 373 | private void updateHelpOverview() { |
369 | | - TextChannel channel = config.getHelpOverviewChannel(); |
370 | | - MessageHistory history = channel.getHistory(); |
371 | | - history.retrievePast(100).queue( |
372 | | - messages -> { |
373 | | - Optional<Message> latestMessage = messages.stream().filter(m -> m.getAuthor().equals(jda.getSelfUser())).findFirst(); |
374 | | - if (latestMessage.isPresent()) { |
375 | | - latestMessage.get().editMessageEmbeds(buildHelpOverviewEmbed()).queue(); |
376 | | - } else { |
377 | | - channel.sendMessageEmbeds(buildHelpOverviewEmbed()).queue(); |
378 | | - } |
379 | | - } |
380 | | - ); |
| 374 | + config.getHelpOverviewMessageIds().forEach((channelId, messageId) -> { |
| 375 | + TextChannel channel = config.getGuild().getTextChannelById(channelId); |
| 376 | + if (channel == null) { |
| 377 | + log.error("Could not find Help Overview Channel with id '{}'", channelId); |
| 378 | + return; |
| 379 | + } |
| 380 | + List<TextChannel> availableChannels = config.getOpenChannelCategory().getTextChannels(); |
| 381 | + List<Button> buttons = new ArrayList<>(2); |
| 382 | + if (!availableChannels.isEmpty()) { |
| 383 | + buttons.add(Button.link(StringUtils.buildChannelJumpUrl(availableChannels.get(0)), "Show me an available Help Channel!")); |
| 384 | + } |
| 385 | + buttons.add(Button.link(StringResourceCache.load("/help_overview/overview_image_url.txt"), "How does this work?")); |
| 386 | + channel.retrieveMessageById(messageId).queue( |
| 387 | + m -> m.editMessageEmbeds(buildHelpOverviewEmbed()).setActionRow(buttons).queue(), |
| 388 | + err -> channel.sendMessageEmbeds(buildHelpOverviewEmbed()).queue(m -> { |
| 389 | + config.getHelpOverviewMessageIds().put(channelId, m.getIdLong()); |
| 390 | + Bot.getConfig().flush(); |
| 391 | + log.info("Successfully created new Help Overview Message in '{}' on message with id '{}'", channelId, m.getId()); |
| 392 | + }) |
| 393 | + ); |
| 394 | + }); |
381 | 395 | } |
382 | 396 |
|
383 | | - private MessageEmbed buildHelpOverviewEmbed() { |
| 397 | + private @NotNull MessageEmbed buildHelpOverviewEmbed() { |
384 | 398 | String availableHelpChannels = config.getOpenChannelCategory().getTextChannels() |
385 | 399 | .stream() |
386 | 400 | .map(TextChannel::getAsMention) |
387 | | - .collect(Collectors.joining("\n")); |
| 401 | + .collect(Collectors.joining(", ")); |
388 | 402 | StringBuilder reservedHelpChannels = new StringBuilder(); |
389 | 403 | for (TextChannel channel : config.getReservedChannelCategory().getTextChannels()) { |
390 | 404 | Optional<ChannelReservation> optional = channelManager.getReservationForChannel(channel.getIdLong()); |
391 | 405 | if (optional.isEmpty()) continue; |
392 | 406 | ChannelReservation reservation = optional.get(); |
| 407 | + // Attempt to fetch the user. As JDA will cache the user upon retrieval, this may be too 'slow' on the first run (for the appending), |
| 408 | + // but will automatically fix itself after the embed is updated again. |
393 | 409 | jda.retrieveUserById(reservation.getUserId()).queue( |
394 | | - u -> reservedHelpChannels.append(String.format(""" |
| 410 | + user -> reservedHelpChannels.append(String.format(""" |
395 | 411 | %s |
396 | 412 | Reserved by %s <t:%s:R> |
397 | 413 | |
398 | | - """, channel.getAsMention(), u.getAsMention(), |
| 414 | + """, channel.getAsMention(), user.getAsMention(), |
399 | 415 | reservation.getReservedAt().toEpochSecond(ZoneOffset.UTC))), |
400 | | - e -> { |
401 | | - } |
| 416 | + e -> ExceptionLogger.capture(e, getClass().getSimpleName()) |
402 | 417 | ); |
403 | 418 | } |
404 | | - return new EmbedBuilder() |
| 419 | + EmbedBuilder builder = new EmbedBuilder() |
405 | 420 | .setTitle("Help Overview") |
406 | 421 | .setColor(Responses.Type.DEFAULT.getColor()) |
407 | | - .addField("Available Help Channels", availableHelpChannels, false) |
408 | | - .addField("Reserved Help Channels", reservedHelpChannels.toString(), false) |
409 | | - .addField("Dormant Help Channels", String.format("%s dormant channels", config.getDormantChannelCategory().getTextChannels().size()), false) |
410 | | - .setFooter(String.format("Last refreshed: %s", Instant.now())) |
411 | | - .setTimestamp(Instant.now()) |
412 | | - .build(); |
| 422 | + .setDescription(availableHelpChannels + " are __**available**__ to claim!") |
| 423 | + .setFooter("Last refreshed: ") |
| 424 | + .setTimestamp(Instant.now()); |
| 425 | + if (!reservedHelpChannels.isEmpty()) { |
| 426 | + builder.addField("Reserved Help Channels", reservedHelpChannels.toString(), false); |
| 427 | + } |
| 428 | + if (!config.getDormantChannelCategory().getTextChannels().isEmpty()) { |
| 429 | + builder.addField("Dormant Help Channels", String.format("%s dormant channels", config.getDormantChannelCategory().getTextChannels().size()), false); |
| 430 | + } |
| 431 | + return builder.build(); |
413 | 432 | } |
414 | 433 | } |
0 commit comments