Discord4J 3.x: 使用 EntityRetrievalStrategy 过滤指定角色的成员
以下是使用 EntityRetrievalStrategy 过滤指定角色下用户的示例代码:
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.message.MessageCreateEvent;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Member;
import discord4j.core.object.entity.Role;
import discord4j.core.object.entity.User;
import discord4j.core.object.util.Snowflake;
import discord4j.core.spec.MessageCreateSpec;
import discord4j.discordjson.json.MemberAddRequest;
import discord4j.rest.entity.RestMember;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
GatewayDiscordClient client = DiscordClientFactory.createClient('token');
client.getEventDispatcher().on(MessageCreateEvent.class)
.flatMap(event -> {
String content = event.getMessage().getContent();
String[] parts = content.split(' ');
if (parts.length != 2) {
return Mono.empty();
}
String command = parts[0];
String roleName = parts[1];
if (!command.equals('!listMembers')) {
return Mono.empty();
}
return event.getGuild()
.flatMap(guild -> getRoleByName(guild, roleName))
.flatMap(role -> getMembersInRole(role))
.flatMap(members -> sendMembersList(event, members));
})
.subscribe();
client.login().block();
}
private static Mono<Role> getRoleByName(Guild guild, String roleName) {
return guild.getRoles()
.filter(role -> role.getName().equals(roleName))
.next();
}
private static Mono<List<Member>> getMembersInRole(Role role) {
return role.getGuild().getMembers()
.ofType(Member.class)
.flatMap(member -> member.getRoles()
.filter(memberRole -> memberRole.getId().equals(role.getId()))
.next()
.map(memberRole -> member))
.collect(Collectors.toList());
}
private static Mono<Void> sendMembersList(MessageCreateEvent event, List<Member> members) {
MessageCreateSpec messageSpec = event.getMessage().getChannel()
.flatMap(channel -> channel.createMessage('Members with role:'))
.flatMapMany(message -> Mono.just(message).thenMany(Mono.just(members)))
.flatMap(message -> message.edit(spec -> spec.setContent(message.getContent() + '\n' +
members.stream()
.map(Member::getDisplayName)
.collect(Collectors.joining(', ')))))
.then();
return messageSpec;
}
}
在此示例中,我们首先将输入命令拆分为两个部分:命令和角色名称。然后,我们使用 getRoleByName 方法获取具有指定名称的角色。接下来,我们使用 getMembersInRole 方法获取具有该角色的所有成员。最后,我们使用 sendMembersList 方法在 Discord 中发送包含这些成员的列表。
在 getMembersInRole 方法中,我们使用了 EntityRetrievalStrategy 来过滤具有指定角色的成员。我们首先调用 ofType 方法,以便我们只获取 Member 对象。然后,我们使用 flatMap 操作符将每个成员映射到具有该角色的角色。最后,我们使用 filter 和 next 操作符来过滤出具有指定角色的成员。
原文地址: https://www.cveoy.top/t/topic/m9dA 著作权归作者所有。请勿转载和采集!