【问题标题】:How to DM some user using Discord.JS?如何使用 Discord.JS DM 某些用户?
【发布时间】:2020-09-27 01:16:56
【问题描述】:

我遇到了一个关于向特定用户发送 DM 的问题。

我的机器人中的这个命令基本上将今天的日期与任务的日期进行比较,如果他的截止日期临近或已过期,它应该通知用户这个任务。因此,我将 useralert 字段与用户 ID 一起转换为数字 ID (useralertID)。当 if 语句为真时,应向具有此 ID 的用户发送 on if 语句消息。

按照“Discord.js 指南”的说明,我定义了一个用户 let user = bot.users.cache.get('useralertID'); 并向该用户 user.send('Works!'); 发送了一条消息。

不幸的是,它不是向用户发送消息,而是输出一个未定义的值或UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'send' of undefined。

我无法弄清楚这个问题,所以任何建议都会非常有帮助!

这是代码。提前致谢!

var i;
var d = new Date;
var month = d.getMonth() + 1;
var day = d.getDate();
const s = await Tags.count();
if (message.member.hasPermission('KICK_MEMBERS')) {
  for (i = 1; i <= s; i++) {
    const tag = await Tags.findOne({
      where: {
        key: i
      }
    });
    if (tag) {
      var date = tag.get('description');
      let useralert = (tag.get("usernameid")).toString();
      let useralertID = useralert.replace(/[<@>]/g, '');
      let deadday = parseInt(date.slice(0, 2));
      let deadmonth = parseInt(date.slice(3, 5));
      let dayn = deadday - day;
      let monthn = deadmonth - month;
      console.log(dayn.toString() + ' ' + monthn.toString() + ' ' + useralertID);
      if (((dayn <= 2) && (monthn == 0)) || (monthn < 0)) {
        let user = bot.users.cache.get('useralertID');
        user.send('Works!');
        return message.channel.send(`Sent msg to ${user.username}!`);
      }
    }
  }

【问题讨论】:

    标签: javascript node.js sqlite sequelize.js discord.js


    【解决方案1】:

    client.users 其唯一的缓存 用户(按客户端)。因此,如果您重新启动机器人,此集合将为空。 您需要将消息发送到您的机器人或将消息发送到机器人可以处理此消息以缓存在此集合中的通道。你的方式,如果你在公会上运行这个命令或者如果这个用户是你公会的成员,你可以使用guild.members.cache.get('ID HERE') 或尝试通过 id 获取公会,然后在这个公会中通过他的 ID 获取用户。

    一些例子:

    
    var i;
    var d = new Date;
    var month = d.getMonth() + 1;
    var day = d.getDate();
    const s = await Tags.count();
    if (message.member.hasPermission('KICK_MEMBERS')) {
    
    }
        for (i = 1; i <= s; i++) {
            const tag = await Tags.findOne({
                where: {
                    key: i
                }
            });
            if (tag) {
                var date = tag.get('description');
                let useralert = (tag.get("usernameid")).toString();
                let useralertID = useralert.replace(/[<@>]/g, '');
                let deadday = parseInt(date.slice(0, 2));
                let deadmonth = parseInt(date.slice(3, 5));
                let dayn = deadday - day;
                let monthn = deadmonth - month;
                console.log(dayn.toString() + ' ' + monthn.toString() + ' ' + useralertID);
                if (((dayn <= 2) && (monthn == 0)) || (monthn < 0)) {
                    let user = message.guild.members.cache.get(useralertID);
                    if (user) {
                        user.send('Works!').then(() => {
                            return message.channel.send(`Sent msg to ${user.username}!`);
                        }).catch(() => {
                            return message.channel.send(`${user.username} not allow to send DM message!`);
                        })
                    } else {
                        return message.channel.send(`the ${useralertID} not guild Member, can\`t send DM to him`);
                    }
    
                }
            }
        }
    

    【讨论】:

    • 感谢您的帮助,Cipher!您的解决方案完美运行!这个问题确实困扰了我一段时间,您已经解决了我所有的问题,再次感谢您!
    【解决方案2】:

    出现错误是因为user 不存在或为空。 也许试试bot.users.cache.get("YOURIDHERE").send("hi")。
    由于您没有告诉我们您要做什么,我真的无法再为您提供任何帮助。

    【讨论】:

    • 您好!谢谢你的提示。我在我的帖子中添加了一些说明,希望它会更清楚。不幸的是,这也不起作用。我仍然收到UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'send' of undefined 错误。
    • 如果没有尝试过使用 await,这可以工作:await bot.users.cache.get("YOURIDHERE").send("hi")@JoshJohnson
    • 再一次,即使使用 await 也无济于事。仍然收到相同的错误消息..
    • &lt;Cache&gt;.get() 不是异步的
    【解决方案3】:

    问题是用户像内部一样未定义,错误说,

    let user = bot.users.cache.get('useralertID')

    您在这里使用的是字符串而不是变量useralertID

    不管你是否应该检查用户是否存在,因为你是从间接的东西中提取 id,不确定Tags 是什么。

    【讨论】:

    • 感谢您的提示! Tags 实际上是我的用于存储用户数据的 Sqlite 表!总之,问题解决了!
    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2021-05-04
    • 2021-10-11
    • 1970-01-01
    • 2021-04-24
    • 2021-10-26
    • 2021-10-17
    • 2021-06-12
    相关资源
    最近更新 更多