Skip to content

Commit 3a2b97c

Browse files
committed
Update ban message when user is unbanned
1 parent 221a63e commit 3a2b97c

5 files changed

Lines changed: 72 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: 51 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
/**
@@ -330,7 +356,10 @@ public void sendBanGuildNotification(User user, String reason, Member moderator)
330356
}
331357

332358
public void sendUnbanGuildNotification(User user, String reason, Member moderator) {
333-
sendGuildNotification(moderator.getGuild(), buildUnbanEmbed(user.getIdLong(), reason, moderator));
359+
MessageEmbed unbanEmbed = buildUnbanEmbed(user.getIdLong(), reason, moderator);
360+
sendGuildNotification(moderator.getGuild(), unbanEmbed, msg -> {
361+
notifyUserAboutUnban(user.getIdLong(), unbanEmbed, botConfig.get(moderator.getGuild()).getModerationConfig(), msg);
362+
});
334363
}
335364

336365
public void sendTimeoutGuildNotification(User user, String reason, Member moderator, Duration duration) {
@@ -342,12 +371,19 @@ public void sendRemoveTimeoutGuildNotification(User user, String reason, Member
342371
}
343372

344373
private void sendGuildNotification(Guild guild, MessageEmbed embed) {
374+
sendGuildNotification(guild, embed, _ -> {});
375+
}
376+
377+
private void sendGuildNotification(Guild guild, MessageEmbed embed, Consumer<Message> onComplete) {
345378
MessageEmbed newEmbed = new EmbedBuilder(embed)
346379
.addField("Source", "This action was executed manually without a bot command.", false)
347380
.build();
348381
notificationService
349382
.withGuild(guild)
350-
.sendToModerationLog(c -> c.sendMessageEmbeds(newEmbed));
383+
.sendToModerationLog(c -> c.sendMessageEmbeds(newEmbed).map(success -> {
384+
onComplete.accept(success);
385+
return success;
386+
}));
351387
}
352388

353389
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, "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)