Add method to retrieve all Discord members and enhance mention handling

This commit is contained in:
Xujiayao 2026-03-23 01:03:32 +08:00
parent 241bc8d8ed
commit 203f21701a
2 changed files with 36 additions and 0 deletions

View file

@ -347,6 +347,25 @@ public final class DiscordManager {
return null;
}
/**
* Gets all Discord members from every connected guild.
*/
public static List<Member> getAllMembers() {
if (jda == null) {
return List.of();
}
Set<String> seen = new LinkedHashSet<>();
List<Member> members = new ArrayList<>();
for (var guild : jda.getGuilds()) {
for (Member member : guild.getMembers()) {
if (seen.add(member.getId())) {
members.add(member);
}
}
}
return members;
}
/**
* Gets all guild roles from every connected guild.
*/

View file

@ -222,6 +222,7 @@ public final class MinecraftMessageParser {
Map<String, MentionTarget> roleByAlias = new HashMap<>();
Map<String, MentionTarget> allMentionByAlias = new HashMap<>();
Map<String, RichCustomEmoji> emojiByAlias = new HashMap<>();
Map<String, MentionTarget> targetByDiscordId = new HashMap<>();
Map<String, List<LinkedAccountManager.LinkEntry>> allLinks = LinkedAccountManager.getAllLinks();
for (Map.Entry<String, List<LinkedAccountManager.LinkEntry>> entry : allLinks.entrySet()) {
@ -234,6 +235,7 @@ public final class MinecraftMessageParser {
String roleColor = DiscordMessageParser.getRoleColorHex(member);
MentionTarget target = new MentionTarget(MentionType.USER, discordId, displayName, roleColor, linkedUuids);
targetByDiscordId.put(discordId, target);
if (user != null) {
putMentionAlias(userByAlias, allMentionByAlias, user.getName(), target);
@ -249,6 +251,21 @@ public final class MinecraftMessageParser {
}
}
for (Member member : DiscordManager.getAllMembers()) {
String discordId = member.getId();
MentionTarget target = targetByDiscordId.computeIfAbsent(discordId, id -> new MentionTarget(
MentionType.USER,
id,
member.getEffectiveName(),
DiscordMessageParser.getRoleColorHex(member),
List.of()
));
User user = member.getUser();
putMentionAlias(userByAlias, allMentionByAlias, user.getName(), target);
putMentionAlias(userByAlias, allMentionByAlias, member.getEffectiveName(), target);
}
for (Role role : DiscordManager.getAllRoles()) {
String color = "white";
Color roleColor = role.getColors().getPrimary();