You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord机器人/test命令二次触发回复失效及报错问题求助

Discord机器人/test命令二次触发回复失效及报错问题求助

嘿,我帮你排查了下代码里的问题,这几个地方是导致功能失效的关键:

问题1:message变量未定义

你在代码里写了const {reply} = message ?? interaction;,但Slash Command的execute函数参数只有interaction,根本没有message变量,这会直接导致messageundefined,后续获取用户ID的逻辑也会乱掉,甚至抛出报错。

问题2:二次回复的方式不对

你第一次已经用interaction.reply()发送了初始消息,Slash Command的交互已经被确认了,之后不能再用普通的reply(),得用interaction.followUp()来发送后续消息,否则Discord会判定交互已完成,不会处理你的二次回复请求。

问题3:初始使用次数的处理有bug

当用户第一次使用命令时,db.get()会返回undefinedundefined + 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

火山引擎 最新活动