繁体   English   中英

discord.js 新会员活动

[英]discord.js New Member Event

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
    guildMemberAdd, member => {
        try {
        const welcome = new Discord.MessageEmbed()
            .setColor('#57F287')
            .setDescription(`Добро пожаловать, ${member.user} на сервер.
            \nВы можете прочитать наши правила в канале <#849407505661952001>`)
        member.guild.channels.cache.get('847196125756915772').send(welcome)
        } catch(e) {
            console.error(e)
        }
    }
}

}

当我试图测试这个事件时,他什么都不做。 没有错误,没有消息或响应。 我究竟做错了什么?

您的代码有问题,但由于您没有提供完整的代码示例,因此很难说出解决方案是什么。

run: async (client) => {
  guildMemberAdd, member => {
    /* ... */
  }
}

这并不像你认为的那样。 相当于

run: async function (client) {
  guildMemberAdd,
  function (member) {
    /* ... */
  }
}

所以你的run function 不起作用; 它只是评估表达式a, b (其中a是任何guildMemberAdd ,而b是您的内部胖箭头函数)。 这将解析为b是什么,在本例中是 function,但您也永远不会调用或返回该 function。 这就是为什么你没有得到错误。

公会成员添加一个guildMemberAdd你应该打电话吗? 它是您尝试为其注册侦听器的事件的名称吗? 你的胖箭头 function 是你应该打电话的吗? 您是否正在尝试将两个 arguments 传递给胖箭头 function (需要在参数周围加上括号)? 我不知道 discord 是如何工作的,但您问题的确切答案取决于 API 文档说您应该做什么。

我假设您的 guildMemberAdd 方法返回成员的 promise 或接受需要成员作为参数的回调方法。 根据您的 guildMemberAdd 方法执行的操作,您的语法有点偏离。

如果它返回一个用户的 promise

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
  try {
    const member = await guildMemberAdd()
    const welcome = new Discord.MessageEmbed()
            .setColor('#57F287')
            .setDescription(`Добро пожаловать, ${member.user} на сервер.
            \nВы можете прочитать наши правила в канале <#849407505661952001>`)
        member.guild.channels.cache.get('847196125756915772').send(welcome)
  } catch (error) {
    throw error
  }
}

或者,您可以尝试在 promise 上调用.then()

guildMemberAdd().then((member) => {
   // rest of your code here
})

如果它接受回调

我认为这是最接近您的代码语法的,但我也觉得您的方法更有可能返回 promise。我认为这是因为您还没有访问任何命名成员的权限。 因此,该成员必须是从您的 guildMemberAdd 方法返回的内容。

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
  try {
    // you'll need to access the current member somehow
    // const member = fetch member here somehow...
    guildMemberAdd(member, () => {
      // your code here
    })
    // OR
    guildMemberAdd((member) => {
      // your code here
    })
  } catch (error) {
    console.log(error)
  }
} 

我认为无论哪种方式,我们都需要查看代码中 guildMemberAdd 的示例,以便我们能够为您提供可靠的答案。 我希望这会有所帮助。 祝你好运!

更新GuildMemberAdd 文档从 discordjs v14.3 开始,事件名称是guildMemberAdd ,它将成员作为参数传递给您的事件处理程序。 因此,如果您将它从您的事件处理程序传递到您的运行方法,您就已经可以访问它了。 为了澄清,...args 是特定 discordjs 事件返回的任何内容,在您的情况下是 guildMember。 然后我们将它们传递给该事件的运行方法。

来自我的机器人的例子

请注意,我使用的是ECMAScript 模块系统而不是 CommonJs。 因此,您无法将此示例直接复制并粘贴到您的代码中。 您需要先将其转换为 commonJs 模块。

export default {
  name: "guildMemberAdd",
  type: "client",
  once: true,
  async run(member, client) {
    // your code here
  },
};

// The event handler I use
// The switch statement and event.type are optional. 
// I plan on having database events that I listen to as well as client events.
import { clientEvents } from "../../events/client/index.mjs";

export async function handleEvents(client) {
  clientEvents.forEach(async (event) => {
    switch (event.type) {
      case "client":
        if (event.once) {
          client.once(event.name, async (...args) => {
            await event.run(...args, client);
          });
        } else {
          client.on(event.name, async (...args) => {
            await event.run(...args, client);
          });
        }
      default:
        break;
    }
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM