簡體   English   中英

通過 ID 獲取 discord 成員的角色

[英]Get discord member's roles by ID

我正在尋找用戶擁有的每個角色的 ID。 在我的情況下,用戶是消息作者。

我已經嘗試了各種建議,例如let roles = message.author.roles.id = []message.guild.roles.fetch()但是下似乎做我需要的。

var XPRole = {};
if (fs.existsSync('noxprole.json')) {
   XPRole = jsonfile.readFileSync('noxprole.json');
}
client.on('message', async (message) => {
    const { member } = message;
    if (message.author.bot) return;
    

    if (message.guild.id in XPRole === false) {
       XPRole[message.guild.id] = {};
    }
    const RoleID = XPRole[message.guild.id];
    if ('...' in RoleID) {
       return;
    }

任何幫助,將不勝感激。


此代碼的目的是將用戶角色與 JSON 文件進行比較,該文件包含在鍵入時不會獲得 xp 的角色列表。

您可以遍歷成員的所有角色。 所以你需要收集GuildMember object 而不是User

const RoleID = XPRole[message.guild.id];

for(var memberRoleID in message.member.roles.cache.array()) {
  if (RoleID.includes(message.member.roles.cache.array()[memberRoleID].id)) {
    return;
  }
}

正如 Elitezen 在他們的評論中提到的, message.author是一個用戶,用戶沒有角色,只有 GuildMembers。 您也不能使用message.guild.roles因為它返回屬於該公會的角色的經理,而不僅僅是屬於該成員的角色。

但是,您可以使用message.member屬性以公會成員的身份獲取消息的作者。 現在,您有了成員,您可以通過訪問成員的角色來獲取他們的roles 由於roles屬性返回manager ,您需要訪問其cache屬性:

const roles = message.member.roles.cache;

它返回該成員角色的集合,並且 collections 有一個.map()方法將每個項目映射到另一個值到一個數組中。 這意味着您可以使用roles.map輕松創建該成員具有的角色 ID 數組:

const memberRoleIDs = roles.map((role) => role.id);
// => ['772088200214723861', '809320713752256548', '8184301957544091683']

如您所見, memberRoleIDs包含該成員擁有的所有角色 ID。

我不確定您如何將角色 ID 存儲在XPRole[message.guild.id]中。 看來您將其存儲為 object 並且 ID 是鍵。 在這種情況下,您可以使用Array#some()方法來測試數組中的至少一個元素是否通過了回調 function 實現的測試。

因此,如果您的XPRole[message.guild.id] object 以 ID 作為鍵,您可以簡單地將這些鍵與角色 ID 數組進行比較。 檢查並運行以下代碼段:

 let message = { guild: { id: 'guildID' } } const memberRoleIDs = [ '7720882002147238612', '8093207137522565483', '8093207137522565481' ]; let XPRole = { 'guildID': { '7437501734702175013': { /**** */ }, '8093207137522565481': { /**** */ }, '9483513543347850432': { /**** */ }, } } const containsRole = memberRoleIDs.some(id => id in XPRole[message.guild.id]); // returns true as 8093207137522565481 is in both console.log({ containsRole });

如果您改為存儲一組角色 ID,如下例所示,您仍然可以使用相同的some()方法,但使用不同的回調,用於檢查您的XPRole[message.guild.id]中是否包含任何用戶角色 ID XPRole[message.guild.id]數組:

 let message = { guild: { id: 'guildID' } } const memberRoleIDs = [ '7720882002147238612', '8093207137522565483', '8093207137522565481' ]; let XPRole = { 'guildID': [ '7437501734702175013', '8093207137522565481', '9483513543347850432', ] } const containsRole = memberRoleIDs.some(id => XPRole[message.guild.id].includes(id)); // returns true as 8093207137522565481 is in both console.log({ containsRole });

這是完整的代碼:

let XPRole = {};
if (fs.existsSync('noxprole.json')) {
  XPRole = jsonfile.readFileSync('noxprole.json');
}

client.on('message', async (message) => {
  if (message.author.bot) return;

  const roles = message.member.roles.cache;
  const memberRoleIDs = roles.map((role) => role.id);

  if (message.guild.id in XPRole === false) {
    XPRole[message.guild.id] = {};
  }

  if (memberRoleIDs.some((id) => id in XPRole[message.guild.id])) {
    return console.log('member has at least one role id included in XPRole');
  }
});

暫無
暫無

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

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