• Как удалить переписку из личных сообщений всех пользователей сервера Discord?

    Alexandre888
    @Alexandre888 Куратор тега Discord
    Javascript-разработчик
    переписки в Discord устроены таким образом, что одним пользователем (без возможности восстановления) полностью они удалены быть не могут (как, например, в Telegram, по нажатию на «удалить чат без возможности восстановления»).

    когда пользователь нажимает на крестик × рядом с адресатом, он просто «сворачивает» диалог, при этом сообщения не удаляются — переписку можно будет восстановить, введя в поиск сверху имя адресата.

    переписка полностью очищается только в одном случае — когда адресат и адресант удаляют все свои сообщения из диалога; автоматика этого делать не может.
    Ответ написан
    Комментировать
  • Как исправить "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
    Ответ написан
    Комментировать
  • Как разблокировать комментарии?

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

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    - client.on("message", message => { });
    + client.on("messageCreate", message => { });
    Ответ написан
    Комментировать
  • Как сделать картинку в 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]
    });

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