删除dms中bot的最新消息

时间:2021-07-02 15:39:38

标签: javascript discord.js

我有一个命令,机器人通过私人消息向特定用户发送消息。现在我希望我可以在出现错误或其他问题时删除 DM 中机器人的最后一条消息。

我想到的是:

module.exports = {
    name: 'dmdelete',
    aliases: ['dmerase'],
    description: 'Deletes last DM Bot Message.',
    usage: '<user>',
    staff: true,
    execute(message, args) {
            const mentionedMember = message.mentions.members.first().id
            const User = client.users.fetch(mentionedMember)
            try {
                    if (!mentionedMember) {
                            return respond('', 'Bitte erwähne einen Nutzer.', message.channel)
                    }
                    User.dmChannel.messages.fetch( {limit: 1} )
                    .then(messages => {
                        let lastMessage = messages.first();
                        if (!lastMessage.author.bot) return;
                        lastMessage.delete()

                    });

            } catch (error) {
                    console.error('an error has occured', error);
            }
    }
}

我现在得到的错误是:

TypeError: Cannot read property 'messages' of undefined

是的,我与机器人有直接消息。

有人知道我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

有几个错误。首先,users.fetchdmChannel.messages.fetch 都返回一个 promise,因此您需要对它们进行解析。

在您上面的代码中,User 是一个 未决 Promise,它没有 dmChannel 属性。由于它没有 dmChannel 属性(即它是 undefined),您无法读取其 messages 属性,您将收到 TypeError: Cannot read property 'messages' of undefined

在使用 fetch 解决这些问题后,dmChannel 可能会出现另一个错误。有时(或大部分时间?),user.dmChannel 返回 null。为避免这种情况,您可以先使用 createDM() 方法创建 DM 频道。它还返回一个承诺,因此您需要先解决它:)

查看下面的工作代码:

module.exports = {
  name: 'dmdelete',
  aliases: ['dmerase'],
  description: 'Deletes last DM Bot Message.',
  usage: '<user>',
  staff: true,
  async execute(message, args) {
    const mentionedUser = message.mentions.users.first();

    if (!mentionedUser)
      return respond('', 'Bitte erwähne einen Nutzer.', message.channel);

    const user = await client.users.fetch(mentionedUser.id);
    const dmChannel = user.dmChannel || (await user.createDM());

    try {
      const messages = await dmChannel.messages.fetch({ limit: 1 });
      let lastMessage = messages.first();
      if (!lastMessage.author.bot) return;
      lastMessage.delete();
    } catch (error) {
      console.error('an error has occured', error);
    }
  },
};