Featured image of post [Discord.js] 使用反應讓使用者領取身分組

[Discord.js] 使用反應讓使用者領取身分組

...

example
example

前言

現在蠻多的 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.namereaction.message.id

複製身分組 ID

前往 伺服器設定 > 身分組,並複製你想分配的身分組 ID。

roldid
roldid

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

devmode
devmode

回到剛剛的程式,將 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。

copymessageid
copymessageid

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

warning

並以 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;
        }
    }
});
Licensed under CC BY-NC-SA 4.0
.
.