Я пытаюсь заставить работать этого бота 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');
, но я не могу заставить его работать так, как я хочу.
Отдельное спасибо Яковлу. Он помогает мне сделать этот пост более полным и качественным.
Если я попробую без этой строки, я продолжу получать ту же ошибку, даже если я заменю ее
Возможно, 353996293154144259 отсутствует в канале
да, это настоящее, 353996293154144259 это общий идентификатор чата моего тестового сервера Discord
Сделайте мне вкус, добавьте строку client.channels.forEach((i,j)=>{console.info(j)})
, посмотрите, действительно ли существует объект с указанным вами идентификатором.
@MatrixTaiw я получил это после добавления вашей строки 353996293154144259 353996293154144260 489674797261783041 У меня есть 3 канала на сервере. Текст: Общий - голос: Общий и Общий2
Переменная вашего канала не определена. Вот почему вы получаете ошибку. В undefned нет функции отправки.
Заменять
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 Спасибо за помощь
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");
Как я понял из кода, client.channels.get ('353996293154144259'); возвращается неопознанным.