• Как выдать роль по кнопке определенному пользователю?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    вам нужно поставить коллектор нажатий на кнопки под сообщением, делается следующим образом:
    1. получаете отправленный ботом ответ на слэш-команду:
      await interaction.reply({ components: [row], embeds: [embed] });
      const message = await interaction.fetchReply(); // <===

    2. вешаете на полученный ответ коллектор:
      const collector = message.createMessageComponentCollector({ componentType: ComponentType.Button, time: 15000, filter: i => i.user.id === interaction.member.id });

      componentType — тип компонента, который будет собирать коллектор.
      в данном случае, это кнопки (нажатие на них)

      time — время в миллисекундах, сколько будет длится сбор нажатий на кнопки

      filter — функция, которая применяется к каждому полученному "нажатию" (если она вернёт true, коллектор "соберёт" нажатие; если false — не соберёт).
      в данном случае она проверяет, кто нажал на кнопку: автор команды или другой человек.
      если нажал другой человек — нажатие не собирается коллектором.

    3. добавляете действия по нажатию на кнопку:

      collector.on("collect", i => { // автор команды нажал на одну из кнопок
        if (i.customId === "customId_одной_из_кнопок") { // проверяете, на какую кнопку нажал юзер
         // *выдать роль пользователю* //
        }
      })


    вся информация по выдаче ролей есть в официальном гайде, там же и про коллекторы есть материал.
    Ответ написан
    6 комментариев
  • Как сделать так, чтобы на кнопку могли нажимать только два участника: interaction.user и участник, выбранный через options.getUser?

    Syjalo
    @Syjalo
    Представьте себе бота
    Очень простая проверка. Можно сказать вопрос не относится к discord.js.
    Можно в фильтре коллектора указать.
    const selectedUser = interaction.options.getUser('user', true);
    
    const filter = async (i) => {
      const result = [interaction.user.id, selectedUser.id].includes(i.user.id);
      if (result) return true;
    
      await i.reply({ content: 'You cannot use this button!', ephemeral: true });
      return false;
    }
    
    const collector = response.createMessageComponentCollector({ componentType: 'BUTTON', filter, time: 60000 });

    Можно внутри collect
    collector.on('collect', async (i) => {
      if (![interaction.user.id, selectedUser.id].includes(i.user.id)) {
        await interaction.reply({ content: 'You cannot use this button!', ephemeral: true });
        return;
      }
    });
    Ответ написан
    1 комментарий
  • Как решить ошибку discrod.js с кнопками - Interaction has already been acknowledged?

    @koldan_off Автор вопроса
    Нашёл ошибку.
    Кому надо, то:
    Данный коллектор я просто впихнул в функцию client.on с параметром 'interactionCreate'. Без каких-либо проверок или ещё что-то, что в итоге привело к тому, что коллектор из раза в раз запускался. Фикс простой -
    const { commandName } = interaction;
    	if(commandName == "dungeon") {
           //Код коллектора тут
    }
    Ответ написан
    Комментировать
  • Почему выдает ошибку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    прочтите внимательно код ошибки и свой код

    Ошибка: (node:25288) UnhandledPromiseRejectionWarning: TypeError:  db.get is not a function

    переводится как: .... db.get не является функцией

    Смотрим дальше:
    let db = require('sqlite') // для примера использую простой в использовании пакет БД "quick.db"

    странно, но пишите про quick.db а подключаете sqlite
    но возможно я не прав и так и должно быть (никогда не использовал ни то ни другое)?

    Смотрю использование sqlite и вижу что инициализация модуля и создание коннекта к ДБ делаются совсем иначе.

    Смотрю quick.db и вижу в примерах так нужные вам db.get() и db.set()

    Вопрос решен!!!

    Ну и напоследок. Либо вы очень устали и стали невнимательны, либо вам нужно срочно приучить себя вчитываться в текст ошибок, и пытаться понять о чем идет речь, а так же подтягивать знание JS, чтобы такие вот ошибки TypeError: db.get is not a function моментально направляли ваши мысли в нужное русло

    const db = require('quick.db');
    Ответ написан
    2 комментария
  • Как исправить ошибку?

    не определена функция getDataSomehow
    это написано в ошибке. значит нужно ее определить или импортировать из модуля
    Ответ написан
    6 комментариев