[英]Discordjs - Cannot send messages to this user
我正在为我所在的服务器制作一个discord.js
机器人,但是在尝试向用户发送DM(刚被踢过,以通知他们)之后,该机器人完全不会发送它,并且它将吐出一个错误,
“ UnhandledPromiseRejectionWarning:DiscordAPIError:无法向该用户发送消息”
现在它已经失控了,因为它将起作用,我将添加一个小东西,它将停止工作(或多或少会发生预期),然后当我还原该添加项时,它将再次吐出该错误。
这是我的kick命令代码
const Discord = require("discord.js"); const Client = new Discord.Client const prefix = "m!" module.exports.run = async(bot, message, args) => { params = message.content.slice(prefix.length).trim().split(/ +/g); command = args.shift().toLowerCase(); let memberKick = message.mentions.members.first(); let reasonKick = args.slice(1).join(" "); if(message.member.roles.find("name", "MedaFrost Controller")) { var userReslv = message.guild.members.find("id", memberKick.id); let usericon = memberKick.displayAvatarURL; let botembed = new Discord.RichEmbed botembed.setDescription("❌ You Were Kicked From Roscord!"); botembed.setColor("FF0000"); botembed.setThumbnail(usericon); botembed.addField("Reason:", `${reasonKick}`); userReslv.send(botembed); memberKick.kick(reasonKick); message.channel.send("✅ " + `${memberKick}` + " was kicked! ✅") } else { const userId = message.member.id message.channel.send("Sorry, " + `<@${userId}>` + ", but you do not have sufficient permissions!") } } module.exports.help = { name: "kickplayer", description: "Kicks mentioned user." }
(证明表情符号不是问题) 链接到图像 :
您不应该使用延迟或计时器来解决此问题。 Discord.js中的异步调用返回Promises,您应该使用这些Promise。
承诺基本上可以使您的异步工作流同步:发生某事时->执行此操作。
这是工作流程:
不用担心,由于Promises,他们没有时间对消息做出反应,因为这些操作很可能会即时发生。 没有其他延迟。
所以基本上:
GuildMember
.createDM()
.then((DMChannel) => {
// We have now a channel ready.
// Send the message.
DMChannel
.send(reason)
.then(() => {
// Message sent, time to kick.
GuildMember.kick(reason);
});
});
您也可以捕捉,应该捕捉。 当Promise无法执行分配给它的任务时,就会发生捕获。
GuildMember
.createDM()
.then((DMChannel) => {
// We have now a channel ready.
// Send the message.
DMChannel
.send(reason)
.then(() => {
// Message sent, time to kick.
GuildMember
.kick(reason)
.catch((e) => {
console.log('Failed to kick!', e);
// Do something else instead...
});
});
});
(您也可以捕获正在发送的消息或创建频道。)
在这里,您可以了解有关Promises的更多信息,Promises是JavaScript的重要组成部分: https : //javascript.info/promise-basics
从评论中扩展:也许在消息和实际踢球之间添加了延迟?
由于您的函数是async
,因此最好编写一个小的async
延迟助手:
const delay = (msec) => new Promise((resolve) => setTimeout(resolve, msec));
现在您可以简单地
userReslv.send(botembed);
await delay(100); // 100 msec = 0.1 seconds
memberKick.kick(reasonKick);
// ...
看来您正在使用的许多功能都是异步的。
特别:
此外,您正在尝试send
到GuildMember
。 我不是超级熟悉这个API,但我认为他们可能不被视为一个GuildMember
了你打完后在这种情况下,参考可能是过时的。 我认为您应该在kick
后直接发送给User
。
另外,我认为您总体上等待的不够。 kick
并send
两个返回Promise
,您可能要await
解决,尤其是kick
。
获得该引用之后,请使用带有构造消息的send
:
async function kicker(bot, message, args) {
/** @type GuildMember */
const guildMemberToKick = message.mentions.members.first();
/** @type User */
const guildMemberUser = guildMemberToKick.user;
/** @type RichEmbed */
const kickRichMessage = new Discord.RichEmbed;
/** @type String */
const kickReason = "You've been a baaaad person";
// Build the rich kick message
kickRichMessage.setDescription("❌ You Were Kicked From Roscord!");
kickRichMessage.setColor("FF0000");
kickRichMessage.setThumbnail(guildMemberUser.displayAvatarURL);
kickRichMessage.addField("Reason:", kickReason);
// Kick and wait
await guildMemberToKick.kick(kickReason);
// Tell the user we kicked them and wait
await guildMemberUser.send(kickRichMessage);
// Tell the channel we kicked and wait
await message.channel.send(`✅ ${guildMemberToKick.displayName} was kicked! ✅`);
}
继续AKX的回应...
对于任何为此苦苦挣扎的人!
我将const延迟放在我的var userReslv上方,将等待延迟(100)放在我的踢和消息发送之间。 (可能有很多更好的方式来表达这一点。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.