|
1 | 1 | package net.javadiscord.javabot.systems.help.commands; |
2 | 2 |
|
3 | | -import net.dv8tion.jda.api.EmbedBuilder; |
| 3 | +import net.dv8tion.jda.api.OnlineStatus; |
4 | 4 | import net.dv8tion.jda.api.entities.Guild; |
5 | 5 | import net.dv8tion.jda.api.entities.Member; |
6 | | -import net.dv8tion.jda.api.entities.Message; |
7 | | -import net.dv8tion.jda.api.entities.MessageEmbed; |
8 | 6 | import net.dv8tion.jda.api.entities.Role; |
9 | | -import net.dv8tion.jda.api.entities.User; |
10 | 7 | import net.dv8tion.jda.api.entities.channel.ChannelType; |
11 | 8 | import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; |
12 | 9 | import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; |
13 | 10 | import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; |
14 | 11 | import net.javadiscord.javabot.data.config.BotConfig; |
15 | 12 | import net.javadiscord.javabot.data.config.GuildConfig; |
16 | 13 | import net.javadiscord.javabot.data.config.guild.HelpConfig; |
| 14 | +import net.javadiscord.javabot.util.ExceptionLogger; |
17 | 15 | import net.javadiscord.javabot.util.Pair; |
18 | 16 | import net.javadiscord.javabot.util.Responses; |
19 | 17 | import org.jetbrains.annotations.NotNull; |
20 | 18 | import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; |
21 | 19 |
|
22 | | -import java.util.EnumSet; |
| 20 | +import java.time.OffsetDateTime; |
| 21 | +import java.util.Collections; |
23 | 22 | import java.util.List; |
24 | 23 | import java.util.Map; |
25 | 24 | import java.util.Set; |
26 | 25 | import java.util.concurrent.ConcurrentHashMap; |
27 | 26 | import java.util.concurrent.ScheduledExecutorService; |
28 | 27 | import java.util.concurrent.TimeUnit; |
| 28 | +import java.util.stream.Collectors; |
29 | 29 |
|
30 | 30 | /** |
31 | 31 | * Handler for the /help ping sub-command that allows users to occasionally ping |
@@ -74,25 +74,44 @@ public void execute(@NotNull SlashCommandInteractionEvent event) { |
74 | 74 | Responses.warning(event, "Sorry, but only the person who reserved this channel, or staff and helpers, may use this command.").queue(); |
75 | 75 | return; |
76 | 76 | } |
| 77 | + if (post.getTimeCreated().isAfter(OffsetDateTime.now().minusSeconds(config.getHelpConfig().getHelpPingTimeoutSeconds()))) { |
| 78 | + Responses.warning(event, "Sorry, this command cannot be used directly after a post has been created.").queue(); |
| 79 | + return; |
| 80 | + } |
77 | 81 | if (isHelpPingTimeoutElapsed(member.getIdLong(), config)) { |
78 | 82 | lastPingTimes.put(event.getMember().getIdLong(), new Pair<>(System.currentTimeMillis(), config.getGuild())); |
79 | 83 | Role role = config.getHelpConfig().getHelpPingRole(); |
80 | | - event.getChannel().sendMessage(role.getAsMention()) |
81 | | - .setAllowedMentions(EnumSet.of(Message.MentionType.ROLE)) |
82 | | - .setEmbeds(buildAuthorEmbed(event.getUser())) |
83 | | - .queue(); |
84 | | - event.replyFormat("Successfully pinged " + role.getAsMention()).setEphemeral(true).queue(); |
| 84 | + role.getGuild().findMembersWithRoles(role).onSuccess(members->{ |
| 85 | + post.retrieveThreadMembers().queue(threadMembers -> { |
| 86 | + Set<Long> memberIds = threadMembers |
| 87 | + .stream() |
| 88 | + .map(m->m.getIdLong()) |
| 89 | + .collect(Collectors.toSet()); |
| 90 | + members.removeIf(m -> |
| 91 | + m.getOnlineStatus() == OnlineStatus.OFFLINE || |
| 92 | + memberIds.contains(m.getIdLong())); |
| 93 | + Collections.shuffle(members); |
| 94 | + if(members.size()>0) { |
| 95 | + post.addThreadMember(members.get(0)).queue(); |
| 96 | + event.getHook().sendMessage("Successfully added a user with the help-ping role to the post.").setEphemeral(true).queue(); |
| 97 | + }else { |
| 98 | + event.getHook().sendMessage("Unfortunately, no available member with the help-ping role has been found.").queue(); |
| 99 | + } |
| 100 | + }, err -> { |
| 101 | + event.getHook().sendMessage("An error occured trying to find available members").queue(); |
| 102 | + ExceptionLogger.capture(err, HelpPingSubcommand.class.getName()); |
| 103 | + }); |
| 104 | + |
| 105 | + }).onError(err -> { |
| 106 | + event.getHook().sendMessage("An error occured trying to find available members").queue(); |
| 107 | + ExceptionLogger.capture(err, HelpPingSubcommand.class.getName()); |
| 108 | + }); |
| 109 | + event.deferReply(true).queue(); |
85 | 110 | } else { |
86 | 111 | Responses.warning(event, "Sorry, but you can only use this command occasionally. Please try again later.").queue(); |
87 | 112 | } |
88 | 113 | } |
89 | 114 |
|
90 | | - private @NotNull MessageEmbed buildAuthorEmbed(@NotNull User author) { |
91 | | - return new EmbedBuilder() |
92 | | - .setTitle("Requested by " + author.getAsTag()) |
93 | | - .build(); |
94 | | - } |
95 | | - |
96 | 115 | /** |
97 | 116 | * Determines if a user is forbidden from sending a help-ping command due |
98 | 117 | * to their status in the server. |
|
0 commit comments