Задать вопрос
@Cupik

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

у меня есть код на инвайт систему и мне нужно что бы он выдавал роль написавшему форму по нажатию кнопки, но почему то он не выдает роль вообще.

const { EmbedBuilder, ButtonBuilder, client, guild, ButtonStyle, TextInputBuilder, TextInputStyle, ActionRowBuilder, Events, ModalBuilder } = require("discord.js");

module.exports = {
  name: "invite",
  aliases: ["invite"],
  run: async (client, message) => {
    

    
    // кнопка новой заявки
    const invbutton = new ButtonBuilder()
      .setCustomId('invbutton')
      .setLabel('написать заявку')
      .setStyle(ButtonStyle.Primary);
    const row = new ActionRowBuilder()
      .addComponents(invbutton);

    // кнопка одобрения
    const acceptButton = new ButtonBuilder()
      .setCustomId('accept')
      .setLabel('одобрить')
      .setStyle(ButtonStyle.Success);
    const accept = new ActionRowBuilder()
      .addComponents(acceptButton);

  
    // кнопка отказа
    const cancelButton = new ButtonBuilder()
      .setCustomId('cancel')
      .setLabel('отклонить')
      .setStyle(ButtonStyle.Danger);
    const cancel = new ActionRowBuilder()
      .addComponents(cancelButton)


      



            // эмбед набора
    const embed2 = new EmbedBuilder()
      .setTitle(`Хотите написать заявку в Persety Famq?`)
      .setDescription(`
      \n
      **что вы получите от нас? 
      \n • Дружное и ламповое комьюнити
      \n • развивающийся автопарк
      \n • Хороший дом в близи к центру города
      \n • Должности во фракциях при активном развитии семьи
      \n • удобный и оптимизированный дискорд с помощью ботов
      \n • премию за активное выполнение контрактов
      \n • денег на активацию контрактов

      \n
      \n Что мы хотим от вас?
      \n • желания двигаться с нами
      \n • активного продвижения семьи
      \n • адекватного поведения
      \n 
      \n если вас все устраивает то жмите на кнопку ниже и оставляйте свою заявку!**`)
      .setColor(`DarkGreen`) 
    

    message.channel.send({
      embeds: [embed2],
      components: [row],
    })



    client.on(Events.InteractionCreate, async interaction => {


      if (!interaction.isButton()) return;
      if (interaction.customId === 'invbutton')
        await interaction.showModal(modal);


        if (!interaction.isButton()) return;
        if (interaction.customId === 'cancel')
          await interaction.reply(`вы отказали в заявке <@${member.id}>`)



    })

 // модальное окно заявок
    
		const modal = new ModalBuilder()
			.setCustomId('MyModal')
			.setTitle('Заявки в Persety Famq');
    
		const IDInput = new TextInputBuilder()
			.setCustomId('IDInput')
			.setLabel("ваше игровое имя фамилия | ID")
			.setStyle(TextInputStyle.Short);
    
    const RulesInput = new TextInputBuilder()
      .setCustomId('RulesInput')
      .setLabel('На сколько хорошо вы знаете правила сервера?')
      .setStyle(TextInputStyle.Short);

    const RprulesInput = new TextInputBuilder()
      .setCustomId('RprulesInput')
      .setLabel('На сколько хорошо вы знаете законы штата?')
      .setStyle(TextInputStyle.Short);
      

		const firstActionRow = new ActionRowBuilder().addComponents(IDInput);
    const secondActionRow = new ActionRowBuilder().addComponents(RulesInput);
    const thirdActionRow = new ActionRowBuilder().addComponents(RprulesInput);
		modal.addComponents(firstActionRow, secondActionRow, thirdActionRow);




    
  client.on(Events.InteractionCreate, async interaction => {
    
    if (!interaction.isModalSubmit())return;
    const ID = interaction.fields.getTextInputValue('IDInput');
    const Rules = interaction.fields.getTextInputValue('RulesInput')
    const member = interaction.member
    const Rprules = interaction.fields.getTextInputValue('RprulesInput')
    console.log(`IC Данные: ${ID}, \n  дискорд: ${member.id} \n знание OOC правил: ${Rules} \n знание IC правил: ${Rprules}`);


    //const embedyes = new EmbedBuilder()
    //.setTitle('Вы приняли заявку!')
    //.setDescription(`<@${member.id}> успешно принят в семью! \n рекрутёр <@>`)
    //.setColor('DarkGreen')
    //.setTimestamp()

    // ембед об новой заявке
    const embedinvite = new EmbedBuilder()
    .setTitle('Новая заявка в Persety Famq!')
    .setDescription(` **новая заявка от игрока в Persety Famq!
    \n IC данные: ${ID}
    \n Дискорд: <@${member.id}>
    \n знание правил сервера: ${Rules}
    \n знание законов Штата: ${Rprules}**`)
    .setColor(`DarkVividPink`)
    .setTimestamp()

    let inv = "1124436498561896509"
    client.channels.cache.get(inv).send({
         embeds:[embedinvite],
         components:[accept, cancel]
       })


      
  if (!interaction.isModalSubmit())return;
  console.log(member.id)

  const roles = interaction.message.guild.roles.cache.get('1125451719569047613')

    if (!interaction.isButton()) return;
    if (interaction.customId === 'accept')
      await member.roles.add(roles)
    })
  

}}
  • Вопрос задан
  • 90 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Syjalo
@Syjalo
Представьте себе бота
1. Не регистрируйте слушатели ивентов вринути команды
С каждым новым вызовом команды будет регистрироваться еще один слушатель. У вас уже должен быть слушатель interactionCreate, который вы используете для обработки команд. Обрабатывайте там или создавайте коллекторы.

2. Интеракция не может быть одновременно двух типов
if (!interaction.isModalSubmit()) return;
if (!interaction.isButton()) return;
// тоже самое что и
if (!interaction.isModalSubmit() || !interaction.isButton()) return;
// или
if (!(interaction.isModalSubmit() && interaction.isButton())) return;
Ответ написан
Комментировать
Surviavlist
@Surviavlist
Разработчик-любитель на Node.js
Ты можешь банально создать коллектор для ожидания нажатия кнопки:

const { ComponentType } = require('discord.js') // Добавь в начало скрипта

// Фильтр проверяет, нажал ли кнопку человек, вызвавший команду, где <i>i</i> — каждое нажатие
const filter = i => {
	i.deferUpdate();
	return i === message.author.id && i.
}

//  replyMessage — сообщение, отправленное ботом
let interaction = replyMessage.awaitMessageComponent({ filter: collectorFilter, componentType: ComponentType.Button, time: 60000 }) // time — время, которое коллектор будет ждать сообщение. Бот подождёт не более 60 секунд

// Делай с interaction далее то, что потребуется. Проверь, какую кнопку нажал пользователь через customId и отвечай на взаимодействие


Пример взят с discordjs.guide
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы