Discord机器人:非斜杠自定义命令的选项需求及相关疑问
Discord 自定义非斜杠命令配置与选项附加方案
一、配置无需斜杠的自定义命令
要实现?help这类不带斜杠的自定义命令,核心是监听消息事件并手动解析内容判断命令:
- 监听
messageCreate事件,过滤机器人自身消息和非目标前缀开头的消息 - 拆分消息内容,提取命令名和参数
- 匹配命令并执行对应逻辑
代码示例(discord.js v14+)
client.on('messageCreate', (message) => { // 跳过机器人消息和非?前缀的消息 if (message.author.bot || !message.content.startsWith('?')) return; // 拆分命令与参数 const args = message.content.slice(1).trim().split(/ +/); const commandName = args.shift().toLowerCase(); // 处理?help命令 if (commandName === 'help') { const targetCmd = args[0]; if (targetCmd) { message.reply(`「${targetCmd}」命令的使用说明:...`); } else { message.reply('全局命令帮助列表:\n?help [命令名] - 查看指定命令详情\n?ping - 测试机器人延迟...'); } } // 可添加更多自定义命令 if (commandName === 'ping') { message.reply(`延迟:${client.ws.ping}ms`); } });
注意:这类自定义命令需要自己处理参数校验、权限判断等逻辑,没有Discord斜杠命令的原生校验支持。
二、将斜杠命令的选项附加到非斜杠命令
Discord原生不支持直接把斜杠命令的选项绑定到?help这类非斜杠命令,但可以手动实现类似的交互效果:
1. 手动解析参数模拟选项
比如给?help添加可选的分类参数,模拟斜杠命令的选项逻辑:
client.on('messageCreate', (message) => { if (message.author.bot || !message.content.startsWith('?')) return; const args = message.content.slice(1).trim().split(/ +/); const commandName = args.shift().toLowerCase(); if (commandName === 'help') { // 模拟可选选项:分类参数 const category = args[0]; let helpText = ''; switch(category) { case 'fun': helpText = '娱乐命令:?joke 讲笑话,?meme 发梗图'; break; case 'admin': helpText = '管理命令:?kick 踢出成员,?ban 封禁成员'; break; default: helpText = '请指定分类:?help fun / ?help admin'; } message.reply(helpText); } });
2. 用消息组件实现类斜杠交互
如果想要接近斜杠命令的选项选择体验,可以用按钮、选择菜单等消息组件:
const { ActionRowBuilder, StringSelectMenuBuilder } = require('discord.js'); client.on('messageCreate', (message) => { if (message.author.bot || !message.content.startsWith('?')) return; const args = message.content.slice(1).trim().split(/ +/); const commandName = args.shift().toLowerCase(); if (commandName === 'help') { // 创建选择菜单模拟选项 const selectMenu = new StringSelectMenuBuilder() .setCustomId('help_category') .setPlaceholder('选择命令分类') .addOptions( { label: '娱乐命令', value: 'fun' }, { label: '管理命令', value: 'admin' }, { label: '工具命令', value: 'utility' } ); const row = new ActionRowBuilder().addComponents(selectMenu); message.reply({ content: '选择要查看的命令分类:', components: [row] }); // 监听用户选择 const filter = i => i.customId === 'help_category' && i.user.id === message.author.id; const collector = message.channel.createMessageComponentCollector({ filter, time: 15000 }); collector.on('collect', async i => { let content = ''; switch(i.values[0]) { case 'fun': content = '🎮 娱乐命令:\n?joke - 随机讲笑话\n?meme - 随机发送梗图'; break; case 'admin': content = '🔧 管理命令:\n?kick @成员 - 踢出指定成员\n?ban @成员 - 封禁指定成员'; break; case 'utility': content = '🛠️ 工具命令:\n?ping - 测试机器人延迟\n?avatar @成员 - 获取成员头像'; break; } await i.reply(content); }); collector.on('end', () => { message.reply('帮助选择已超时,可重新发送?help发起请求'); }); } });
总结:虽然无法直接复用斜杠命令的选项系统,但通过手动参数解析或消息组件,完全可以实现类似的功能,只是需要自己编写额外逻辑。
内容的提问来源于stack exchange,提问作者DANser
相关产品推荐
相关产品推荐

