You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用discord.js实现点击表情后仅删除单频道用户1分钟内新消息

问题原因分析
  • 核心错误:在用户点击👎反应后,你为client全局注册了永久生效的消息事件监听器,该监听器没有添加用户、频道、时间限制,会匹配所有服务器所有用户发送的所有消息,导致误删。
  • 语法逻辑错误:author.msg.content、userMessage.channel = await msg.delete()都是错误写法,完全不符合预期执行逻辑。
  • 无效判断:原代码中userMessage.content.startsWith('')条件永远为真,所有用户发的任意消息都会触发机器人发送山羊相关提问,若不需要请自行修改触发条件。
修复后代码(适配discord.js v13+,低版本可将messageCreate改回message)
client.on('messageCreate', async userMessage => {
  // 可自行修改触发条件,示例为仅当用户发送!goat指令时触发功能
  if (!userMessage.content.startsWith('!goat')) return;
  if (userMessage.author.bot) return; // 过滤机器人自身发送的消息

  const botMessage = await userMessage.channel.send('Who here likes goats?');
  await botMessage.react("👍");
  await botMessage.react("👎");

  const reactionFilter = (reaction, user) => {
    return ["👍", "👎"].includes(reaction.emoji.name) && user.id === userMessage.author.id;
  };

  try {
    const collected = await botMessage.awaitReactions({
      filter: reactionFilter,
      max: 1,
      time: 60000,
      errors: ["time"]
    });
    const reaction = collected.first();

    if (reaction.emoji.name === "👎") {
      await userMessage.channel.send(`${userMessage.author}, how dare you. I guess no on here likes me. Hmmm, because of that I shall now eat all your messages! BAAAAAHAHAHHAHAHA!`);
      
      // 定义消息删除逻辑
      const deleteHandler = async (msg) => {
        // 仅删除触发功能的用户、当前频道内的非机器人消息
        if (msg.author.id === userMessage.author.id && msg.channel.id === userMessage.channel.id && !msg.author.bot) {
          try {
            await msg.delete();
          } catch (err) {
            console.log('删除消息失败,大概率是机器人缺少删除消息权限:', err);
          }
        }
      };

      // 注册临时监听器
      client.on('messageCreate', deleteHandler);
      // 1分钟后自动移除监听器,停止删除
      setTimeout(() => {
        client.off('messageCreate', deleteHandler);
      }, 60000);

    } else {
      await userMessage.reply("Thanks!");
    }
  } catch (err) {
    await userMessage.channel.send("Hehe");
  }
});
修复说明
  • 采用临时注册监听器+到期自动移除的逻辑,仅在用户点击👎后的1分钟内生效,不会永久留存
  • 添加严格的删除校验规则,仅删除目标用户在当前频道发送的新消息,不会影响其他用户、其他频道的内容
  • 修复了原有的语法逻辑错误,添加了机器人消息过滤、删除异常捕获逻辑
  • 新增了触发指令过滤,避免所有消息都触发机器人回复,可自行修改!goat为你需要的触发规则

内容的提问来源于stack exchange,提问作者user15194515

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:24:03