[英]Having trouble getting discord bot to assign role after an emoji reaction
[英]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.