#node.js #discord.js
#node.js #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]
}
}
}
Ответ №1:
Ну, один из способов упростить ваш код — это не вызывать 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
, как хотите, я просто извлекаю идентификатор роли и сохраняю его в переменной в моем примере.
Вы также можете изменить функцию сортировки по своему усмотрению, чтобы рассмотреть случай, когда две роли имеют одинаковое количество людей, у которых они есть.
Соответствующие ресурсы:
https://discord.js.org/#/docs/main/stable/class/Role ?scrollTo=участники
https://discord.js.org/#/docs/collection/master/class/Collection ?scrollTo=сортировать
Комментарии:
1. Оказывается, этот метод требует еще больше времени для его сортировки, не знаю почему. Но спасибо за помощь 🙂
2. Интересно, я ожидал, что это будет быстрее. Когда я протестировал его примерно с 25 ролями, казалось, что он работает мгновенно. Но, к сожалению, я понятия не имею, как сделать процесс более эффективным. Np 🙂