• Перестал работать бот после обновления DS, почему?

    Syjalo
    @Syjalo
    Представьте себе бота
    3 недели назад Discord анонсировали изменение API, которое затронуло исходный код discord.js. Вчера было выпущено в публичный API. Обновитесь до последней версии.

    v14: npm i discord.js@latest
    v13: npm i discord.js@v13-lts
    Ответ написан
    1 комментарий
  • Как при воспроизведении музыки сделать что-бы бот не ставился на автопаузу?

    Syjalo
    @Syjalo
    Представьте себе бота
    Обновитесь до @discordjs/voice@0.15.0
    npm i @discordjs/voice@latest
    Ответ написан
    Комментировать
  • Как сделать, что бы бот присоединялся в голосовой канал | node js 14?

    Syjalo
    @Syjalo
    Представьте себе бота
    Есть официальный гайд по @discordjs/voice.

    Если я нахожу нужное, то оно на / команде, а мне нужно на префикс команду

    Вообще не оправдание. Просто взаимодействие с интеракцией заменяется взаимодействием с сообщением.
    Ответ написан
    Комментировать
  • Как получить банер пользователя Discord js?

    Syjalo
    @Syjalo
    Представьте себе бота
    Как указано в документации пользователь должен быть принудительно получен из API, чтобы у него был хеш баннера.
    await client.users.fetch('id', { force: true });
    // или
    await user.fetch();

    Далее можно получить URL
    user.bannerURL();

    Discord не отправляет хеш баннера через Gateway, так что он не закэширован в discord.js вместе с самим пользователем. Нужно получать пользователя принудительно, так как .fetch() сначала проверяет кэш, прежде чем запросить данные из API.
    Ответ написан
    Комментировать
  • Как убрать реакцию дискорд бота на команду?

    Syjalo
    @Syjalo
    Представьте себе бота
    Никак
    Ответ написан
    Комментировать
  • Почему бот думает что уже ответил?

    Syjalo
    @Syjalo
    Представьте себе бота
    Возможно был ответ await interaction.deferReply() в обработчике команд. Других вариантов не вижу.
    Ответ написан
    Комментировать
  • Что делать "Code: 500" /gateway/bot?

    Syjalo
    @Syjalo
    Представьте себе бота
    Ничего не сделать. 5xx — проблемы на стороне Discord.
    Ответ написан
    Комментировать
  • Как на сайте вывести онлайн Discord сервера?

    Syjalo
    @Syjalo
    Представьте себе бота
    Для начала убедитесь, что у вас есть интент GuildPresences.
    const onlineCount = <Guild>.presences.cache.reduce(
      (accumulator, presence) => (presence.status !== 'offline' ? accumulator + 1 : accumulator),
      0,
    );
    Ответ написан
  • Как сделать обновление кнопок?

    Syjalo
    @Syjalo
    Представьте себе бота
    У вас есть ряды с кнопками. Можно просто находить нужную кнопку и роль, менять цвет кнопки и добавлять или снимать роль.
    const roleIds = {
      giveaways: 'id',
      events: 'id',
    }
    
    const hasRole = (customId) => interaction.member.roles.cache.has(roleIds[customId]);
    const getStyle = (customId) => hasRole(customId) ? ButtonStyle.Success : ButtonStyle.Danger;
    
    const components = [
      new ActionRowBuilder()
        .setComponents(
          new ButtonBuilder()
            .setCustomId('giveaways')
            .setLabel('Конкурсы')
            .setStyle(getStyle('giveaways'))
        ),
      new ActionRowBuilder()
        .setComponents(
          new ButtonBuilder()
            .setCustomId('events')
            .setLabel('Ивенты')
            .setStyle(getStyle('events'))
        ),
    ]
    
    const response = await interaction.reply({ components });
    
    const collector = response.createMessageComponentCollector({
      componentType: ComponentType.Button,
      filter: (i) => i.user.id === interaction.user.id,
      time: 60000,
    });
    
    collector.on('collect', async (i) => {
      const { customId } = i;
      const roleId = roleIds[customId];
    
      if (hasRole(customId)) await i.member.roles.remove(roleId);
      else await i.member.roles.add(roleId);
    
      components
        .flatMap((row) => row.components)
        .find((component) => component.customId === customId)
        .setStyle(getStyle(customId));
    
      await i.update({ components });
    });
    
    collector.on('ignore', async (i) => await i.reply({ content: 'Не для вас', ephemeral: true }));

    Для добавления новой кнопки нужно просто добавить новый ряд и добавить id роли в объект.
    Ответ написан
    Комментировать
  • Как сделать рассылку всем участникам? Discord.JS v13 Node 16?

    Syjalo
    @Syjalo
    Представьте себе бота
    Такое сделать нельзя. Бот будет помечен как спамер и не сможет отправлять сообщения. Лучше всего создать новостной канал.
    Ответ написан
  • Почему не уменьшается значение в баннере дискорд?

    Syjalo
    @Syjalo
    Представьте себе бота
    При выходе из голосового канала VoiceState не удаляется из кэша, его канал просто становится null.
    Просто посчитайте VoiceState с каналами.
    <Guild>.voiceStates.cache.reduce((acc, state) => state.channelId ? acc + 1 : acc, 0);
    Ответ написан
    Комментировать
  • Почему бот после запуска игнорирует первое событие?

    Syjalo
    @Syjalo
    Представьте себе бота
    Не все участники есть в кэше клиента. Они появляются там тогда, когда бот каким-либо образом повзаимодействовал с участником. Добавление интента GuildPresences добавляет участников в кэш, так как вы даете знать Discord Gateway, что хотите получать информацию о презенсах участников. Gateway отправляет клиенту эту информацию при старте и добавляет участников в кэш, НО только тех, кто не офлайн и не указал невидимый статус. Следовательно если у участника невидимый статус и он ни разу не взаимодействовал с ботом и он выйдет из сервера, то событие guildMemberRemove будет проигнорировано, так как этого участника нет в кэше.

    Почему так происходит?
    Это сделано для таго, чтобы вы всегда могли быть уверены, что в событии придут все данные; то есть и новые данные участника, и старый. Так как Discord не отправляет старые данные, то они берутся из кэша, а раз их в кэше нет, значит данные неполные и событие не срабатывает.

    Решением этой проблемы являются партиалы, которые дают знать клиенту, что вы готовы к получению неполных данных. Неполные данные означают, что в данных может содержаться только id и ничего другого.
    Подробнее о партиалах
    Ответ написан
    Комментировать
  • Как исправить ошибку?

    Syjalo
    @Syjalo
    Представьте себе бота
    Если вы хотите, чтобы команда работала только у администраторов, то используйте Administrator, а не KickMembers.
    Так же if принимает только 1 параметр; вам следует использовать логическое И (&&) и подучить JavaScript.
    Ответ написан
  • Как получить поле "обо мне" в discord.js?

    Syjalo
    @Syjalo
    Представьте себе бота
    Это поле нельзя получить через Discord API для ботов.
    Ответ написан
    Комментировать
  • Кнопка, доступная только для определенных лиц - Discord.js?

    Syjalo
    @Syjalo
    Представьте себе бота
    Как сделать, чтобы кнопка была доступна только для меня?

    1) Если кнопка была отправлена слэш командой, то в слушателе interactionCreate проверяем, чтобы interaction.message.interaction.user.id был равен interaction.user.id.
    2) Если кнопка была отправлена обычными сообщением, то в customId кнопки добавляем id того, кто может использовать кнопку и сравниваем его с interaction.user.id.
    3) Отправить ephemeral ответ на интеракцию, чтобы сообщение мог видеть только отправитель команды.
    4) Использовать коллекторы
    Message#createMessageComponentCollector()
    InteractionResponse#createMessageComponentCollector()

    Как сделать слушатель кнопки?

    1) Через ивент interactionCreate
    client.on('interactionCreate', (interaction) => {
      if (interaction.isButton()) {
        // code here
      }
    });

    2) Через коллекторы
    const collector = <Message>.createMessageComponentCollector({ componentType: ComponentType.Button });
    collector.on('collect', (interaction) => {
      // code here
    });
    Ответ написан
    2 комментария
  • Ошибка typeerror cannot read properties of undefined (reading 'cache') discord.js?

    Syjalo
    @Syjalo
    Представьте себе бота
    /app/node_modules/discord.js/src/client/actions/MessageCreate.js:11
    const existing = channel.messages.cache.get(data.id);
    ^
    
    TypeError: Cannot read properties of undefined (reading 'cache')
    at MessageCreateAction.handle (/app/node_modules/discord.js/src/client/actions/MessageCreate.js:11:41)
    at Object.module.exports [as MESSAGE_CREATE] (/app/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/app/node_modules/discord.js/src/client/websocket/WebSocketManager.js:386:31)
    at WebSocketShard.onPacket (/app/node_modules/discord.js/src/client/websocket/WebSocketShard.js:436:22)
    at WebSocketShard.onMessage (/app/node_modules/discord.js/src/client/websocket/WebSocketShard.js:293:10)
    at WebSocket.onMessage (/app/node_modules/ws/lib/event-target.js:132:16)
    at WebSocket.emit (node:events:527:28)
    at Receiver.receiverOnMessage (/app/node_modules/ws/lib/websocket.js:1008:20)
    at Receiver.emit (node:events:527:28)
    at Receiver.dataMessage (/app/node_modules/ws/lib/receiver.js:517:14)

    Эта ошибка возникает на версиях discord.js v13.7.0 и ниже при получении сообщения из новых текстовых чатов в голосовых каналах.
    Решение: обновиться до v13.8.0 или выше.

    Последние версии
    Ответ написан
    Комментировать
  • Как узнать статус пользователя - Discord.js?

    Syjalo
    @Syjalo
    Представьте себе бота
    Убедитесь, что у вас есть интент GuildPresences.
    <GuildMember>.presence?.status
    <GuildMember>.presence может быть null, когда участник офлайн или скрыл свой статус.
    Ответ написан
  • Как правильно написать ивент?

    Syjalo
    @Syjalo
    Представьте себе бота
    Убедитесь, что у вас есть интент GuildVoiceStates (v14), GUILD_VOICE_STATES (v13).
    Событие при входе участника в голосовой канал:
    client.on("voiceStateUpdate", (oldState, newState) => {
      if (!oldState.channelId && newState.channelId) {
        // code
      }
    });

    Событие при выходе участника из голосового канала:
    client.on("voiceStateUpdate", (oldState, newState) => {
      if (oldState.channelId && !newState.channelId) {
        // code
      }
    });
    Ответ написан
    Комментировать
  • Как отправить сообщение при входе моего бота на сервер?

    Syjalo
    @Syjalo
    Представьте себе бота
    Предоставленный код похож на код discord.js v12.
    v12 является устаревшей версией и может работать нестабильно.
    На данный момент стабильной версией является v13.8.1.

    Для v13 удостоверьтесь, что у вас есть интент GUILDS в опциях клиента.
    client.on("guildCreate", guild => {
      const channel = guild.channels.cache.find(channel => channel.isText() && channel.permissionsFor(client.user).has(["VIEW_CHANNEL", "SEND_MESSAGES"]));
      if (!channel) return;
      channel.send("Worked!");
    });
    Ответ написан
    Комментировать
  • Методы keys(), values(), entries() находятся в Symbol.iterator у итерируемых объектов?

    Syjalo
    @Syjalo
    Представьте себе бота
    keys(), values() и entries() — методы Map, Set, Array и Object, которые возвращают итератор или массив, у которого есть метод по ключу Symbol.iterator.

    Symbol.iterator — символ, который выступает в качестве ключа (имени) для метода, который возвращает итератор.
    Ответ написан
    1 комментарий