From 5150b924b52d0ea2f64cdab914d83ecf01d57c86 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 24 Aug 2024 09:44:25 +0200 Subject: [PATCH 1/2] fix pingable name listener --- .../listener/PingableNameListener.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java b/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java index 3a2c3d1db..55dcee007 100644 --- a/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java +++ b/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Random; import java.util.Scanner; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -25,6 +26,7 @@ public class PingableNameListener extends ListenerAdapter { private static final String ADJECTIVES_URL = "https://gist.githubusercontent.com/karlbright/f91229b8c5ac6f4291dc/raw/4a69c2c50b88ee4559b021c443fee899535adc60/adjectives.txt"; private static final String NOUNS_URL = "https://raw.githubusercontent.com/hugsy/stuff/main/random-word/english-nouns.txt"; + private static final Pattern PINGABLE_NAME_PATTERN = Pattern.compile("(\\W*\\w){3,}\\W*"); private static final Random random = new Random(); private final NotificationService notificationService; private final List nouns; @@ -58,7 +60,7 @@ public void onGuildMemberUpdateNickname(GuildMemberUpdateNicknameEvent event) { * @param nickname The {@link Member}'s new Nickname, null if that does not exist. */ private void checkNickname(Member member, String nickname) { - if (!(nickname==null||isPingable(nickname)) && !isPingable(member.getUser().getName()) && !canBypassCheck(member)) { + if (!isPingable(member.getEffectiveName()) && !canBypassCheck(member)) { changeName(member); } } @@ -72,9 +74,9 @@ private void changeName(Member member) { String newName = generateRandomName(); member.modifyNickname(newName.substring(0, Math.min(31, newName.length()))).queue(); member.getUser().openPrivateChannel() - .flatMap(channel -> channel.sendMessageFormat("Your nickname has been set to `%s` since both your user- and nickname's first three characters were deemed as not-pingable.", newName)) + .flatMap(channel -> channel.sendMessageFormat("Your display name in %s has been set to `%s` since your previous name was deemed as non-pingable.", member.getGuild().getName(), newName)) .queue(); - notificationService.withGuild(member.getGuild()).sendToModerationLog(c -> c.sendMessageFormat("Changed %s's nickname from `%s` to `%s`.", member.getAsMention(), oldName, newName)); + notificationService.withGuild(member.getGuild()).sendToMessageLog(c -> c.sendMessageFormat("Changed %s's nickname from `%s` to `%s`.", member.getAsMention(), oldName, newName)); } /** @@ -83,15 +85,7 @@ private void changeName(Member member) { * @return True if first three characters contain invalid characters, False if not. */ private boolean isPingable(String name) { - if (name == null) return true; - char[] nameChars = name.toCharArray(); - for (int i = 0; i < Math.min(2,name.length()); i++) { - char c = nameChars[i]; - if (c < 32 || c > 126) { - return false; - } - } - return true; + return PINGABLE_NAME_PATTERN.matcher(name).matches(); } /** @@ -101,8 +95,7 @@ private boolean isPingable(String name) { private String generateRandomName() { String noun = nouns.get(random.nextInt(nouns.size())); String adjective = adjectives.get(random.nextInt(adjectives.size())); - int number = random.nextInt(10000); - return StringUtils.capitalize(adjective) + StringUtils.capitalize(noun) + number; + return StringUtils.capitalize(adjective) + StringUtils.capitalize(noun); } /** @@ -130,6 +123,6 @@ private static List readStrings(String url) { * @return Whether the Member can bypass name-checks or not. */ private static boolean canBypassCheck(Member member) { - return member.getUser().isBot() || member.getUser().isSystem() || member.getGuild().getSelfMember().canInteract(member); + return member.getUser().isBot() || member.getUser().isSystem() || !member.getGuild().getSelfMember().canInteract(member); } } From 04317339be09a4995f795b182c46875c2642b1b4 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 23 Nov 2024 19:10:21 +0100 Subject: [PATCH 2/2] use onGuildMemberUpdate to work with member caching --- .../javabot/listener/PingableNameListener.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java b/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java index 55dcee007..c19bdc29a 100644 --- a/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java +++ b/src/main/java/net/discordjug/javabot/listener/PingableNameListener.java @@ -6,7 +6,7 @@ import net.discordjug.javabot.util.StringUtils; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent; -import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent; +import net.dv8tion.jda.api.events.guild.member.GuildMemberUpdateEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import java.io.IOException; @@ -46,20 +46,19 @@ public PingableNameListener(NotificationService notificationService) { @Override public void onGuildMemberJoin(GuildMemberJoinEvent event) { - checkNickname(event.getMember(), null); + checkNickname(event.getMember()); } - + @Override - public void onGuildMemberUpdateNickname(GuildMemberUpdateNicknameEvent event) { - checkNickname(event.getMember(), event.getNewNickname()); + public void onGuildMemberUpdate(GuildMemberUpdateEvent event) { + checkNickname(event.getMember()); } /** * Checks whether the given {@link Member}'s nickname should be changed. * @param member The {@link Member} to check. - * @param nickname The {@link Member}'s new Nickname, null if that does not exist. */ - private void checkNickname(Member member, String nickname) { + private void checkNickname(Member member) { if (!isPingable(member.getEffectiveName()) && !canBypassCheck(member)) { changeName(member); }