Есть ли эффективный способ получить самую редкую роль участника discord.js

#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 🙂