我有一个命令,机器人通过私人消息向特定用户发送消息。现在我希望我可以在出现错误或其他问题时删除 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
是的,我与机器人有直接消息。
有人知道我做错了什么吗?
答案 0 :(得分:1)
有几个错误。首先,users.fetch
和 dmChannel.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);
}
},
};