Проблема с voiceStateUpdate в JavaScript

Я пытаюсь заставить работать этого бота Discord. Идея проста: заставить бота отправлять уведомление, когда кто-то присоединяется к голосовому чату. Я делаю это на Atom, ошибка, которую я получил, такова:

TypeError: Cannot read property 'send' of undefined
at Client.client.on (C:\Users\Franco\Desktop\bot\bot.js:15:20)
at emitTwo (events.js:126:13)
at Client.emit (events.js:214:7)
at VoiceStateUpdateHandler.handle (C:\Users\Franco\Desktop\bot\node_modules\discord.js\src\client\websocket\packets\handlers\VoiceStateUpdate.js:39:16)
at WebSocketPacketManager.handle (C:\Users\Franco\Desktop\bot\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (C:\Users\Franco\Desktop\bot\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:333:35)
at WebSocketConnection.onMessage (C:\Users\Franco\Desktop\bot\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:296:17)
at WebSocket.onMessage (C:\Users\Franco\Desktop\bot\node_modules\ws\lib\event-target.js:120:16)
at emitOne (events.js:116:13)
at WebSocket.emit (events.js:211:7)

попытка кода:

client.on("message", function(message) {
  client.on('voiceStateUpdate', (oldMember, newMember) => {
    console.info('lol');
    let newUserChannel = newMember.voiceChannel
    let oldUserChannel = oldMember.voiceChannel
    var channel = client.channels.get('353996293154144259');
    if (oldUserChannel === 353996293154144260 && newUserChannel !== 489674797261783041) {
      channel.send('has joined a voice channel');
      // User Joins a voice channel
    } else if (newUserChannel === 489674797261783041){
       channel.send('has left a voice channel');
    // User leaves a voice channel
    }
  })
})

Console.log предназначен только для проверки, работает ли voiceStateUpdate.

Когда я пытаюсь запустить его, я получаю такую ​​ошибку:

"TypeError: Cannot read property 'send' of undefined"

Насколько я понимаю, ошибка связана с тем, что функция .send не определена.

я получил отсюда почти все:

Все, что я пробовал:

  • Добавить client.on("message", function(message) {

  • Измените .send на .message и .sendMessage

  • попробуйте определить .send

  • измените client.channels.get на lient.channelid.get

  • Изменить / удалить var channel = client.channels.get('353996293154144259');

  • Переместите client.on('voiceStateUpdate', (oldMember, newMember) => { из client.on("message", function(message) {. Когда я это сделаю, у меня возникнет еще одна ошибка.

"Second error i got when i move client.on out: "(node:18196) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message listeners added. Use emitter.setMaxListeners() to increase limit"

Может, какая-то бесполезная информация:

  • 353996293154144259 = id общего чата на сервере Discord

  • 353996293154144260 = id первого голосового чата

  • 489674797261783041 = id второго голосового чата

ОБНОВИТЬ

Хорошо, я решил часть проблемы, мне нужно использовать message.channel.send('has joined a voice channel'); вместо channel.send('has joined a voice channel');, но я не могу заставить его работать так, как я хочу.


Отдельное спасибо Яковлу. Он помогает мне сделать этот пост более полным и качественным.

Как я понял из кода, client.channels.get ('353996293154144259'); возвращается неопознанным.

Gurkan İlleez 13.09.2018 11:20

Если я попробую без этой строки, я продолжу получать ту же ошибку, даже если я заменю ее

franco BlackWP 13.09.2018 11:26

Возможно, 353996293154144259 отсутствует в канале

Gurkan İlleez 13.09.2018 11:27

да, это настоящее, 353996293154144259 это общий идентификатор чата моего тестового сервера Discord

franco BlackWP 13.09.2018 11:30

Сделайте мне вкус, добавьте строку client.channels.forEach((i,j)=>{console.info(j)}), посмотрите, действительно ли существует объект с указанным вами идентификатором.

MT-FreeHK 13.09.2018 12:10

@MatrixTaiw я получил это после добавления вашей строки 353996293154144259 353996293154144260 489674797261783041 У меня есть 3 канала на сервере. Текст: Общий - голос: Общий и Общий2

franco BlackWP 13.09.2018 12:15

Переменная вашего канала не определена. Вот почему вы получаете ошибку. В undefned нет функции отправки.

Martin Godzina 13.09.2018 12:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
7
8 466
3

Ответы 3

Заменять

var channel = client.channelID.get('353996293154144259');

с участием

var channel = client.channels.get('353996293154144259');

Редактировать: Начиная с версии 12 это

var channel = client.channels.cache.get('353996293154144259');

Для меня это не сработает, это то же самое, если я поставлю var channel = client.channels.get ('353996293154144259'); или var channel = client.channelID.get ('353996293154144259'); Я не могу заставить бота отправлять правильное сообщение на номер 353996293154144259 Спасибо за помощь

franco BlackWP 13.09.2018 13:00
var channel = client.channels.get('353996293154144259');

это не сработало для меня, поэтому я использовал вместо этого:

const channel = client.channels.cache.filter((channel) => channel.name === 'name').first();

и было бы лучше использовать это, но поиск идентификатора:

const channel = client.channels.cache.filter((channel) => channel.id === '353996293154144259').first();

Я бразилец, мой язык - бразильский португальский!

const Discord = require('discord.js'),
  client = new Discord.Client(),
  colors = require('colors/safe');

client.on('voiceStateUpdate', (oldMember, newMember) => {
  
  let newUserChannel = newMember.channelID;
  let oldUserChannel = oldMember.channelID;
  let userid = newMember.id;

// ----------- verificação --------------

  let selfmute = newMember.mute;
  let mute = newMember.selfMute;
  let selfmute1 = oldMember.mute;
  let mute1 = oldMember.selfMute;
  let selfdeaf = newMember.selfDeaf;
  let selfdeaf1 = oldMember.selfDeaf;  
  let selfvid = newMember.selfVideo;
  let selfvid1 = oldMember.selfVideo;
  let deaf = newMember.deaf;
  let deaf1 = oldMember.deaf;
  let servmute = newMember.serverMute;
  let servmute1 = oldMember.serverMute;

  if ( selfmute == true ) return;
  if ( mute == true ) return;
  if ( selfmute1 == true ) return;
  if ( mute1 == true ) return;
  if ( selfdeaf == true ) return;
  if ( selfdeaf1 == true ) return;
  if ( selfvid == true ) return;
  if ( selfvid1 == true ) return;
  if ( deaf == true ) return;
  if ( deaf1 == true ) return;
  if ( servmute == true ) return;
  if ( servmute1 == true ) return;

// -------- definindo cores ----------

var a = colors.red('[-] ');
var b = colors.green('[+] ');
var c = colors.blue('[!] ');

// -------- menssagem / log ----------

       if ( newUserChannel === "827668874542579797") { //id voice channel

          console.info(c+"- id: "+userid)
          console.info(b+"- Entrou em: "+newUserChannel);   

       } else if ( oldUserChannel === "827668874542579797") { //id voice channel
           
           console.info(c+"- id: "+userid)
           console.info(a+"- Saiu de: "+oldUserChannel);

       } else {

           console.info(c+"- Ratos estão dialogando...");

       }
    
})
//----------------Comando pra ficar on-------------

client.login("TOKEN");

Другие вопросы по теме