Skip to content

Commit 8cafb41

Browse files
committed
send help-ping info in distinct channel without ping
1 parent 490da05 commit 8cafb41

File tree

2 files changed

+116
-34
lines changed

2 files changed

+116
-34
lines changed

src/main/java/net/javadiscord/javabot/data/config/guild/HelpConfig.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.EqualsAndHashCode;
55
import net.dv8tion.jda.api.entities.Role;
66
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
7+
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
78
import net.javadiscord.javabot.data.config.GuildConfigItem;
89

910
import java.util.Map;
@@ -24,7 +25,7 @@ public class HelpConfig extends GuildConfigItem {
2425
/**
2526
* The id of the help-ping role.
2627
*/
27-
private long helpPingRoleId;
28+
private long helpNotificationChannelId;
2829

2930
/**
3031
* The message that's sent as soon as a user asks a question in an open help
@@ -108,7 +109,7 @@ public Role getHelperRole() {
108109
return getGuild().getRoleById(helperRoleId);
109110
}
110111

111-
public Role getHelpPingRole() {
112-
return getGuild().getRoleById(helpPingRoleId);
112+
public TextChannel getHelpNotificationChannel() {
113+
return getGuild().getTextChannelById(helpNotificationChannelId);
113114
}
114115
}

src/main/java/net/javadiscord/javabot/systems/help/commands/HelpPingSubcommand.java

Lines changed: 112 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
11
package net.javadiscord.javabot.systems.help.commands;
22

3-
import net.dv8tion.jda.api.OnlineStatus;
3+
import net.dv8tion.jda.api.EmbedBuilder;
44
import net.dv8tion.jda.api.entities.Guild;
55
import net.dv8tion.jda.api.entities.Member;
66
import net.dv8tion.jda.api.entities.Role;
77
import net.dv8tion.jda.api.entities.channel.ChannelType;
8+
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
89
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
10+
import net.dv8tion.jda.api.entities.channel.forums.ForumTag;
11+
import net.dv8tion.jda.api.entities.emoji.EmojiUnion;
912
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
13+
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
1014
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
15+
import net.dv8tion.jda.api.interactions.components.buttons.Button;
16+
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle;
17+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
1118
import net.javadiscord.javabot.data.config.BotConfig;
1219
import net.javadiscord.javabot.data.config.GuildConfig;
1320
import net.javadiscord.javabot.data.config.guild.HelpConfig;
14-
import net.javadiscord.javabot.util.ExceptionLogger;
1521
import net.javadiscord.javabot.util.Pair;
1622
import net.javadiscord.javabot.util.Responses;
1723
import org.jetbrains.annotations.NotNull;
1824
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;
25+
import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler;
26+
import xyz.dynxsty.dih4jda.util.ComponentIdBuilder;
1927

28+
import java.awt.Color;
2029
import java.time.OffsetDateTime;
21-
import java.util.Collections;
2230
import java.util.List;
2331
import java.util.Map;
2432
import java.util.Set;
@@ -31,7 +39,8 @@
3139
* Handler for the /help ping sub-command that allows users to occasionally ping
3240
* helpers.
3341
*/
34-
public class HelpPingSubcommand extends SlashCommand.Subcommand {
42+
@AutoDetectableComponentHandler("help-ping")
43+
public class HelpPingSubcommand extends SlashCommand.Subcommand implements ButtonHandler {
3544
private static final String WRONG_CHANNEL_MSG = "This command can only be used in **help forum posts**";
3645
private static final long CACHE_CLEANUP_DELAY = 60L;
3746

@@ -80,38 +89,61 @@ public void execute(@NotNull SlashCommandInteractionEvent event) {
8089
}
8190
if (isHelpPingTimeoutElapsed(member.getIdLong(), config)) {
8291
lastPingTimes.put(event.getMember().getIdLong(), new Pair<>(System.currentTimeMillis(), config.getGuild()));
83-
Role role = config.getHelpConfig().getHelpPingRole();
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.").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(false).queue();
92+
TextChannel notifChannel = config.getHelpConfig().getHelpNotificationChannel();
93+
notifChannel.sendMessageEmbeds(new EmbedBuilder().setDescription("""
94+
%s requested help in post %s
95+
96+
Tags:
97+
%s
98+
99+
[Post link](%s)
100+
"""
101+
.formatted(
102+
event.getUser().getAsMention(),
103+
post.getAsMention(),
104+
getTagString(post),
105+
post.getJumpUrl()
106+
))
107+
.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl())
108+
.setFooter(event.getUser().getId())
109+
.setColor(Color.YELLOW)
110+
.build())
111+
.addActionRow(createResolveButton())
112+
.queue();
113+
event.reply("""
114+
Successfully requested help.
115+
116+
Note that this does NOT gurantee that anybody here has the time and knowledge to help you.
117+
Abusing this command might result in moderative action taken against you.
118+
""")
119+
.setEphemeral(true)
120+
.queue();
110121
} else {
111122
Responses.warning(event, "Sorry, but you can only use this command occasionally. Please try again later.").queue();
112123
}
113124
}
114125

126+
private String getTagString(ThreadChannel post) {
127+
String text = post
128+
.getAppliedTags()
129+
.stream()
130+
.map(this::getForumTagText)
131+
.map(tag -> "- " + tag)
132+
.collect(Collectors.joining("\n"));
133+
if(text.isEmpty()) {
134+
text = "- <no tags>";
135+
}
136+
return text;
137+
}
138+
139+
private Button createResolveButton() {
140+
return Button.of(ButtonStyle.SECONDARY, ComponentIdBuilder.build("help-ping", "resolve"), "Mark as resolved");
141+
}
142+
143+
private Button createUnresolveButton() {
144+
return Button.of(ButtonStyle.SECONDARY, ComponentIdBuilder.build("help-ping", "unresolve"), "Mark as unresolved");
145+
}
146+
115147
/**
116148
* Determines if a user is forbidden from sending a help-ping command due
117149
* to their status in the server.
@@ -161,4 +193,53 @@ private void cleanTimeoutCache() {
161193
lastPingTimes.remove(memberId);
162194
}
163195
}
196+
197+
@Override
198+
public void handleButton(ButtonInteractionEvent event, Button button) {
199+
String[] id = ComponentIdBuilder.split(event.getComponentId());
200+
switch(id[1]) {
201+
case "resolve" ->
202+
resolveAction(event, true);
203+
case "unresolve" ->
204+
resolveAction(event, false);
205+
default -> event.reply("Unknown button").setEphemeral(true).queue();
206+
}
207+
208+
}
209+
210+
private void resolveAction(ButtonInteractionEvent event, boolean resolved) {
211+
event.editMessageEmbeds(
212+
event.getMessage()
213+
.getEmbeds()
214+
.stream()
215+
.map(e->new EmbedBuilder(e)
216+
.setColor(resolved ? Color.GREEN : Color.YELLOW)
217+
.addField("marked as " + (resolved?"resolved":"unresolved") + " by",
218+
event.getUser().getAsMention(), false))
219+
.map(this::removeOldField)
220+
.map(EmbedBuilder::build)
221+
.toList())
222+
.setActionRow(resolved?createUnresolveButton():createResolveButton())
223+
.queue();
224+
}
225+
226+
private String getForumTagText(ForumTag tag) {
227+
EmojiUnion emoji = tag.getEmoji();
228+
StringBuilder sb=new StringBuilder();
229+
if(emoji!=null) {
230+
sb
231+
.append(emoji.getFormatted())
232+
.append(" ");
233+
}
234+
sb.append(tag.getName());
235+
236+
return sb.toString();
237+
}
238+
239+
private EmbedBuilder removeOldField(EmbedBuilder eb) {
240+
if(eb.getFields().size()>5) {
241+
eb.getFields().remove(0);
242+
}
243+
return eb;
244+
}
164245
}

0 commit comments

Comments
 (0)