Skip to content

Commit b11ead7

Browse files
authored
Merge pull request #558 from danthe1st/unban-user-info
Update ban message when user is unbanned
2 parents 37637db + 6922115 commit b11ead7

5 files changed

Lines changed: 80 additions & 24 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ public class ModerationConfig extends GuildConfigItem {
117117
*/
118118
private String banMessageText = "Looks like you've been banned from the Discord Java Community. If you want to appeal this decision please fill out our form at <https://airtable.com/shrp5V4H1U5TYOXyC>.";
119119

120+
121+
/**
122+
* Text that is sent to users when they're unbanned.
123+
*/
124+
private String unbanMessageText = "You have been unbanned. You can now rejoin at <https://join.discordjug.net/> but please ensure you are following the rules if you do.";
125+
120126
/**
121127
* Text that is sent to users when they're banned.
122128
*/

src/main/java/net/discordjug/javabot/systems/moderation/ModerationService.java

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.discordjug.javabot.util.Responses;
1111
import net.discordjug.javabot.util.UserUtils;
1212
import net.dv8tion.jda.api.EmbedBuilder;
13+
import net.dv8tion.jda.api.JDA;
1314
import net.dv8tion.jda.api.entities.*;
1415
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
1516
import net.dv8tion.jda.api.utils.MarkdownUtil;
@@ -20,16 +21,20 @@
2021

2122
import lombok.RequiredArgsConstructor;
2223

24+
import javax.annotation.CheckReturnValue;
2325
import javax.annotation.Nonnull;
2426
import java.time.Duration;
2527
import java.time.Instant;
2628
import java.time.LocalDateTime;
2729
import java.time.ZoneOffset;
30+
import java.util.ArrayList;
2831
import java.util.Collections;
2932
import java.util.List;
3033
import java.util.Optional;
34+
import java.util.concurrent.CompletableFuture;
3135
import java.util.concurrent.ExecutorService;
3236
import java.util.concurrent.TimeUnit;
37+
import java.util.function.Consumer;
3338

3439
/**
3540
* This service provides methods for performing moderation actions, like banning
@@ -281,23 +286,44 @@ private void banAndSendGuildNotifications(User user, String reason, Member banne
281286
* @param quiet If true, don't send a message in the channel.
282287
* @return Whether the member is banned or not.
283288
*/
284-
public boolean unban(long userId, String reason, Member bannedBy, MessageChannel channel, boolean quiet) {
289+
@CheckReturnValue
290+
public CompletableFuture<?> unban(long userId, String reason, Member bannedBy, MessageChannel channel, boolean quiet) {
285291
MessageEmbed unbanEmbed = this.buildUnbanEmbed(userId, reason, bannedBy);
286-
boolean isBanned = isBanned(bannedBy.getGuild(), userId);
287292
ModerationConfig moderationConfig = getModerationConfig(bannedBy);
288-
if (isBanned) {
289-
bannedBy.getGuild().unban(User.fromId(userId)).queue(s -> {
290-
moderationConfig.getLogChannel().sendMessageEmbeds(unbanEmbed).queue();
291-
if (!quiet) channel.sendMessageEmbeds(unbanEmbed).queue();
292-
}, ExceptionLogger::capture);
293-
}
294-
return isBanned;
293+
return bannedBy.getGuild().unban(User.fromId(userId)).reason(reason).map(_ -> {
294+
moderationConfig.getLogChannel().sendMessageEmbeds(unbanEmbed).queue(unbanLogMessage -> notifyUserAboutUnban(userId, unbanEmbed, moderationConfig, unbanLogMessage));
295+
if (!quiet) {
296+
channel.sendMessageEmbeds(unbanEmbed).queue();
297+
}
298+
return null;
299+
}).submit();
295300
}
296301

297-
private boolean isBanned(@NotNull Guild guild, long userId) {
298-
return guild.retrieveBanList().complete()
299-
.stream().map(Guild.Ban::getUser)
300-
.map(User::getIdLong).toList().contains(userId);
302+
private void notifyUserAboutUnban(long userId, MessageEmbed unbanEmbed, ModerationConfig moderationConfig, Message unbanLogMessage) {
303+
JDA jda = moderationConfig.getGuild().getJDA();
304+
jda.retrieveUserById(userId)
305+
.flatMap(User::openPrivateChannel)
306+
.flatMap(c -> c.getHistory().retrievePast(1))
307+
.queue(history -> {
308+
if (history.isEmpty()) {
309+
return;
310+
}
311+
Message banMessage = history.getFirst();
312+
if (banMessage.getAuthor().getIdLong() != jda.getSelfUser().getIdLong()) {
313+
return;
314+
}
315+
ArrayList<MessageEmbed> embeds = new ArrayList<>(banMessage.getEmbeds());
316+
embeds.add(new EmbedBuilder(unbanEmbed).setColor(Responses.Type.SUCCESS.getColor()).build());
317+
banMessage.editMessageEmbeds(embeds).setContent(moderationConfig.getUnbanMessageText()).queue(success -> {
318+
List<MessageEmbed> unbanLogEmbeds = unbanLogMessage.getEmbeds();
319+
if (unbanLogEmbeds.isEmpty()) {
320+
return;
321+
}
322+
unbanLogMessage.editMessageEmbeds(new EmbedBuilder(unbanLogEmbeds.getLast())
323+
.addField("User informed", "The ban info in the user's DMs has been updated.", true).build())
324+
.queue();
325+
});
326+
});
301327
}
302328

303329
/**
@@ -329,8 +355,19 @@ public void sendBanGuildNotification(User user, String reason, Member moderator)
329355
sendGuildNotification(moderator.getGuild(), buildBanEmbed(user, moderator, reason));
330356
}
331357

358+
/**
359+
* Sends an unban notification to the guild log.
360+
*
361+
* This will also try to update the ban notification of the user to say they are unbanned.
362+
* @param user The unbanned user
363+
* @param reason The reason they were unbanned
364+
* @param moderator The moderator unbanning them (That {@link Member}'s {@link Guild} is used to determine the guild log to send the notification to.
365+
*/
332366
public void sendUnbanGuildNotification(User user, String reason, Member moderator) {
333-
sendGuildNotification(moderator.getGuild(), buildUnbanEmbed(user.getIdLong(), reason, moderator));
367+
MessageEmbed unbanEmbed = buildUnbanEmbed(user.getIdLong(), reason, moderator);
368+
sendGuildNotification(moderator.getGuild(), unbanEmbed, msg -> {
369+
notifyUserAboutUnban(user.getIdLong(), unbanEmbed, botConfig.get(moderator.getGuild()).getModerationConfig(), msg);
370+
});
334371
}
335372

336373
public void sendTimeoutGuildNotification(User user, String reason, Member moderator, Duration duration) {
@@ -342,12 +379,19 @@ public void sendRemoveTimeoutGuildNotification(User user, String reason, Member
342379
}
343380

344381
private void sendGuildNotification(Guild guild, MessageEmbed embed) {
382+
sendGuildNotification(guild, embed, _ -> {});
383+
}
384+
385+
private void sendGuildNotification(Guild guild, MessageEmbed embed, Consumer<Message> onComplete) {
345386
MessageEmbed newEmbed = new EmbedBuilder(embed)
346387
.addField("Source", "This action was executed manually without a bot command.", false)
347388
.build();
348389
notificationService
349390
.withGuild(guild)
350-
.sendToModerationLog(c -> c.sendMessageEmbeds(newEmbed));
391+
.sendToModerationLog(c -> c.sendMessageEmbeds(newEmbed).map(success -> {
392+
onComplete.accept(success);
393+
return success;
394+
}));
351395
}
352396

353397
private @NotNull EmbedBuilder buildModerationEmbed(@NotNull User user, @NotNull Member moderator, String reason) {

src/main/java/net/discordjug/javabot/systems/moderation/UnbanCommand.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@ protected ReplyCallbackAction handleModerationCommand(@NotNull SlashCommandInter
4343
}
4444
long id = idOption.getAsLong();
4545
boolean quiet = ModerateUserCommand.isQuiet(botConfig, event);
46-
if (moderationService.unban(id, reasonOption.getAsString(), event.getMember(), event.getChannel(), quiet)) {
47-
return Responses.success(event, "User Unbanned", "User with id `%s` has been unbanned.", id);
48-
} else {
49-
return Responses.warning(event, "Could not find banned User with id `%s`", id);
50-
}
46+
moderationService.unban(id, reasonOption.getAsString(), event.getMember(), event.getChannel(), quiet)
47+
.thenAccept(success -> {
48+
Responses.success(event.getHook(), "User Unbanned", "User with id `%s` has been unbanned.", id).queue();
49+
}).exceptionally(failed -> {
50+
Responses.warning(event.getHook(), "Could not find banned User with id `%s` or a different error occured: `%s`", id, failed.getMessage()).queue();
51+
return null;
52+
});
53+
return event.deferReply();
5154
}
5255
}

src/main/java/net/discordjug/javabot/systems/notification/GuildNotificationService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import net.discordjug.javabot.data.config.GuildConfig;
7+
import net.dv8tion.jda.api.entities.Message;
78
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
9+
import net.dv8tion.jda.api.requests.RestAction;
810
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
911
import org.jetbrains.annotations.NotNull;
1012

@@ -22,9 +24,9 @@ public final class GuildNotificationService extends NotificationService.MessageC
2224
/**
2325
* Sends a notification to the log channel.
2426
*
25-
* @param function The {@link Function} to use which MUST return a {@link MessageCreateAction}.
27+
* @param function A {@link Function} sending the message.
2628
*/
27-
public void sendToModerationLog(@NotNull Function<MessageChannel, MessageCreateAction> function) {
29+
public void sendToModerationLog(@NotNull Function<MessageChannel, RestAction<? extends Message>> function) {
2830
MessageChannel channel = guildConfig.getModerationConfig().getLogChannel();
2931
if (channel == null) {
3032
log.error("Could not send message to LogChannel in guild " + guildConfig.getGuild().getId());

src/main/java/net/discordjug/javabot/systems/notification/NotificationService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import net.discordjug.javabot.data.config.BotConfig;
66
import net.discordjug.javabot.systems.qotw.QOTWPointsService;
77
import net.dv8tion.jda.api.entities.Guild;
8+
import net.dv8tion.jda.api.entities.Message;
89
import net.dv8tion.jda.api.entities.User;
910
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
10-
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
11+
import net.dv8tion.jda.api.requests.RestAction;
1112
import org.jetbrains.annotations.Contract;
1213
import org.jetbrains.annotations.NotNull;
1314
import org.springframework.stereotype.Service;
@@ -58,7 +59,7 @@ abstract static class MessageChannelNotification {
5859
* @param channel The target {@link MessageChannel}.
5960
* @param function The {@link Function} which is used in order to send the message.
6061
*/
61-
protected void send(MessageChannel channel, @NotNull Function<MessageChannel, MessageCreateAction> function) {
62+
protected void send(MessageChannel channel, @NotNull Function<MessageChannel, ? extends RestAction<? extends Message>> function) {
6263
function.apply(channel).queue(s -> {},
6364
err -> log.error("Could not send message to channel \" " + channel.getName() + "\": ", err)
6465
);

0 commit comments

Comments
 (0)