Skip to content

Commit 8edfecb

Browse files
Merge pull request #393 from danthe1st/special-forum-channels
fix voting channels and close them when leaving
2 parents f6aca25 + 674e2c2 commit 8edfecb

File tree

5 files changed

+68
-40
lines changed

5 files changed

+68
-40
lines changed

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

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

@@ -19,6 +20,7 @@ public class ModerationConfig extends GuildConfigItem {
1920
private long logChannelId = 0;
2021
private long suggestionChannelId = 0;
2122
private long jobChannelId = 0;
23+
private long projectChannelId = 0;
2224
private long staffRoleId = 0;
2325
private long adminRoleId = 0;
2426
private long expertRoleId = 0;
@@ -79,12 +81,16 @@ public TextChannel getSuggestionChannel() {
7981
return this.getGuild().getTextChannelById(this.suggestionChannelId);
8082
}
8183

82-
public TextChannel getJobChannel() {
83-
return this.getGuild().getTextChannelById(this.jobChannelId);
84+
public ForumChannel getProjectChannel() {
85+
return this.getGuild().getForumChannelById(this.projectChannelId);
8486
}
8587

86-
public TextChannel getShareKnowledgeChannel() {
87-
return this.getGuild().getTextChannelById(this.shareKnowledgeChannelId);
88+
public ForumChannel getJobChannel() {
89+
return this.getGuild().getForumChannelById(this.jobChannelId);
90+
}
91+
92+
public ForumChannel getShareKnowledgeChannel() {
93+
return this.getGuild().getForumChannelById(this.shareKnowledgeChannelId);
8894
}
8995

9096
public Role getStaffRole() {

src/main/java/net/javadiscord/javabot/listener/MessageVoteListener.java renamed to src/main/java/net/javadiscord/javabot/listener/ForumPostVoteListener.java

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import net.dv8tion.jda.api.JDA;
44
import net.dv8tion.jda.api.entities.*;
5-
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
5+
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
66
import net.dv8tion.jda.api.entities.emoji.Emoji;
77
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
88
import net.dv8tion.jda.api.events.message.react.GenericMessageReactionEvent;
@@ -23,7 +23,7 @@
2323
* on whether a message should stay in the channel.
2424
*/
2525
@RequiredArgsConstructor
26-
public abstract class MessageVoteListener extends ListenerAdapter {
26+
public abstract class ForumPostVoteListener extends ListenerAdapter {
2727
/**
2828
* The main configuration of the bot.
2929
*/
@@ -36,7 +36,7 @@ public abstract class MessageVoteListener extends ListenerAdapter {
3636
* @param guild The guild to get the channel for.
3737
* @return The text channel that this vote listener should listen in.
3838
*/
39-
protected abstract TextChannel getChannel(Guild guild);
39+
protected abstract ForumChannel getChannel(Guild guild);
4040

4141
/**
4242
* Gets the threshold needed to remove a message. If a message has <code>U</code>
@@ -56,17 +56,6 @@ protected int getMessageDeleteVoteThreshold(Guild guild) {
5656
return 5;
5757
}
5858

59-
/**
60-
* Determines if a given message is eligible for voting. Only eligible
61-
* messages will have voting reactions applied.
62-
*
63-
* @param message The message to check.
64-
* @return True if the message is eligible for voting, or false if not.
65-
*/
66-
protected boolean isMessageEligibleForVoting(Message message) {
67-
return true;
68-
}
69-
7059
/**
7160
* Gets the emote that's used for casting upvotes.
7261
*
@@ -127,9 +116,10 @@ private boolean isMessageReceivedEventValid(@NotNull MessageReceivedEvent event)
127116
if (event.getAuthor().isBot() || event.getAuthor().isSystem() || event.getMessage().getType() == MessageType.THREAD_CREATED) {
128117
return false;
129118
}
119+
if (!event.isFromThread()) return false;
120+
if (event.getMessageIdLong() != event.getChannel().getIdLong()) return false;
130121
if (getChannel(event.getGuild()) == null) return false;
131-
return event.getChannel().getId().equals(getChannel(event.getGuild()).getId()) &&
132-
isMessageEligibleForVoting(event.getMessage());
122+
return event.getChannel().asThreadChannel().getParentChannel().getId().equals(getChannel(event.getGuild()).getId());
133123
}
134124

135125
/**
@@ -142,7 +132,9 @@ private boolean isMessageReceivedEventValid(@NotNull MessageReceivedEvent event)
142132
* proceed to check the votes on the message.
143133
*/
144134
private boolean isReactionEventValid(@NotNull GenericMessageReactionEvent event) {
145-
if (!event.getChannel().getId().equals(getChannel(event.getGuild()).getId())) return false;
135+
if (!event.isFromThread()) return false;
136+
if (!event.getChannel().asThreadChannel().getParentChannel().getId().equals(getChannel(event.getGuild()).getId())) return false;
137+
if (event.getMessageIdLong() != event.getChannel().getIdLong()) return false;
146138
Emoji reaction = event.getEmoji();
147139
if (
148140
!reaction.equals(getUpvoteEmote(event.getJDA())) &&
@@ -151,7 +143,10 @@ private boolean isReactionEventValid(@NotNull GenericMessageReactionEvent event)
151143
return false;
152144
}
153145

154-
User user = event.retrieveUser().complete();
146+
User user = event.getUser();
147+
if (user == null) {
148+
user = event.retrieveUser().complete();
149+
}
155150
return !user.isBot() && !user.isSystem();
156151
}
157152

@@ -164,9 +159,7 @@ private boolean isReactionEventValid(@NotNull GenericMessageReactionEvent event)
164159
private void handleReactionEvent(GenericMessageReactionEvent event) {
165160
if (isReactionEventValid(event)) {
166161
Message message = event.retrieveMessage().complete();
167-
if (isMessageEligibleForVoting(message)) {
168-
checkVotes(message, event.getGuild());
169-
}
162+
checkVotes(message, event.getGuild());
170163
}
171164
}
172165

@@ -179,10 +172,10 @@ private void checkVotes(Message msg, @NotNull Guild guild) {
179172
int downvoteDifference = downvotes - upvotes;
180173

181174
if (downvoteDifference >= getMessageDeleteVoteThreshold(guild)) {
182-
msg.delete().queue();
175+
msg.getChannel().asThreadChannel().getManager().setArchived(true).setLocked(true).queue();
183176
msg.getAuthor().openPrivateChannel()
184177
.queue(
185-
s -> s.sendMessageFormat("Your message in %s has been removed due to community feedback.", getChannel(guild).getAsMention()).queue(),
178+
s -> s.sendMessageFormat("Your post %s in %s has been closed due to community feedback.", msg.getChannel().getAsMention(), getChannel(guild).getAsMention()).queue(),
186179
e -> {}
187180
);
188181
}

src/main/java/net/javadiscord/javabot/listener/JobChannelVoteListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44

55
import net.dv8tion.jda.api.entities.Guild;
66
import net.javadiscord.javabot.data.config.BotConfig;
7-
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
7+
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
88

99
/**
1010
* Listens for reactions in #looking-for-programmer.
1111
* Automatically deletes messages below a certain score.
1212
*/
13-
public class JobChannelVoteListener extends MessageVoteListener {
13+
public class JobChannelVoteListener extends ForumPostVoteListener {
1414

1515
public JobChannelVoteListener(BotConfig botConfig, ExecutorService asyncPool) {
1616
super(botConfig, asyncPool);
1717
}
1818

1919
@Override
20-
protected TextChannel getChannel(Guild guild) {
20+
protected ForumChannel getChannel(Guild guild) {
2121
return botConfig.get(guild).getModerationConfig().getJobChannel();
2222
}
2323

src/main/java/net/javadiscord/javabot/listener/ShareKnowledgeVoteListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44

55
import net.dv8tion.jda.api.entities.Guild;
66
import net.javadiscord.javabot.data.config.BotConfig;
7-
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
7+
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
88

99
/**
1010
* Listens for messages and reactions in #share-knowledge.
1111
* Automatically deletes messages below a certain score.
1212
*/
13-
public class ShareKnowledgeVoteListener extends MessageVoteListener {
13+
public class ShareKnowledgeVoteListener extends ForumPostVoteListener {
1414
public ShareKnowledgeVoteListener(BotConfig botConfig, ExecutorService asyncPool) {
1515
super(botConfig, asyncPool);
1616
}
1717

1818
@Override
19-
protected TextChannel getChannel(Guild guild) {
19+
protected ForumChannel getChannel(Guild guild) {
2020
return botConfig.get(guild).getModerationConfig().getShareKnowledgeChannel();
2121
}
2222

src/main/java/net/javadiscord/javabot/listener/UserLeaveListener.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
1010
import net.dv8tion.jda.api.hooks.ListenerAdapter;
1111
import net.javadiscord.javabot.data.config.BotConfig;
12-
12+
import net.javadiscord.javabot.data.config.GuildConfig;
1313
import lombok.RequiredArgsConstructor;
1414
import net.javadiscord.javabot.data.config.guild.HelpConfig;
1515
import net.javadiscord.javabot.data.h2db.DbActions;
1616
import net.javadiscord.javabot.systems.help.HelpManager;
1717
import net.javadiscord.javabot.systems.help.dao.HelpAccountRepository;
1818
import net.javadiscord.javabot.systems.help.dao.HelpTransactionRepository;
19+
20+
import java.util.function.Consumer;
21+
1922
import org.jetbrains.annotations.NotNull;
2023

2124
/**
@@ -31,9 +34,14 @@ public class UserLeaveListener extends ListenerAdapter {
3134

3235
@Override
3336
public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {
34-
if (event.getUser().isBot() || event.getUser().isSystem()) return;
35-
if (!botConfig.get(event.getGuild()).getServerLockConfig().isLocked()) {
36-
unreserveAllChannels(event.getUser(), event.getGuild());
37+
User user = event.getUser();
38+
if (user.isBot() || user.isSystem()) return;
39+
Guild guild = event.getGuild();
40+
GuildConfig guildConfig = botConfig.get(guild);
41+
if (!guildConfig.getServerLockConfig().isLocked()) {
42+
unreserveAllHelpChannels(user, guild);
43+
closeAllPostsOfUser(guildConfig.getModerationConfig().getJobChannel(), user, guild);
44+
closeAllPostsOfUser(guildConfig.getModerationConfig().getProjectChannel(), user, guild);
3745
}
3846
}
3947

@@ -43,19 +51,40 @@ public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {
4351
* @param user The user who is leaving.
4452
* @param guild The guild they're leaving.
4553
*/
46-
private void unreserveAllChannels(User user, Guild guild) {
54+
private void unreserveAllHelpChannels(User user, Guild guild) {
4755
HelpConfig config = botConfig.get(guild).getHelpConfig();
4856
ForumChannel forum = config.getHelpForumChannel();
57+
executeForAllOpenPostsOfUser(guild, user, forum, this::unreserveHelpChannel);
58+
}
59+
60+
private void closeAllPostsOfUser(ForumChannel channel, User user, Guild guild) {
61+
executeForAllOpenPostsOfUser(guild, user, channel, post ->
62+
post
63+
.sendMessage("This post has been unreserved due to the original poster leaving the server.")
64+
.flatMap(msg ->
65+
post
66+
.getManager()
67+
.setArchived(true)
68+
.setLocked(true))
69+
.queue()
70+
);
71+
}
72+
73+
private void executeForAllOpenPostsOfUser(Guild guild, User user, ForumChannel forum, Consumer<ThreadChannel> toExecute) {
4974
if (forum != null) {
5075
for (ThreadChannel post : forum.getThreadChannels()) {
5176
if (post.isArchived() || post.isLocked()) continue;
5277
if (post.getOwnerIdLong() == user.getIdLong()) {
53-
HelpManager manager = new HelpManager(post, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
54-
manager.close(UserSnowflake.fromId(guild.getSelfMember().getIdLong()), "User left the server");
78+
toExecute.accept(post);
5579
}
5680
}
5781
} else {
5882
log.warn("Could not find forum channel for guild {}", guild.getName());
5983
}
6084
}
85+
86+
private void unreserveHelpChannel(ThreadChannel post) {
87+
HelpManager manager = new HelpManager(post, dbActions, botConfig, helpAccountRepository, helpTransactionRepository);
88+
manager.close(UserSnowflake.fromId(post.getGuild().getSelfMember().getIdLong()), "User left the server");
89+
}
6190
}

0 commit comments

Comments
 (0)