
前言
現在蠻多的 Discord 伺服器都有使用 MEE6 來做管理,而 MEE6 也有分配身分組的功能,但是一個伺服器中僅限 1 則訊息能夠領取身分組,且最多只能領取 2 個身分組。如果需要設定更多,就必須要升級到 Premium。不如就自己寫一個機器人吧,還不用受限制。
監聽事件
在機器人的 .js 檔中,加入監聽新反應的程式。
client.on('messageReactionAdd', (reaction, user) => {
const member = reaction.message.guild.members.cache.get(user.id);
console.log(reaction);
});
執行程式,並回到 Discord 隨便傳送任何反應。如果成功的話,就能看到類似以下的回覆。
<ref *2> MessageReaction {
message: <ref *1> Message {
channel: TextChannel {
type: 'text',
deleted: false,
id: '866962972122284032',
name: '領取身分組',
rawPosition: 1,
parentID: '866933892161339403',
permissionOverwrites: Collection(0) [Map] {},
topic: null,
nsfw: false,
lastMessageID: '866963019162058772',
rateLimitPerUser: 0,
lastPinTimestamp: null,
guild: [Guild],
messages: [MessageManager],
_typing: Map(0) {}
},
deleted: false,
id: '866963019162058772', <<<<<<<<<<<
system: null,
type: null,
content: null,
author: null,
pinned: null,
tts: null,
nonce: null,
embeds: [],
attachments: Collection(0) [Map] {},
createdTimestamp: 1626770491162,
editedTimestamp: null,
reactions: ReactionManager {
cacheType: [class Collection extends Collection],
cache: [Collection [Map]],
message: [Circular *1]
},
mentions: MessageMentions {
everyone: false,
users: Collection(0) [Map] {},
roles: Collection(0) [Map] {},
_members: null,
_channels: null,
crosspostedChannels: Collection(0) [Map] {}
},
webhookID: null,
application: null,
activity: null,
_edits: [],
flags: MessageFlags { bitfield: 0 },
reference: null
},
users: ReactionUserManager {
cacheType: [class Collection extends Collection],
cache: Collection(0) [Map] {},
reaction: [Circular *2]
},
_emoji: ReactionEmoji {
animated: undefined,
name: '🎨', <<<<<<<<<
id: null,
deleted: false,
reaction: [Circular *2]
},
count: null,
me: false
}
可以看到有很多其他的資料,包括此訊息所在的頻道、附件、有沒有 @ 其他人…等,但我們只需要取得反應的表情符號和訊息的 ID (上面有標註 <<<<<<<<< 的那兩行)。也就是 reaction.emoji.name 和 reaction.message.id。
複製身分組 ID
前往 伺服器設定 > 身分組,並複製你想分配的身分組 ID。

如果在選單沒有看到 複製 ID 的話,要先至 使用者設定 > 進階 啟用 開發者模式。

回到剛剛的程式,將 console.log 那行刪除,加入 switch 判斷式,如果加入反應的表情符號符合,就分配給使用者身分組。
client.on('messageReactionAdd', (reaction, user) => {
const member = reaction.message.guild.members.cache.get(user.id);
switch (reaction.emoji.name) {
case '🎨':
member.roles.add('<貼上身分組 ID>')
break;
case '💫':
member.roles.add('<貼上身分組 ID>')
break;
}
});
如果現在測試的話,會發現每一則訊息都可以分配身分組,所以下一步要指定作為領取身分組的訊息。
複製訊息 ID
選擇作為領取身分組的訊息。並複製該訊息的 ID。

注意:一則訊息最多只能有 20 個的反應。

並以 if 判斷加入反應的訊息與你剛才選擇的訊息 ID 是否相等。
client.on('messageReactionAdd', (reaction, user) => {
const member = reaction.message.guild.members.cache.get(user.id);
if (reaction.message.id === '<貼上訊息 ID>') {
switch (reaction.emoji.name) {
case '🎨':
member.roles.add('<貼上身分組 ID>')
break;
case '💫':
member.roles.add('<貼上身分組 ID>')
break;
}
}
});
再執行一次,這次就只有你指定的訊息能夠領取身分組了。
移除身分組
而移除身分組則幾乎相同,只是將監聽的 Event 改成 messageReactionRemove,roles.add 改成 roles.remove 而已。
client.on('messageReactionRemove', (reaction, user) => {
const member = reaction.message.guild.members.cache.get(user.id);
if (reaction.message.id === '<貼上訊息 ID>') {
switch (reaction.emoji.name) {
case '🎨':
member.roles.remove('<貼上身分組 ID>')
break;
case '💫':
member.roles.remove('<貼上身分組 ID>')
break;
}
}
});
![Featured image of post [Discord.js] 使用反應讓使用者領取身分組](/p/discord_autorole/cover_hud1c87ec9c31e1214ef86ead415b492f4_1450812_800x0_resize_q75_h2_box_2.webp)