discord.js V13中为interactionCreate事件添加参数及斜杠命令添加参数的技术咨询
Discord.js v13 斜杠命令参数配置与interactionCreate事件处理
一、先搞定带参数的斜杠命令注册
从v12转到v13,最大的变化之一就是斜杠命令需要通过Discord的API进行注册,而不是像前缀命令那样直接解析消息内容。以你要做的/verify UsernameHere为例,咱们先把这个带参数的命令注册好:
1. 命令注册代码示例
你可以用@discordjs/rest和discord-api-types来注册全局或服务器专属命令,这里给个全局命令的实操例子:
const { REST } = require('@discordjs/rest'); const { Routes } = require('discord-api-types/v9'); const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds] }); const commands = [ { name: 'verify', description: '验证指定用户的身份', options: [ { name: 'username', type: 3, // 对应STRING类型,也可以用ApplicationCommandOptionType.String枚举值 description: '需要验证的用户名', required: true, // 设为必填参数,用户必须输入才能执行命令 }, ], }, ]; const rest = new REST({ version: '9' }).setToken('你的Bot令牌'); (async () => { try { console.log('开始注册全局斜杠命令...'); await rest.put( Routes.applicationCommands(client.user.id), { body: commands }, ); console.log('全局斜杠命令注册成功!'); } catch (error) { console.error(error); } })();
小提示:全局命令可能需要1小时左右才会在所有服务器生效,如果是测试用,可以用
Routes.applicationGuildCommands(client.user.id, '你的测试服务器ID')注册服务器专属命令,几秒就能生效。
二、处理interactionCreate事件中的参数
命令注册好后,接下来就是在interactionCreate事件里捕捉命令、获取参数,然后处理你的验证逻辑:
1. interactionCreate事件处理代码
client.on('interactionCreate', async interaction => { // 先判断当前交互是不是斜杠命令 if (!interaction.isChatInputCommand()) return; // 匹配到verify命令时执行逻辑 if (interaction.commandName === 'verify') { // 获取参数:这里的'username'就是咱们注册命令时定义的参数名 const targetUsername = interaction.options.getString('username'); // 接下来写你的验证逻辑,比如查找用户、发送验证通知、写入数据库等 try { // 先给用户一个反馈,告诉他们命令已接收 await interaction.reply(`正在验证用户:${targetUsername}...`); // 这里可以加你的具体验证逻辑,举个例子: // 根据用户名查找服务器内的成员 // const member = interaction.guild.members.cache.find(m => m.user.username === targetUsername); // 如果找到成员,就发送验证消息或者更新数据库状态 } catch (error) { // 出错时给用户发个私密提示 await interaction.reply({ content: '验证过程中出现错误!', ephemeral: true }); console.error(error); } } });
2. 常用参数类型与获取方式
如果你的验证系统需要其他类型的参数,比如直接选择用户而不是输入用户名,可以修改注册时的type字段:
- 用户类型:
6(或ApplicationCommandOptionType.User),用interaction.options.getUser('target_user')直接获取用户对象 - 角色类型:
8(或ApplicationCommandOptionType.Role),用interaction.options.getRole('target_role')获取角色对象 - 布尔值:
5,用interaction.options.getBoolean('is_verified')获取布尔值
三、转版本后的关键注意点
- v13的Bot必须开启
Guilds意图(也就是代码里的GatewayIntentBits.Guilds),否则根本收不到交互事件 - 所有斜杠命令的参数都必须在注册时定义好,不能像v12那样从消息内容里手动截取
- 如果想让参数可选,把
required设为false就行,获取时可以加默认值:interaction.options.getString('username', false) || '默认用户名'
内容的提问来源于stack exchange,提问作者systemGene
相关产品推荐
相关产品推荐

