Я пытаюсь создать систему, которая позволяет моему боту направлять сообщения людям, но всегда возникает ошибка при попытке направить сообщение пользователю, который не отправил боту дм с момента его последнего перезапуска.
Это ошибка, которую я продолжаю получать:
TypeError: Cannot read property 'send' of undefined
Это важный код:
message.channel.send({ embed: dmattempt }).then(sentMessage => {
try {
// Tries to send a message to the user
const themsguser = client.users.cache.get(dmId);
themsguser.send(`${sentence}`);
Вот код всей команды:
client.on('message', async message => {
function directMsgUser(dmUser, dmCommand, dmId) {
if (message.content.startsWith(`${prefix}${dmCommand}`)) {
let sentence = message.content.split(' ');
sentence.shift();
sentence = sentence.join(' ');
const dmattempt = {
color: [0, 0, 255],
title: `trying to direct message ${dmUser}`,
description: 'please wait',
footer: {
text: `message sending from ${message.author.tag}`,
icon_url: `${message.author.avatarURL()}`,
},
};
const msgsent = {
color: [0, 255, 0],
title: `message sent to ${dmUser}`,
description: `message content: ${sentence}`,
footer: {
text: `message sent by ${message.author.tag}`,
icon_url: `${message.author.avatarURL()}`,
},
};
// Sends a message confirming that the message is trying to be sent
console.info(`Trying to direct message ${dmUser}`);
message.channel.send({ embed: dmattempt }).then(sentMessage => {
try {
// Tries to send a message to the user
const themsguser = client.users.cache.get(dmId);
themsguser.send(`${sentence}`);
// Edits the message to verify it was sent
sentMessage.edit({ embed: msgsent });
console.info('Message sent!');
}
catch (error) {
// Edits the message to verify something went wrong
const errorembed = {
color: [255, 0, 0],
title: 'error!',
description: `There was an error messaging ${dmUser}`,
footer: {
text: `message sent by ${message.author.tag}`,
icon_url: `${message.author.avatarURL()}`,
},
};
sentMessage.edit({ embed: errorembed });
console.error(error);
console.error('There was an error sending a direct message.');
}
});
}
}
if (message.content.startsWith(`${prefix}dm`)) {
directMsgUser(theUser, theCommand, idforuser);
}
});
Обратите внимание, что эта команда работает, если пользователь, которому отправляется сообщение, отправил боту dm после его перезапуска.
Заранее благодарны за Вашу помощь.
Возможно, проблема в том, что, поскольку вы пытаетесь получить пользователя из кеша, пользователя может еще не быть в кеше. И это имеет смысл, потому что это работает, если пользователь ранее уже отправил боту DM, потому что это добавит их в кеш. Но если они еще не отправили бота DM, то они могут еще не быть в кеше пользователя.
Вы можете использовать .fetch(id, cache)
вместо .cache.get(id)
, чтобы убедиться, что вы извлекаете пользователя, даже если он еще не находится в кеше:
client.users.fetch(dmID, true).then(themsguser => {
themsguser.send(`${sentence}`);
});
Этот метод заставит бота сначала проверить, есть ли в кеше пользователь с ID dmID
. Если это так, он будет использовать значение в кеше. Если это не так, он получит пользователя, напрямую запросив Discord API. И поскольку мы устанавливаем второй аргумент нашего .fetch()
в true
, метод также добавит нашего пользователя в кеш после его извлечения (если он еще не был в кеше), что предотвращает необходимость повторного запроса данных из API.
Соответствующие ресурсы:
https://discord.js.org/#/docs/main/stable/class/UserManager?scrollTo=fetch