Ответы пользователя по тегу discord.js
  • Как добавить слушатель к кнопке - Discord.js?

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

    Ответ написан
    Комментировать
  • Ошибка "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'е можно вставлять только в:
    • описание
    • значения филдов

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

    указывается полная ссылка с протоколом.
    Ответ написан
  • Как сделать 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 комментариев
  • Как кинуть приглашение на трибуну?

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

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    interaction.guild.channels.create(...).then(channel => channel.send("сообщение"))

    или
    let text = await interaction.guild.channels.create(...);
    await text.send("сообщение")
    P. S

    `classic ${interaction.username}`

    если вы хотите указать имя аккаунта пользователя, который использовал слэш-команду, вы должны использовать interaction.member.user.username

    если вы хотите указать никнейм пользователя, который у него установлен на текущем сервере, вы должны использовать interaction.member.nickname
    Ответ написан
  • Как проверить превосходство роли бота над ролью участника?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    если вы именно хотите проверить, сможет ли бот забанить определенного пользователя, вы можете использовать свойство .bannable:
    member.bannable // false в случае, если бот не может забанить юзера; true в случае, если бот может забанить юзера (зависит от позиции самой высокой роли у бота и у юзера)

    но, если вы просто хотите сравнить две роли, вы можете использовать метод .comparePositions(), чтобы узнать разницу в позициях обоих ролей (в примере ниже сравнивается наивысшая роль у юзера и наивысшая роль у бота):
    guild.roles.comparePositions(member.roles.highest, guild.me.roles.highest)
    *   метод вернёт отрицательное число, если позиция первой роли < позиции второй роли;
        метод вернёт положительное число, если позиция первой роли > позиции второй роли;
        метод вернёт 0, если позиция первой роли = позиции второй роли.

    для примера:

     -3 | вторая роль > первой на 3 позиции
      5 | первая роль > второй на 5 позиций
    Ответ написан
    Комментировать
  • Как исправить проблему с эмодзи в эмбеде?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    .setDescription(`${message.guild.emojis.cache.get("id_эмодзи")}`)

    чтобы получить ID, нужно отправить в чат \:название_эмодзи:
    Ответ написан
    Комментировать
  • Как получить название удаленного канала в Discord.js?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    channelCreate используется в случае, если канал создаётся.
    в вашем случае нужно использовать channelDelete:
    client.on("channelDelete", channel => {
        console.log(channel.name)
    })
    Ответ написан
  • Как сделать мут после определенного количества предупреждений?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    для такого функционала используется база данных.
    при обнаружении ссылки, в БД записывается:
    1. ID сервера, на котором пользователь отправил ссылку
    2. ID пользователя
    3. кол-во предупреждений у пользователя (если это его первое нарушение - 1, если повторное - текущее кол-во предупреждений + 1

    далее, делается запрос к БД и полученные данные сверяются.

    если же вы на данном этапе не готовы её использовать, можно всё это делать записывая данные, например, в коллекцию:
    function is_url(str) {
      let regexp = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
      if(regexp.test(str)) {
        return true;
      } else {
        return false;
      }
    }
    
    let warns = new Map();
    
    client.on('messageCreate', async message => {
    	if (is_url(message.content) === true) {
    		const embed = new MessageEmbed()
    			.setTitle('Обнаружена ссылка!')
    			.setDescription(`Ссылки на нашем сервере запрещены\nНе присылай их больше пожалуйста, это наказуемо.`)
    			.setThumbnail(message.author.avatarURL())
    			.setTimestamp()
    			.setColor('RED')
    			.setFooter('Ознакомьтесь с правилами')
    
    		if (!warns.has(message.author.id)) {
    			warns.set(message.author.id, 1);
    			message.channel.send({ content: `<@${message.author.id}>`, embeds: [embed] })
    		} else {
    			warns.set(message.author.id, warns.get(message.author.id) + 1);
    
    			if (warns.get(message.author.id) === 2) {
    				return функция_мута();
    			} else if (warns.get(message.author.id) >= 3) {
    				warns.delete(message.author.id);
    				return функция_бана();
    			}
    		}
    	}
    });

    учтите, что для подобного варианта нужно обеспечивать бесперебойную работу бота, т.к после его остановки содержимое коллекции очистится.
    Ответ написан
    Комментировать
  • Как правильно поставить автора и footer в embed'e discord.js 13?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    https://discordjs.guide/popular-topics/embeds.html...
    - const { Client, Intents } = require('discord.js');
    + const { Client, Intents, MessageEmbed } = require('discord.js');
    
    // ... //
    
    - const embed = new Discord.MessageEmbed()
    -    .setAuthor("Айпи наших серверов")
    -    .setColor('#228B22')
    -    .setDescription("Servername #1 - 37.230.210.97:27015 [Online " + play + "/128]")
    -    .setFooter("© SKRP. Все права защищены.")
    -    .setTimestamp()
    
    + const embed = new MessageEmbed();
    +    .setAuthor({ name: "Айпи наших серверов" })
    +    .setColor('#228B22')
    +    .setDescription("Servername #1 - 37.230.210.97:27015 [Online " + play + "/128]")
    +    .setFooter({ text: "© SKRP. Все права защищены." })
    +    .setTimestamp()


    (node:7672) DeprecationWarning: The message event is deprecated. Use messageCreate instead

    - client.on('message', async message => { /* ... */ })
    + client.on('messageCreate', async message => { /* ... */ })
    Ответ написан
    1 комментарий
  • Как получить информацию о сообщении пользователя, на которое ответил другой пользователь?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    используйте метод .fetchReference():
    client.on('messageCreate', async message => {
    	try {
    		if (message.type === "REPLY") {
    			let messageReference = await message.fetchReference();
    	
    			console.log(messageReference.author.id) // ID пользователя, на сообщение которого ответили.
    		}
    	} catch (err) {
    		if (err.name === "Error [MESSAGE_REFERENCE_MISSING]") {
    			console.log("это обычное сообщение.")
    		}
    	}
    });
    Ответ написан
    Комментировать