查找具有匹配角色标准的 Discord 用户

Posted

技术标签:

【中文标题】查找具有匹配角色标准的 Discord 用户【英文标题】:Finding Discord users with matching role criteria 【发布时间】:2020-05-25 09:25:26 【问题描述】:

首先,在开始这个项目之前,我对这类事情的经验为零。我已经使用了各种资源来构建一个功能齐全的机器人,但我对想要添加的一个关键功能感到困惑。

我正在尝试为我的 Discord 服务器设置一个游戏匹配系统。为此,用户将选择我已经设置和工作的定时“配对”角色。

我想做但遇到麻烦的是,我想从该卷中拉出随机用户,这些用户还具有来自代表“语言”的两组不同“子角色”的至少一个匹配角色(如以用于交流目的而闻名的语言”和“硬件”(例如他们将用于游戏的平台)。

我认为这将通过数组/字符串或类似的东西来完成,并设置以下框架:

const english = message.guild.roles.get('671416995253714965');
const spanish = message.guild.roles.get('671417045916712961');
const french = message.guild.roles.get('671417095166361603');
const german = message.guild.roles.get('671417141731262516');
const japanese = message.guild.roles.get('671417224531279962');
const korean = message.guild.roles.get('671417269666185239');
const portuguese = message.guild.roles.get('671417316193599500');
const russian = message.guild.roles.get('671417467888730122');
const italian = message.guild.roles.get('671418325661777932');
const chinese = message.guild.roles.get('671418692742938647');

const pc = message.guild.roles.get('670715882292641812');
const mobile = message.guild.roles.get('670716301135839282');
const playstation = message.guild.roles.get('670716107929419789');
const xbox = message.guild.roles.get('670715986655313941');
const nintendo = message.guild.roles.get('670716141915602955');

let languages = ['english', 'spanish', 'french', 'german', 'japanese', 'korean', 'portuguese', 'russian', 'italian', 'chinese']
let hardware = ['pc', 'mobile', 'playstation', 'xbox', 'switch']

编辑:在 Cipher 的帮助下,我现在编写了一段代码,用于单个组合。我可以对每种组合使用这种格式来创建一个非常长的代码,从而给出所需的结果。我仍然想通过一个数组或其他东西来清理和简化代码。以下是其中一种组合的功能代码示例。

V2:(d) 是“牵线搭桥”角色

var myItaxbo = setInterval(() => 
    let itaxboList = message.guild.members.filter(member => member.roles.array().includes(d) && member.roles.array().includes(italian) && member.roles.array().includes(xbox));
    if(itaxboList.size > 1) 
    console.log(itaxboList.size)
    let randItaxbo = itaxboList.random(2)
    let firstItaxbo = randItaxbo[0]
    let secondItaxbo = randItaxbo[1]
    firstItaxbo.removeRole(d).catch(console.error);
    secondItaxbo.removeRole(d).catch(console.error);
    matchmakingChannel.send("Users <@" + firstItaxbo + "> and <@" + secondItaxbo + "> have been matched!")
    .then(msg => 
        msg.delete(3.6e+6)
    )
     else 
        console.log('No itaxbo members')
        clearInterval(myItaxbo);
    ;
    , 5000);

V3

var mat = setInterval(() => 
    let membersList = message.guild.members.filter(member => member.roles.array().includes(d) && member.roles.some(role => languages.includes(role.id)) && member.roles.some(role => hardware.includes(role.id)));
    if (membersList.size > 1) 
    console.log(membersList.size)
    let randMembers = membersList.random(2)
    let firstMember = randMembers[0]
    let secondMember = randMembers[1]
    firstMember.removeRole(d).catch(console.error);
    secondMember.removeRole(d).catch(console.error);
    matchmakingChannel.send("Users <@" + firstMember + "> and <@" + secondMember + "> have been matched!")
    .then(msg => 
        msg.delete(3.6e+6)
    )
     else 
        console.log('No members')
        clearInterval(mat);
    ;
    , 5000);

【问题讨论】:

用户可以拥有超过 1 个硬件和语言角色?如果是,那么需要如何计算它们? 是的,他们可以拥有多个。由于双语用户,我特别希望这些语言。如有必要,硬件可以限制为一个,但如果我为一个执行该过程,我想我不妨同时执行。 好吧,换个说法;。用户拥有 pcxbox 角色,并拥有 english、spanish、french 角色。所以rand用户可以是pc - englishpc-spanishpc - frenchxbox - englishxbox-spanishxbox - french对吗? 是的,没错。我认为某种数组比尝试为每个组合制作某种地图(如“配对”角色)然后从那里找到共同点要容易。 【参考方案1】:

你可以这样想。过滤 GuildMembers,然后检查他们是否有游戏和语言角色,并收集 rand 并获得 2 rand 成员。

    client.on('message', message => 
        const languages = ['english', 'spanish', 'french', 'german', 'japanese', 'korean', 'portuguese', 'russian', 'italian', 'chinese']
        const hardware = ['pc', 'mobile', 'playstation', 'xbox', 'nintendo']
        let membersList = guild.members.filter(member => member.roles.some(role => languages.includes(role.name)) && member.roles.some(role => hardware.includes(role.name)))
        if(membersList.size < 2) 
            console.log('No members')
            return
        

        let randMembers = membersList.random(2)
        let firstMember = randMembers.first();
        let secondMeber = randMembers.last();

    );

V2 版本

bot.on('message', message => 
  const languages = ['english', 'spanish', 'french', 'german', 'japanese', 'korean', 'portuguese', 'russian', 'italian', 'chinese']
  const hardware = ['pc', 'mobile', 'playstation', 'xbox', 'nintendo']
  let membersList = message.guild.members.filter(member => member.roles.some(role => languages.includes(role.name)) && member.roles.some(role => hardware.includes(role.name)))
  console.log(membersList.size)
  if(membersList.size < 2) 
      console.log('No members')
      return
  

  let randMembers = membersList.random(2)
  let firstMember = randMembers[0]
  let secondMeber = randMembers[1]
);

V3版本尝试通过ID获取角色

bot.on('message', message => 
    const languages = ['123123', '12321312', '213213123'];
    const hardware = ['12321312', '213213213', '213213123'];
    let membersList = message.guild.members.filter(member => member.roles.some(role => languages.includes(role.id)) && member.roles.some(role => hardware.includes(role.id)));
    console.log(membersList.size);
    if (membersList.size < 2) 
        console.log('No members');
        return;
    

    let randMembers = membersList.random(2);
    let firstMember = randMembers[0];
    let secondMeber = randMembers[1];
);

【讨论】:

代码似乎只返回“无成员”。我将自己和另一个用户设置为我们应该匹配的适当角色,所以这不是问题。我尝试将数组中的信息更改为一些不同的格式并得到相同的结果。我尝试用这种格式let english = message.guild.roles.find(role =&gt; role.name === "english") 替换我原来的const english = message.guild.roles.get('671416995253714965');,以防在读取角色名称与角色ID 时出现问题。 将“.size”更改为“.length”允许它传递到第二部分,但是当我尝试使用“firstMember”和“secondMember”时,它们似乎返回为“未定义”。我尝试通过作为“$firstMember”的频道消息运行它们,它的发布方式与此完全相同。当我尝试将“匹配”角色从它们中删除为firstMember.removeRole(roleID).catch(console.error); 时,它返回“无法读取未定义的属性'removeRole'” 我还必须更改底部,因为它返回“randMembers.first 不是函数”。我尝试重新格式化:let firstMember = membersList.random(); let secondMember = membersList.filter(m =&gt; m.user.id !== firstRand.user.id).random(); 嗯,我今天会检查并回答你出了什么问题。我使用size 因为它是一个集合,集合没有长度。可能是会员过滤器有问题,暂时无法回答 感谢您的帮助。我只是把我在这方面的一点点知识扔在墙上,看看有什么能坚持下去。大声笑

以上是关于查找具有匹配角色标准的 Discord 用户的主要内容,如果未能解决你的问题,请参考以下文章

检查提到的用户是不是在 discord.js 中具有角色

如何检查用户是不是具有特定角色 discord.js v12? [复制]

如果用户具有特定角色,discord.js 机器人会回复

Discord.py - 检查用户是不是具有执行命令的特定角色

Discord.js 检查用户是不是具有第一个角色或第二个角色不起作用

Discord.py:检查用户是不是具有列表中的角色 ID 不起作用