簡體   English   中英

Discordjs-無法向該用戶發送消息

[英]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。

承諾基本上可以使您的異步工作流同步:發生某事時->執行此操作。

這是工作流程:

  1. 發信息給公會會員
  2. 正確發送消息后踢

不用擔心,由於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); 
// ...

看來您正在使用的許多功能都是異步的。

特別:

此外,您正在嘗試sendGuildMember 我不是超級熟悉這個API,但我認為他們可能被視為一個GuildMember了你打完后在這種情況下,參考可能是過時的。 我認為您應該在kick后直接發送給User

另外,我認為您總體上等待的不夠。 kicksend兩個返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM