【问题标题】:Discord js bot: Cannot send DM to users with specific roleDiscord js bot:无法向具有特定角色的用户发送 DM
【发布时间】:2021-12-29 03:19:42
【问题描述】:

我似乎在向具有特定角色的所有用户发送 DM 时遇到了严重问题。

这是我的机器人代码:

bot.on('message', async message => {
    members = message.guild.roles.cache.find(role => role.id === "12345678998765").members.map(m => m.user.id);
    
    members.forEach(member_id => {
        
        sleep(5000).then(() => {
            message.users.fetch(member_id, false).then((user) => {
                user.send("some message");
             });
        });
       
    });
});

这段代码给了我错误:

无法读取 null 的属性(读取“角色”)

在这一行:

members = message.guild.roles.cache.find(role => role.id === ....

但这不是问题。当我注释掉 sleep 命令以发送消息并输出成员角色时:

members.forEach(member_id => {

        console.log(member_id)

        //sleep(5000).then(() => {
        //    bot.users.fetch(member_id, false).then((user) => {
        //        user.send("some message");
        //     });
        //});
       
    });

我在控制台中返回了所有用户 ID 的列表。所以它必须返回角色。

如何向具有特定角色 ID 的所有用户发送消息?我希望能够遍历它们并等待以减少 API 请求和垃圾邮件触发。

【问题讨论】:

  • 不确定这是否相关,但您在两个 forEach 循环中的代码不同。此外,您无法从message 获取users(在第一个forEach 中)。
  • 你有什么版本的 Discord.js?

标签: javascript discord discord.js bots


【解决方案1】:

为了解决您的第一个问题,message.guild 在 DM 中将是 null。确保它不是 DM,或者如果必须是,请选择带有 client.guilds.cache.get("id") 的公会。

bot.on("message", async message => {
    let { guild } = message
    if (!guild) guild = bot.guilds.cache.get("id")
    //...
})

要解决您的其他问题,您可以运行 GuildMember#send() 而不是获取 ID 并获取用户

bot.on("message", async message => {
    let { guild } = message
    if (!guild) guild = bot.guilds.cache.get("id")
    let members = guild.roles.cache.get("12345678998765").members 
    // I used .get here because it's getting by ID
    
    members.forEach(member => {
        sleep(5000).then(() => member.send("some message"));
    });
})

上面的代码会得到所有的GuildMembers,并循环遍历每一个,“休眠”5秒(如果sleep参数是毫秒)并向成员发送DM

【讨论】:

  • 另外,即使您使用的是sleep,也可能被视为 API 滥用。为只有这些角色的人创建一个私人频道可能会更好
猜你喜欢
  • 2020-09-02
  • 2020-08-20
  • 1970-01-01
  • 2021-02-24
  • 2020-09-02
  • 2020-11-19
  • 2022-01-16
  • 2019-11-01
  • 2022-01-09
相关资源
最近更新 更多