以下是使用 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 操作符来过滤出具有指定角色的成员。

Discord4J 3.x: 使用 EntityRetrievalStrategy 过滤指定角色的成员

原文地址: https://www.cveoy.top/t/topic/m9dA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录