Ответы пользователя по тегу Discord
  • Как Discord bot может удалить сообщение через минуту?

    @Israfil22
    Если вы получаете сообщение из события 'message', то в обработчик этого события передается объект-сообщение.
    У него доступен метод delete.
    Функция для создания отложенной процедуры в js - setTimeout().

    Если объект сообщение не доступен по какой-то причине, его, соответственно, нужно получить.
    У каждой сущности Discord API есть свой уникальный ключ. У роли, юзера, и даже сообщения.
    Судя по вопросу, речь идет об конкретном сообщении.

    Если вы уже ранее имели в распоряжении объект message, запишите его поле id куда-то.
    // channel - объект канала, snowflake - id сообщения
    channel.messages.fetch(snowflake)
        .then( message => message.delete() )

    Не забудьте реализовать проверку на undefined в then и остальные кейсы.

    Если сообщение ранее нигде ранее не появлялось (ни в одном обработчике событий, таких как message), тогда придется искать среди сообщений канала.
    Либо динамически
    Либо из кэша
    Ответ написан
  • Необходимо, чтобы бот реагировал лишь на реакции тех, кто находится в голсовом канале. Как?

    @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 ))
    Ответ написан
  • Как сделать заполнение Embed через команды?

    @Israfil22
    Есть как минимум три пути решения данной проблемы.
    1. В библиотеке discord.js существуют коллекторы сообщений.
    Вы можете создать экземпляр такого коллектора и отлавливать все настройки для вашего embed. Получится эдакий ввод из нескольких сообщений.

    2. Если принципиальная реализация в виде нескольких команд - вам нужно сохранять где-то промежуточное состояние вашего embed - сохранить в файл, создать хранилище(массив например, где будет храниться user и настройки его embed), или использовать другие сервисы - базы данных, хранилища, у всего есть свои минусы и плюсы.

    3. Также отправлять конфигурацию вашего embed в виде токена самому пользователю - т.е. сохранить все свойства embed в объект, сериализовать его, например, с помощью JSON.stringfy и перевести его в base64 для пущего эффекта магии и чтобы с парсингом его потом не было проблем. Дальше пользователь вводит команду (например) configureEmbed <свой_токен> <настройка> <значение настройки>.
    Ответ написан