簡體   English   中英

Discord 自動角色反應機器人,出現表情符號錯誤

[英]Discord auto-role reaction bot, getting emoji error

我一直在挖掘 web 以獲得答案,但無法得到答案,所以我認為最好在這里發布。

我正在使用 function 在我的 discord 服務器上的規則部分發送消息,並且在啟動機器人時,我收到一個錯誤,指的是我的rection base 消息,並且無法確定正在發生的事情。

所以這是我得到的錯誤:

(node:1387) UnhandledPromiseRejectionWarning: TypeError [EMOJI_TYPE]: Emoji must be a string or GuildEmoji/ReactionEmoji
    at Message.react (/home/runner/La-chouffe/node_modules/discord.js/src/structures/Message.js:546:23)
    at addReactions (/home/runner/La-chouffe/first-message.js:3:11)
    at /home/runner/La-chouffe/first-message.js:17:9
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:1387) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:1387) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

這是有關的兩個文件:

角色-rglt.js

const firstMessage = require('./first-message.js')

module.exports = async (Client) => {
  const channelId = '583212194116665359'

  const getEmoji = emojiName => Client.emojis.cache.find(emoji => emoji.name === emojiName)

  const emojis = {
    check: 'Les clients',
  };

  const reactions = []

  let emojiText = 'Tout d\'abord bienvenu sur ce serveur discord qui est un serveur communautaire.\n\nVoici quelques règles qu\'il vous sera demandé de respecter pour que votre expérience ici ce passe le mieux possible :\n\n¤ Ici vous avez le choix de votre pseudo tant que nous pouvons mentionner celui-ci et qu\'il ne soit pas choquant.\n\n¤ Le respect des autres est primordial. Pas de violence verbale gratuite s\'il vous plaît. les insultes ne sont pas interdite tant que cela reste de simple taquinerie.\n\n¤ Les propos racistes, sexiste, homophobes, religieux sont a utiliser avec une grande prudence.\n\n¤ Les propos pédophile sont à proscrire et feront l\'objets d\'un ban (sauf dans humour noir, cela est "toléré").\n\n¤ Le flood et le spam écrit comme vocal abusif feront l\'objet d\'une sanction.\n\n¤ La divulgation d\'information personnelle d\'autrui est interdite et fera l\'objet d\'un ban définitif.\n\n¤ Les doubles comptes sont interdit sauf pour le staff.\n\n¤ Merci d\'éviter les fausses plaintes et de ping le staff pour des raisons inutile.\n\n';

  for (const key in emojis) {
    const emoji = getEmoji(key)
    reactions.push(emoji)

    const role = emojis[key]
    emojiText += `Appuyez sur la réaction ${emoji} pour accepter les règles`
  }

  firstMessage(Client, channelId, emojiText, reactions)

  const handleReaction = (reaction, user, add) => {
    if (user.id === '800855759956344832') {
      return
    }

    const emoji = reaction._emoji.name

    const { guild } = reaction.message

    const roleName = emojis[emoji]
    if(!roleName){
      return
    }

    const role = guild.roles.cache.find((role) => role.name === roleName)
    const roleRm = guild.roles.cache.find((role) => role.name === "Athée")
    const member = guild.members.cache.find((member) => member.id === user.id)

    if (add) {
      member.roles.add(role)
      member.roles.remove(roleRm)
    }
  }

  Client.on('messageReactionAdd', (reaction, user) => {
    if (reaction.message.channel.id === channelId) {
      handleReaction(reaction, user, true)
    }
  })
  
}

第一條消息.js

const addReactions = (message, reactions) => {
  message.react(reactions[0])
  reactions.shift()
  if (reactions.length > 0) {
    setTimeout(() => addReactions(message, reactions), 750)
  }
}

module.exports = async (Client, id, text, reactions = []) => {
  const channel = await Client.channels.fetch(id)

  channel.messages.fetch().then((messages) => {
    if (messages.size === 0) {
      // Send a new message
      channel.send(text).then((message) => {
        addReactions(message, reactions)
      })
    } else {
      // Edit the existing message
      for (const message of messages) {
        message[1].edit(text)
        addReactions(message[1], reactions)
      }
    }
  })
}

截至目前,我已經看了很多次並嘗試了很多失敗的事情,唯一的事情是我收到消息 discord 沒有問題,但沒有任何反應

因此,我為任何感興趣的人找到了解決方案。

所以不要在我的循環中調用 getEmoji 常量

const getEmoji = (emojiName) => Client.emojis.cache.find((emoji) => emoji.name === emojiName)

我直接給出表情符號和我的表情符號 object 中的角色 ID,如下所示:

const emojis = {
  check: 'Les clients', //old method
};

const emojis = {
  '✅': '586261210002096131', //new method
};

然后在我的循環中,我修改了我如何給出將表情符號推送到消息中的說明

for (const key in emojis) {
  const emoji = getEmoji(key) //old method
  reactions.push(emoji)

  const role = emojis[key] //this line is not used
  emojiText += `Appuyez sur la réaction ${emoji} pour accepter les règles`
}

for (const key in emojis) {
  reactions.push(key) // new method

  emojiText += `Appuyez sur la réaction ${key} pour accepter les règles`
}

最后,因為我使用 id 而不是角色的名稱,所以我也在修改將角色賦予成員的行

const role = guild.roles.cache.find((role) => role.name === roleName) //old method

const role = guild.roles.cache.find((role) => role.id === roleName) //new method

由於我將相同的導出用於用戶自行選擇的角色,因此我添加了一個小開關盒,用這樣的名稱替換 id(在 for 循環內,不是相同的文件)

let role = ''
switch(emojis[key]) {
  case '829739058040799382' :
    role = 'NSFW';
    break;
  case '829777082232864829' :
    role = 'Coin des joueurs';
    break;
  case '829775173179277342' :
    role = 'Actu Scans';      
    break;
  case '829774879049777224' :
    role = 'Actu Animes';      
    break;
  case '829775145874358332' :
    role = 'Actu films/séries';      
    break;
  case '829775281832591382' :
    role = 'Actu jeux-vidéos';      
    break;
}

就像我有一個完美的自動角色系統一樣,這里有兩個截圖:

具有自動角色的規則,用於授予對服務器的訪問權限

自我選擇自動角色以授予對服務器特定部分的訪問權限

希望它能幫助有需要的人:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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