Ответы пользователя по тегу discord.js
  • Почему появляется ошибка при создании Embed внутри команды?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
    
    module.exports = {
        data: new SlashCommandBuilder()
            .setName('help')
            .setDescription('Получи помощь'),
        async execute(interaction) { // <== (•)
            const helpEmb = new EmbedBuilder()
                .setColor(0xff8c40)
                .setTitle('титл мастир')
                .setDescription('дескриптиан');
    
            await interaction.reply({ embeds: [helpEmb] });
        }
    }


    вы в качестве параметра функции execute (•) указываете переменную с названием, аналогичным названию переменной сверху в
    const { SlashCommandBuilder, /* этой ==> */ EmbedBuilder /* <== этой */ } = require("discord.js");

    ...и в функции, соответственно, используется локальная переменная EmbedBuilder (почему?), когда должна использоваться внешняя, для корректной работы кода.

    достаточно будет заменить название EmbedBuilderна любое другое: я заменил выше на interaction, т.к если у вас правильно настроена обработка команд в основном файле, аргументом этой функции будет CommandInteraction.

    кроме того, когда выполнение кода дойдёт доchannel.send(...), вылетит ошибка, поскольку channel не было нигде определено до этого — заменил на interaction.reply(...)
    Ответ написан
  • Как исправить "TypeError [ClientMissingIntents]: Valid intents must be provided for the Client."?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    const { Client, GatewayIntentBits } = require("discord.js");
    const bot = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] });
    const { token, prefix } = require('./botconfig.json');
    
    bot.on("ready", () => {
      // ... //
    });
    
    bot.on("messageCreate", message => {
      // ... //
    });
    
    bot.login(token);
    Ответ написан
    Комментировать
  • Почему не работает мой Discord bot на Node.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    без интента GatewayIntentBits.MessageContent бот не будет регистрировать контент сообщений, поэтому message.content в вашем случае постоянно равен пустой строке "".

    следовательно, "" !== "ping" и"" !== "sum", поэтому на команды реакции никакой не будет.
    Ответ написан
    Комментировать
  • Ошибка undefined и NaN при выполнение команды в Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    в документации к библиотеке показано, что .osInfo(), .cpu(), .currentLoad() и .mem() — это промисы.
    652b0a6ae29a1045791538.png
    результатом обычного указания si.osInfo() в коде будет объект Promise.
    объект Promise не содержит свойств platform, distroи kernel, которые вы пытаетесь получить.
    при попытке получить доступ к несуществующему свойству объекта результатом будет undefined.

    то же самое касается и других —si.cpu(), si.currentLoad() и т.д.

    касательно последних двух строк: любые математические операции с undefined будут давать NaN.

    вывод: сначала учим язык, а потом только пишем ботов и всё остальное — никак не наоборот.

    https://learn.javascript.ru/promise-basics
    https://learn.javascript.ru/async-await
    Ответ написан
    Комментировать
  • Как исправить ошибку "TypeError: Cannot read properties of undefined (reading 'ws')"?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    с течением времени структура файлов библиотекиdiscord.js менялась, и на данный момент (сейчас последняя версия — discord.js@14.13.0) в файле, к которому вы обращаетесь (Constants.js) не содержится объект DefaultOptions.

    поэтому вы получаете ошибку, т.к Discord.Constants.DefaultOptionsundefined.
    при попытке получить что-то у undefined (в вашем случае свойство ws, undefined.ws), возникает ошибка Cannot read properties of undefined.

    сейчас статус «онлайн с телефона» боту можно установить следующим образом:
    const { 
        DefaultWebSocketManagerOptions: { 
            identifyProperties 
        } 
    } = require("@discordjs/ws");
    
    identifyProperties.browser = "Discord Android"; // или Discord iOS
    обратите внимание: хоть этот способ и рабочий, официально он не задокументирован.
    в Discord API Docs говорится, что значением свойства browser (которое изменяет код выше) должно быть название библиотеки:

    64fc595121210396656954.png
    изменяя значение свойства на Discord iOS или Discord Android, мы можем получить статус «онлайн с телефона», несмотря на то, что этот подход не приветствуется ни Discord API, ни discord.js.
    Ответ написан
    Комментировать
  • Как сделать картинку в Embed?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    .setImage("url_картинки")

    больше примеров: https://discordjs.guide/popular-topics/embeds.html...
    Ответ написан
    Комментировать
  • Как вывести оповещение, когда наступит определенное время Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    Ответ написан
    Комментировать
  • Как удалить сообщения для бота?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    message.reply() и message.delete() — это промисы.

    при вызове любого из этих методов делается запрос к Discord API, для того, чтобы опубликовать в чате ответ на сообщение, либо удалить сообщение.
    на выполнение подобных запросов может уйти разное количество времени, оно не фиксированное.

    сейчас вы запускаете два этих промиса синхронно, а значит, из них первым выполнится тот, кто потратит меньше всего времени на запрос к Discord API.

    если первым выполнится message.reply(), тогда все будет работать, как задумано - сначала бот ответит на сообщение пользователя, потом это сообщение удалит.

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

    поэтому, чтобы избежать подобных проблем, вы должны использовать.then(), либо синтаксис async/await:
    message.reply("ответ на сообщение").then(() => { // после выполнения message.reply()...
      message.delete(); // ...удалить сообщение
    })
    
    // или //
    
    await message.reply("ответ на сообщение"); 
    await message.delete();
    
    /* 
    в этом примере выполнение кода не пойдет дальше, пока не выполнится message.reply().
    после выполнения message.reply() компилятор будет так же ждать выполнения message.delete(), и пока оно не выполнится, весь код, написанный после message.delete() не будет приведен в действие.
    */
    Ответ написан
    Комментировать
  • Бот видит только сообщения при упоминании или ответе, что делать?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    нужно добавить GatewayIntentBits.MessageContent в код, а также в профиле бота в Discord Developer Portal включить Message Content Intent:
    1. https://discord.com/developers/applications/
    2. My Applications => ваше приложение
    3. вкладка Bot
    4. Privileged Gateway Intents => Message Content Intent <= должно быть включено
    Ответ написан
    Комментировать
  • Как найти канал в категории?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    const { ChannelType } = require("discord.js")
    
    // ... //
    
    let channel = interaction.guild.channels.cache
        .find(channel => channel.name === "название_категории" && channel.type === ChannelType.GuildCategory)
        ?.children.cache
        .find(channel => channel.name === "название_канала")

    здесь лучше будет использовать оператор опциональной цепочки, т.к в случае, если категория не будет найдена, метод .find() вернёт undefined, в связи с чем получится выражение undefined.children.cache.find(), что приведёт к ошибке Cannot read properties of undefined (reading 'children').

    также обратите внимание, что в отличии от каналов, категории могут иметь названия с использованием верхнего и нижнего регистров, поэтому в коде это нужно учитывать.

    63f0ebc3e6925995214467.png
    Ответ написан
  • Как выдать роль по кнопке определенному пользователю?

    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 комментариев
  • Как сделать активность бота?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    вариант №1 (изменение активности бота в определенной части кода):
    client.user.setActivity('название', { type: ActivityType.Watching });

    вариант №2 (задать активность сразу):
    const client = new Client({ 
        intents: [/* интенты */],
        presence: {
            activities: [{
                name: "название",
                type: ActivityType.Watching
            }]
        }
    });
    Ответ написан
    Комментировать
  • Почему не работают команды в лс?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    для того, чтобы бот реагировал на сообщения в ЛС, необходимо:
    1. включить интент DIRECT_MESSAGES:
      const client = new Client({ intents: [GatewayIntentBits.DirectMessages, ...] });

    2. включить Partial "Channel":
    const client = new Client({
        intents: [GatewayIntentBits.DirectMessages, ...],
        partials: [Partials.Channel]
    });

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

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    вот здесь и отражается главный минус написания ботов не зная даже основ языка..
    client.on("interactionCreate" , async (Integration) =>{
        if(Integration.isButton() && Integration.customId == "1"){
             guildMember.roles.set(['880828678278352937'])
        }
    
        if(Integration.isButton() && Integration.customId == "2"){
            var role = message.guild.roles.cache.find(role => role.id === "880828678278352937");
            user.roles.add(role)
        }
    })

    разбор вашего кода (почему он не рабочий)

    0. вместоIntegrationлучше было бы использовать название interaction, т.к мы всё-таки работаем с взаимодействием, а не с интеграцией.
    это не влияет на работоспособность кода, но, просто как факт.
    0.1. чтобы не проверять в каждом if-блоке, было ли это взаимодействием с кнопкой, можно сделать следующим образом:
    if (Integration.isButton()) {
      // проверки на .customId (можно использовать switch/case, если их много) //
    }
    1. guildMember.roles.set(['880828678278352937'])
    переменная guildMemberне определена, будет ошибка.
    если хотите обратиться к участнику сервера, который нажал на кнопку, тогда нужно использовать Integration.member, и в итоге будет
    Integration.member.roles.set(["880828678278352937"])

    2.
    var role = message.guild.roles.cache.find(role => role.id === "880828678278352937");

    переменная message не определена, тоже будет ошибка.
    в этом случае нужно использовать interaction.guild.roles
    2.1. для поиска роли по ID, лучше используйте .get().
    .find() используйте в случае, если нужно найти роль по её названию или другим параметрам.
    Ответ написан
    1 комментарий
  • Как сделать обновление кнопок?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    const defaultButtonGreen = new ActionRowBuilder()
      .addComponents(
        new ButtonBuilder()
        .setCustomId('defaultButtonGreen')
        .setLabel('green')
        .setStyle(ButtonStyle.Success),
      ),
      defaultButtonRed = new ActionRowBuilder()
      .addComponents(
        new ButtonBuilder()
        .setCustomId('defaultButtonRed')
        .setLabel('red')
        .setStyle(ButtonStyle.Danger),
      );
    
    await interaction.reply({ content: "message", components: [defaultButtonGreen, defaultButtonRed] });
    const message = await interaction.fetchReply();
    
    const collector = message.createMessageComponentCollector({
      componentType: ComponentType.Button,
      time: 60000
    });
    
    collector.on('collect', async i => {
      if (i.customId === "defaultButtonGreen") {
        defaultButtonGreen.components[0].setStyle(
          defaultButtonGreen.components[0].data.style === 3 ? ButtonStyle.Danger : ButtonStyle.Success
        );
    
        await i.update({ components: [defaultButtonGreen, defaultButtonRed] })
      } else if (i.customId === "defaultButtonRed") {
        defaultButtonRed.components[0].setStyle(
          defaultButtonRed.components[0].data.style === 4 ? ButtonStyle.Success : ButtonStyle.Danger
        );
    
        await i.update({ components: [defaultButtonGreen, defaultButtonRed] })
      }
    });

    по нажатию на одну из двух кнопок, она будет менять цвет на противоположный (красный => зелёный, зелёный => красный).
    Ответ написан
    2 комментария
  • Как сделать чтобы вместо ID был никнейм человека?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    свойство .displayName:
    `ticket-${int.member.displayName}`

    если у пользователя установлен никнейм на сервере, - вы получите этот никнейм.
    если у пользователя не установлен никнейм на сервере, - вы получите его username.
    Ответ написан
    Комментировать
  • Как узнать, существует ли роль на сервере уже или нет?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    <Guild>.roles.cache.find(role => role.name === "имя роли");
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот ставил автоматически реакцию на новые сообщения?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    и что вызывает затруднения? вы не можете сверить ID двух разных каналов?
    client.on("messageCreate", message => {
      if (message.channel.id === "ID_канала") {
        await message.react("✅");
      }
    });

    на любое сообщение, отправленное в канал с ID "ID_канала", будет автоматически ставится реакция ✅.
    Ответ написан
    2 комментария
  • Как добавить слушатель к кнопке - Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    1. отправляете ответ на слеш-команду:
      await interaction.reply(...);
    2. получаете этот ответ с помощью .fetchReply():
      const message = await interaction.fetchReply();
    3. применяете .createMessageComponentCollector() к полученному ответу:
      const collector = message.createComponentCollector(...);

    Ответ написан
    Комментировать