Задать вопрос
  • Как разблокировать комментарии?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    Почему я не могу почитать комментарии под этим видео?:

    потому что под видео, которые отмечены как "для детей", комментарии оставлять нельзя.
    Ответ написан
    Комментировать
  • Как исправить ошибку "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.
    Ответ написан
    Комментировать
  • Почему не работает callback функция внутри slice()?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    почему моя callback стрелочная функция не возвращает 5-ку?


    термин «callback» никак не связан с текущим кодом, почитайте определение на learn.js

    - let result = str.slice(0, () => str.indexOf('Morning')) + paste
    + let result = str.slice(0, (() => str.indexOf('Morning'))()) + paste
    
    - () => str.indexOf('Morning');
    + (() => str.indexOf('Morning'))();


    вы просто передали стрелочную функцию в .slice, вы не вызвали её.

    функция вернёт какое-либо значение только в том случае, если вы её вызовите.

    только непонятно, зачем использовать функцию, если можно просто указать str.slice(0, str.indexOf("..."))

    подразумеваю, что это тест возможностей языка
    Ответ написан
    2 комментария
  • Какое различие между этими функциями?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    1. «Function expression» https://learn.javascript.ru/function-expressions
    2. «Function declaration» https://learn.javascript.ru/function-basics

    о различиях по первой ссылке
    Ответ написан
    Комментировать
  • Как убрать панель с поиском в Visual studio code?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    ПКМ кликнуть по панели и отключить.

    202279638-ee914ec9-ae1c-4223-ad4b-50974efa9f10.png
    Ответ написан
    Комментировать
  • Есть ли способ сделать бота-клиента, а не бота на сервере?

    Alexandre888
    @Alexandre888 Куратор тега Discord
    Javascript-разработчик
    сделать бота, который будет находиться на сервере от лица клиента на сервере, а не бота сервера.

    ботов такого типа называют Self-bots или Automated user accounts, это автоматизированные аккаунты обычных пользователей Discord.

    сделать можно, но повлечет за собой очень быструю блокировку аккаунта, возможно даже по IP-адресу, что исключит возможность создавать новые аккаунты без использования VPN/прокси.

    позиция Discord насчет подобных ботов: https://support.discord.com/hc/en-us/articles/1150...
    Ответ написан
    Комментировать
  • Как сделать картинку в 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 комментария