如何使用JavaCord Discord API获取用户输入,开发Discord管理申请机器人
基于JavaCord的管理员申请收集Embed推送实现方案
前置准备
你需要先在项目中引入JavaCord依赖,以Maven为例,在pom.xml中添加如下配置:
<dependency> <groupId>org.javacord</groupId> <artifactId>javacord-api</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>org.javacord</groupId> <artifactId>javacord-core</artifactId> <version>3.8.0</version> </dependency>
Gradle配置参考:
implementation 'org.javacord:javacord-api:3.8.0' runtimeOnly 'org.javacord:javacord-core:3.8.0'
核心实现逻辑
我们采用斜杠命令的方式收集申请信息,相比普通消息输入格式更规范,用户提交门槛更低:
- 首先注册全局/服务器专属的
/申请管理员斜杠命令,配置需要用户填写的参数:昵称、申请理由、相关管理经验 - 监听斜杠命令提交事件,提取用户提交的所有参数
- 构建Embed格式的审核消息,推送到指定的管理员审核频道
- 给提交申请的用户返回受理成功的提示
完整代码示例
import org.javacord.api.DiscordApi; import org.javacord.api.DiscordApiBuilder; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.interaction.SlashCommand; import org.javacord.api.interaction.SlashCommandOption; import org.javacord.api.interaction.SlashCommandOptionType; import java.awt.*; import java.time.Instant; import java.util.List; public class AdminApplyBot { // 替换为你自己的审核频道ID private static final long AUDIT_CHANNEL_ID = 123456789012345678L; // 替换为你的机器人Token private static final String BOT_TOKEN = "你的机器人Token"; // 替换为你的服务器ID private static final long SERVER_ID = 987654321098765432L; public static void main(String[] args) { DiscordApi api = new DiscordApiBuilder().setToken(BOT_TOKEN).login().join(); // 注册管理员申请斜杠命令,仅当前服务器生效,全局生效请用createGlobal方法 SlashCommand.with("申请管理员", "提交服务器管理员申请", List.of( SlashCommandOption.create(SlashCommandOptionType.STRING, "昵称", "你在服务器内的常用昵称", true), SlashCommandOption.create(SlashCommandOptionType.STRING, "申请理由", "申请成为管理员的原因", true), SlashCommandOption.create(SlashCommandOptionType.STRING, "相关经验", "过往的社区管理相关经验", true) )).createForServer(api.getServerById(SERVER_ID).get()).join(); // 监听斜杠命令提交事件 api.addSlashCommandCreateListener(event -> { if (event.getSlashCommandInteraction().getCommandName().equals("申请管理员")) { // 提取用户提交的参数 String nickname = event.getSlashCommandInteraction().getOptionStringValueByName("昵称").get(); String reason = event.getSlashCommandInteraction().getOptionStringValueByName("申请理由").get(); String experience = event.getSlashCommandInteraction().getOptionStringValueByName("相关经验").get(); long applyUserId = event.getSlashCommandInteraction().getUser().getId(); // 构建Embed审核消息 EmbedBuilder applyEmbed = new EmbedBuilder() .setTitle("新的管理员申请") .setColor(Color.BLUE) .addField("申请人昵称", nickname, false) .addField("申请人ID", String.valueOf(applyUserId), false) .addField("申请理由", reason, false) .addField("相关经验", experience, false) .setTimestamp(Instant.now()) .setFooter("管理员申请系统"); // 推送到指定审核频道 api.getTextChannelById(AUDIT_CHANNEL_ID).ifPresent(channel -> { channel.sendMessage(applyEmbed); }); // 给用户返回受理提示 event.getSlashCommandInteraction().createImmediateResponder() .setContent("你的管理员申请已提交,我们会尽快审核后通知你结果") .respond(); } }); } }
注意事项
- 启动前请确认机器人已经开启
Server Members Intent权限,否则无法正常获取用户信息 - 确认机器人在审核频道拥有
发送消息、嵌入链接权限,否则Embed消息无法正常发送 - 代码中所有占位的ID、Token都需要替换为你自己的实际参数
- 如果你更习惯用普通消息收集申请,只需监听
ServerMessageReceivedEvent,按约定格式拆分用户输入内容即可,Embed构建、推送逻辑和上述示例完全一致 - 可以根据需要扩展申请字段,比如在线时长、擅长的管理方向等,只需在斜杠命令配置中新增对应Option即可
内容的提问来源于stack exchange,提问作者Adityacraft1
相关产品推荐
相关产品推荐

