@chupchik_chupachupsa

Необходимо, чтобы бот реагировал лишь на реакции тех, кто находится в голсовом канале. Как?

Команда выполняет функцию кика участника с голосового канала по жалобе. Сейчас она работает так, что если пользователь подает жалобу, то любой кто нажмет на "✅" или "❌", бот сработает. Мне надо, чтобы бот реагировал лишь на реакции тех, кто находится в одном голосовом канале со мной.
Не актуально
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Israfil22
1. Записать в переменную войс-канал создателя этого "голосования".
const creationChannel = message.member.voice.channel


2. Здесь нужно учесть одну важную проблему. У переменной канала(creationChannel) будет доступен кэш пользователей в свойстве members. Кэш, соответственно, создается на момент получения сообщения. Если какой-то пользователь зайдет в канал после создания голосования - его записи не будут учитываться.

A) Если голосование длится не слишком долго, полагаю, это можно опустить и использовать кэш.
Проблемы: Голоса пользователей зашедших после создания не будут учтены.
B) Если данный подход крайне нежелателен, то придется асинхронно обновлять список пользователей, это относительно дорогие и продолжительные операции.
Пролемы: Каждый запрос стоит около 100-200мс при хорошем раскладе, т.е. применять его в фильтре - нежелательно. Вариант - создание таймаута и обновления кэша.
C) Если оба варианта не нравятся, можно составить полный список пользователей, которые проголосовали. В конце получить самый свежий кэш и отфильтровать его.

Вариант Бэ:
const REFRESH_INTERVAL = 1000

const creationChannel = message.member.voice.channel

const refreshIntervalHandler = setInterval( async () => {
    creationChannel = await creationChannel.fetch(true)
}, REFRESH_INTERVAL)

const reactionFilter = (reaction, user) => creationChannel.members.find(member => member.user.id === user.id)

const collector = sentMessage.createReactionCollector(reactionFilter, {max : 1})

collector.on('end', () => clearInterval(refreshIntervalHandler ))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы