有没有一种有效的方法可以获得成员discord.js的最稀有角色



我实现了一个功能,向人们展示他们最稀有的角色(最少的人拥有的角色(。我通过循环浏览他们的每个角色并检查有多少人扮演这个角色来做到这一点。事实证明,如果你有超过50个角色,它会明显延迟机器人的响应,所以我想知道是否有更有效的方法来做同样的事情。我的代码在这里:

const rolesOfMember = member._roles
for(const role in rolesOfMember) {
var membersHavingCurrentRole = message.guild.roles.cache.get(rolesOfMember[role]).members.size
if(membersHavingCurrentRole < membersHavingRarestRole) {
membersHavingRarestRole = membersHavingCurrentRole
rarestRoleID = rolesOfMember[role]
} else if(membersHavingCurrentRole == membersHavingRarestRole) {
var rarestRole = message.guild.roles.cache.get(rarestRoleID)
var currentRole = message.guild.roles.cache.get(rolesOfMember[role])
if(rarestRole.comparePositionTo(currentRole) < 0) {
membersHavingRarestRole = membersHavingCurrentRole
rarestRoleID = rolesOfMember[role]
}
}
}

简化代码的一种方法是,不必为成员的每个角色调用message.guild.roles.cache.get()3次左右,尤其是当他们将拥有50多个角色时。事实上,我们可以完全消除对member._roles对象的需要,因此也就消除了对for/in循环的需要。以下是一个示例(经过测试并有效(:

var rolesOfMember = message.member.roles.cache;
var rarestRole = rolesOfMember.sort((roleA, roleB) => roleA.members.size - roleB.members.size).first();
var rarestRoleID = rarestRole.id;

在本例中,我首先获取成员所具有的所有角色的集合。然后,我使用Collection.sort()方法根据公会中每个角色的成员数量对角色进行排序(从最少到最多,换句话说,从最稀有到最常见(。由于这个已排序集合中的第一个角色将是用户拥有的最稀有的角色,因此我只需在已排序集合上调用Collection.first()即可检索第一个也是最稀有的Role。从那里,您可以随心所欲地使用rarestRole,在我的示例中,我只需检索角色的ID并将其存储在一个变量中。

您也可以根据自己的意愿更改排序函数,以考虑两个角色拥有相同数量人员的情况。

相关资源:
https://discord.js.org/#/docs/main/stable/class/Role?scrollTo=membershttps://discord.js.org/#/docs/collection/master/class/Collection?scrollTo=sort

最新更新