• Почему не работают команды в лс?

    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(...);

    Ответ написан
    Комментировать
  • Как пофиксить ошибку при получении аватара юзера?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    @bot.command()
    async def avatar(ctx, user: discord.Member):
        embed = discord.Embed(color = 0xff9900, title = 'Аватар') 
    -   embed.set_image(url = user.avatar_url) 
    +   embed.set_image(url = user.avatar.url) 
        await ctx.send(embed = embed)
    Ответ написан
    Комментировать
  • Ошибка "Error: Expected token to be set for this request, but none was present", как исправить?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    const {SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, Client, GatewayIntentBits, EmbedBuilder} = require('discord.js')
    - const client = new Client({intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildPresences]});
    module.exports = {
        data: new SlashCommandBuilder()
            .setName('add-animal')
            .setNameLocalizations({"ru": "добавить-животное"})
            .setDescription('Add animals to game "Guess the animal"!')
            .setDescriptionLocalizations({"ru": 'Добавь животное в игру "Угадай животное"!'})
            .addStringOption(option =>
                option.setName('name')
                    .setNameLocalizations({"ru": 'имя'})
                    .setDescription("Animal name")
                    .setDescriptionLocalizations({"ru": "Имя животного"})
                    .setRequired(true)
            )
            .addAttachmentOption(option =>
                option.setName('image')
                    .setNameLocalizations({"ru": "изображение"})
                    .setDescription("Animal image")
                    .setDescriptionLocalizations({"ru": "Изображение животного"})
                    .setRequired(true)
            ),
        async execute(interaction) {
            const name = interaction.options.getString('name')
            const image = interaction.options.getAttachment('image')
            const embed = new EmbedBuilder()
                .setTitle(name)
                .setDescription(`Прислал: ${interaction.user}`)
                .setImage(image.url)
    -        client.channels.fetch('1007311557300068432')
    -             .then(channel => channel.send('ok'))
    
    +         interaction.client.channels.fetch("1007311557300068432")
    +              .then(channel => channel.send('ok'))
    
            interaction.reply("ок")
        }
    }
    Ответ написан
  • Ошибка DiscordAPIError[400], как исправить?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    отрывок из discord.js guide по этой теме (перевод)

    Как уже говорилось ранее, у вас есть три секунды, чтобы ответить на Interaction, прежде чем его токен станет недействительным. Но что, если у вас есть команда, выполняющая задачу, которой требуется больше времени, чем три секунды?

    В этом случае вы можете воспользоваться методом BaseInteraction#deferReply(), который запускает <application> is thinking..., а также действует как начальный ответ. Это позволит вам получить 15 минут на выполнение задач перед ответом.

    https://discordjs.guide/interactions/slash-command...

    по всей видимости, на выполнение axios.get() иногда уходит более 3 секунд, из-за чего к моменту запуска .then() токен Interaction уже является недействительным, что и вызывает ошибку.

    поэтому перед axios.get() нужно поставить await interaction.deferReply(), а после чего уже использовать await interaction.editReply(...) вместо await interaction.reply(...).

    на протяжении всего времени, которое понадобится на выполнение axios.get(), юзер будет видеть надпись имя_бота думает... (или имя_бота is thinking..., в зависимости от языка).
    Ответ написан
    Комментировать
  • Как сделать локализацию бота Discord - Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    проверяйте свойство .locale
    Ответ написан
  • Как сделать локализацию слеш-команд - SlashCommandBuilder, Discord.JS?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    да, в discord.js поддерживается локализация слеш-команд.

    присутствуют соответствующие методы для SlashCommandBuilder:
    1. .setNameLocalization(locale, localizedName) — локализация названия команды.
      • locale — язык (полный список языков представлен в документации)
      • localizedName — локализованное название команды

      1.1. .setNameLocalizations(localizedNames) — то же самое, только можно указать несколько вариантов локализации сразу.
      • localizedNames — объект с вариантами локализаций.

        { "en-US": "Name", "ru": "Название", ... }

    2. .setDescriptionLocalization(locale, localizedDescr... — локализация описания команды.
      • locale — язык
      • localizedDescription — локализованное описание команды

      2.1. .setDescriptionLocalizations(localizedDescriptions) — то же самое, можно указать несколько вариантов локализации сразу.

    Ответ написан
  • Как сделать name из .addFields ссылкой - EmberBuilder, Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    1. т.к axios.get() возвращает промис (а как известно, промисы выполняются асинхронно от остального кода), все изменения, которые вы сделаете внутри .then() будут видны исключительно там.
    let num = 5;
    
    let promise = new Promise((resolve, reject) => resolve());
    
    promise.then((r) => {
    	num = 9;
      console.log(`${num}, внутри .then()`); // "9, внутри .then()"
    })
    
    console.log(`${num}, вне .then()`); // "5, вне .then()"
    2. ссылки в embed'е можно вставлять только в:
    • описание
    • значения филдов

    синтаксис:
    [текст](ссылка 'появляющийся текст при наведении курсора на ссылку (необязательно)')

    указывается полная ссылка с протоколом.
    Ответ написан
  • Почему findIndex выдаёт ошибку?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    Array.isArray(headerImages)
    Ответ написан
    Комментировать
  • Как сделать Timestamp Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    `<t:${Math.round(user.createdTimestamp / 1000)}>`
    Ответ написан
    Комментировать
  • Как реализовать чтобы бот удалял текст и оставлял картинки (вложения)?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    необходимы следующие интенты: Guilds, GuildMessages, MessageContent.
    client.on("messageCreate", async message => {
        if (message.attachments.size < 1 || !message.attachments.some(el => el.contentType.startsWith("image"))) {
            message.delete().catch(() => {
                /* что-то сделать в случае, если удалить сообщение не удалось */
            })
        } else {
            /* код здесь сработает в случае, если среди прикрепленных к сообщению файлов присутствует хотя бы 1 картинка любого формата (.png, .jpg, .jpeg, .svg и т.д.) */
        }
    });
    Ответ написан
    4 комментария
  • Как задать размер шрифта в эмбеде - Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    для форматирования текста дискорд предоставляет специальную разметку, о которой можно прочитать здесь — увеличение/уменьшение размера шрифта не поддерживается.

    максимум, что вы можете сделать —воспользоваться символами маленьких букв английского алфавита, которые можно сгенерировать на этом сайте.
    Ответ написан
    1 комментарий
  • Как работать с аргументами в Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    Как получить значение из аргумента?

    для каждого типа аргумента есть свой метод:
    const string = interaction.options.getString('название_аргумента');
    const integer = interaction.options.getInteger('название_аргумента');
    const boolean = interaction.options.getBoolean('название_аргумента');
    const user = interaction.options.getUser('название_аргумента');
    const member = interaction.options.getMember('название_аргумента');
    const channel = interaction.options.getChannel('название_аргумента');
    const role = interaction.options.getRole('название_аргумента');
    const number = interaction.options.getNumber('название_аргумента');
    const mentionable = interaction.options.getMentionable('название_аргумента');
    const attachment = interaction.options.getAttachment('название_аргумента');
    62ed12f82cf2f105202380.png
    Как узнать, какой пользователь ввел команду?

    CommandInteraction.member
    Ответ написан
    7 комментариев
  • Есть 3 элемента массива, при их сравнении ничего не происходит?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    операции сравнения в JS выполняются подвое, слева направо.

    это значит, что сначала в if-выражении выполнится сравнение первых двух элементов board[0][0] === board[0][1], после чего, полученное значение (trueилиfalse) будет сравниваться с оставшимся элементом.
    board[0][0] === board[0][1] /* 1 этап: получили true */
    true === board[0][2] /* 2 этап: получили false, т.к true сравнивается с "x" */

    чтобы всё работало так, как задумано, нужно воспользоваться оператором &&:
    if (board[0][0] === board[0][1] && board[0][1] === board[0][2]) { ... }
    или же, для улучшения читаемости кода, можно добавить функцию:
    const isEqual = (value, ...values) => values.every(el => el === value);
    /* 1 параметр (value) - это значение, с которым будут сравниваться все остальные переданные в функцию значения */
    
    isEqual(board[0][0], board[0][1], board[0][2]) // true
    isEqual(7, 7, 7, 7, 7, 7, 6) // false
    isEqual(1, 1, 1, 1, 1, 1) // true
    Ответ написан
    Комментировать
  • Почему в данном коде необходимо нижнее подчёркивание?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    в задании на входе вы получаете подобные массивы: ["3:5", "4:2", "8:7"]
    функция, передаваемая в .reduce(), имеет 2 обязательных параметра (accumulator, currentValue) и 2 необязательных (index, array).

    здесь .reduce((a, [x, _, y]) в качестве второго параметра (currentValue) выступает [x, _, y].

    если мы применим .reduce() к массиву, который я представил в самом начале ответа, в качестве currentValueбудут выступать следующие значения:
    • "3:5"
    • "4:2"
    • "8:7"

    далее, в действие вступает деструктурирующее присваивание, которое будет применено к каждому из элементов массива (по некоторым причинам оно работает и со строками).
    это можно интерпретировать как:
    // используется 1 элемент массива //
    let x, _, y;
    
    [x, _, y] = "3:5";
    /* x === "3", _ === ":", y === "5"  */
    
    // используется 2 элемент массива //
    let x, _, y;
    
    [x, _, y] = "4:2";
    /* x === "4", _ === ":", y === "2"  */
    
    // используется 3 элемент массива //
    let x, _, y;
    
    [x, _, y] = "8:7";
    /* x === "8", _ === ":", y === "7"  */

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

    вы можете заменить _ на любое другое валидное название переменной, чтобы убедиться, что оно не используется.
    или же, как в следующем примере, добавить запятую, чтобы проигнорировать это значение:
    let x, y;
    
    [x, ,y] = "5:3";
    /* x === "5", y === "3" */
    Ответ написан
    1 комментарий