如何使用Discord.JS DM一些用户?

时间:2020-06-08 05:58:21

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

我遇到了有关DM特定用户的问题。

我的机器人中的此命令基本上将今天的日期与任务的日期进行比较,并且应该在用户的截止日期临近或已过期时通知用户此任务。因此,我将useralert字段与用户的ID一起使用,然后将其转换为数字ID(useralertID)。如果if语句为true,则应使用此ID将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}!`);
      }
    }
  }

3 个答案:

答案 0 :(得分:1)

client.users由客户端唯一缓存个用户。因此,如果您重新启动bot,此集合将为空。 您需要将消息发送到您的机器人,或将消息发送到机器人可以在其中处理此消息的通道,以将其缓存在此集合中。如果您在公会上运行此命令,或者该用户是公会成员,则可以使用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`);
                }

            }
        }
    }

答案 1 :(得分:0)

发生错误是因为user不存在或为空。 也许尝试bot.users.cache.get("YOURIDHERE").send("hi")
我真的无法进一步帮助您,因为您没有告诉我们您要做什么。

答案 2 :(得分:0)

好吧,问题是用户未定义,例如“内部”,错误提示,

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

您在此处使用的是字符串,而不是变量useralertID

无论您是否应检查用户是否存在,因为您是从间接方式获取ID的,因此不确定Tags是什么。