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

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    content[i] равняется undefined, поэтому получить какие-либо его свойства не выйдет - это то же самое, что и undefined.style.display.

    чтобы избежать подобного рода ошибок, вы можете добавить функцию для проверки:
    const checkContent = i => content[i] !== undefined;
    
    function showTabContent(i = 0) {
        if (checkContent(i)) {
            content[i].style.display = display;
            tab[i].classList.add(activeClass);
        } else {
            // сделать что-нибудь, в случае, если content[i] === undefined
        }
    }
    Ответ написан
  • Сколько можно сделать слотов для select меню?

    Alexandre888
    @Alexandre888 Куратор тега Discord
    Javascript-разработчик
    пунктов в select-меню может быть максимум 25.
    Ответ написан
    1 комментарий
  • Как кинуть приглашение на трибуну?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    используйте метод .setSuppressed():
    <GuildMember>.voice.setSuppressed(false) // предложить пользователю выступать в качестве оратора
    <GuildMember>.voice.setSuppressed(true) // переместить пользователя в "слушатели"
    Ответ написан
  • Как сделать выдачу роли в embed по упоминанию?

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

    P.S.
    все приведенные выше ссылки ведут на материалы для 12 версии discord.js.
    исходя из того, что она больше не поддерживается, и с помощью неё вы не сможете взаимодействовать с новыми возможностями дискорда (слэш-команды, кнопки, модальные окна, select-меню, и т.д), я настоятельно рекомендую вам обновиться до последней версии.

    чтобы это сделать, достаточно ввести в терминал две следующих команды:
    npm uninstall discord.js
    npm install discord.js

    ...а также прочитать официальный гайд по переходу с v12 на v13
    Ответ написан
    Комментировать
  • Как упомянуть автора сообщения?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    <@${message.author.id}>
    Ответ написан
    Комментировать