Discord机器人/test命令二次触发回复失效及报错问题求助
Discord机器人/test命令二次触发回复失效及报错问题求助
嘿,我帮你排查了下代码里的问题,这几个地方是导致功能失效的关键:
问题1:message变量未定义
你在代码里写了const {reply} = message ?? interaction;,但Slash Command的execute函数参数只有interaction,根本没有message变量,这会直接导致message是undefined,后续获取用户ID的逻辑也会乱掉,甚至抛出报错。
问题2:二次回复的方式不对
你第一次已经用interaction.reply()发送了初始消息,Slash Command的交互已经被确认了,之后不能再用普通的reply(),得用interaction.followUp()来发送后续消息,否则Discord会判定交互已完成,不会处理你的二次回复请求。
问题3:初始使用次数的处理有bug
当用户第一次使用命令时,db.get()会返回undefined,undefined + 1会变成NaN,这样uses就不是有效数字,uses > 1的判断永远不会成立,自然不会触发二次回复。
下面是修正后的完整代码,我把这些问题都修复了:
const { SlashCommandBuilder } = require('@discordjs/builders'); module.exports = { data: new SlashCommandBuilder() .setName('test') .setDescription('Ich teste was'), async execute(interaction) { // 发送初始回复 await interaction.reply({ content: "Am Testen" }); // 从interaction中正确获取用户ID(Slash Command的标准方式) const userId = interaction.user.id; // 获取当前使用次数,第一次使用时默认设为0 const currentUses = await db.get(`uses_test_${userId}`) || 0; const uses = currentUses + 1; // 更新数据库中的使用次数 await db.set(`uses_test_${userId}`, uses); // 第二次及以上使用时发送跟进回复 if (uses > 1) { await interaction.followUp({ content: "Du testest nun etwas zum 2x" }); } } };
你可以试试这个版本,应该就能实现你想要的效果了——第一次用命令发"Am Testen",第二次及以后会额外发送那条二次回复。
备注:内容来源于stack exchange,提问作者Senpai




