[英]Need Help Updating Bot to Discord.js v12
我正在尝试更新此代码以使用 Discord.js v12。 我遇到了一个错误,我对如何解决这个错误有点困惑。 我已经更新了一些代码以使用 Discord.js v12。
类型错误:client.channels.fetch(...).send 不是 function
在客户端。 (/home/runner/Log/index.js:44:40) 在 Client.emit (events.js:314:20) 在 Client.EventEmitter.emit (domain.js:483:12) 在 MessageCreateAction.handle (/ home/runner/Log/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14) 在 Object.module.exports [as MESSAGE_CREATE] (/home/runner/Log/node_modules/discord.js/ src/client/websocket/handlers/MESSAGE_CREATE.js:4:32) 在 WebSocketManager.handlePacket (/home/runner/Log/node_modules/discord.js/src/client/websocket/WebSocketManager.js:384:31) 在 WebSocketShard .onPacket (/home/runner/Log/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22) 在 WebSocketShard.onMessage (/home/runner/Log/node_modules/discord.js/src/ client/websocket/WebSocketShard.js:301:10) 在 WebSocket.onMessage (/home/runner/Log/node_modules/ws/lib/event-target.js:132:16)
const Discord = require('discord.js');
const client = new Discord.Client();
const { prefix, token, logsChannel } = require('./config.json');
client.once('ready', () => {
console.log('I am alive!');
});
// Messages log
client.on('message', message => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
if(message.author.bot) return;
let username = message.author.tag;
let channel = message.channel.name;
let server = message.channel.guild;
var serverAvatarURL = message.guild.iconURL;
var attachment = (message.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_send = new Discord.MessageEmbed()
.setAuthor(username, message.author.avatarURL)
.setColor('23c115')
.setTitle("Message sent!")
.setDescription(message.content + " " + img)
.setImage(img)
.setFooter("#" + channel)
.setTimestamp();
client.channels.fetch(logsChannel).send(embed_send);
});
// Message edit log
client.on("messageUpdate", async(oldMessage, newMessage) => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
if (oldMessage.content === newMessage.content) {
return;
}
var attachment = (oldMessage.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_edit = new Discord.MessageEmbed()
.setAuthor(oldMessage.author.tag, oldMessage.author.avatarURL)
.setColor('2615c1')
.setTitle("Message edited!")
.addField("Old", oldMessage.content + " " + img, true)
.addField("New", newMessage.content + " " + img, true)
.setFooter("#" + oldMessage.channel.name)
.setTimestamp();
client.channels.fetch(logsChannel).send(embed_edit);
});
// Message delete log
client.on("messageDelete", async message => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
var attachment = (message.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_delete = new Discord.MessageEmbed()
.setAuthor(message.author.tag, message.author.avatarURL)
.setColor('c11515')
.setTitle("Message deleted!")
.setDescription(message.content + " " + img)
.setImage(img)
.setFooter("#" + message.channel.name)
.setTimestamp();
client.channels.fetch(logsChannel).send(embed_delete);
});
client.login(token);
原始代码:
const Discord = require('discord.js');
const client = new Discord.Client();
const { prefix, token, logsChannel } = require('./config.json');
client.once('ready', () => {
console.log('I am alive!');
});
// Messages log
client.on('message', message => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
if(message.author.bot) return;
let username = message.author.tag;
let channel = message.channel.name;
let server = message.channel.guild;
var serverAvatarURL = message.guild.iconURL;
var attachment = (message.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_send = new Discord.RichEmbed()
.setAuthor(username, message.author.avatarURL)
.setColor('23c115')
.setTitle("Message sent!")
.setDescription(message.content + " " + img)
.setImage(img)
.setFooter("#" + channel)
.setTimestamp();
client.channels.get(logsChannel).send(embed_send);
});
// Message edit log
client.on("messageUpdate", async(oldMessage, newMessage) => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
if (oldMessage.content === newMessage.content) {
return;
}
var attachment = (oldMessage.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_edit = new Discord.RichEmbed()
.setAuthor(oldMessage.author.tag, oldMessage.author.avatarURL)
.setColor('2615c1')
.setTitle("Message edited!")
.addField("Old", oldMessage.content + " " + img, true)
.addField("New", newMessage.content + " " + img, true)
.setFooter("#" + oldMessage.channel.name)
.setTimestamp();
client.channels.get(logsChannel).send(embed_edit);
});
// Message delete log
client.on("messageDelete", async message => {
// Function
function isEmpty(collection) {
for(var arg in collection) {
if(collection.hasOwnProperty(arg))
return false;
}
return true;
}
// Logs
var attachment = (message.attachments).array();
if(isEmpty(attachment)) {
var img = "";
} else {
var img = attachment[0].url;
}
let embed_delete = new Discord.RichEmbed()
.setAuthor(message.author.tag, message.author.avatarURL)
.setColor('c11515')
.setTitle("Message deleted!")
.setDescription(message.content + " " + img)
.setImage(img)
.setFooter("#" + message.channel.name)
.setTimestamp();
client.channels.get(logsChannel).send(embed_delete);
});
client.login(token);
正如 NullDev 所提到的, .fetch()
返回一个 promise 所以需要先解决它。 您可以使用 .then( .then()
和.catch()
方法或async
/ await
。
使用 .then( .then()
.catch()
:
client.channels
.fetch(logsChannel)
.then((ch) => ch.send(embed_send))
.catch(console.error);
与async
/ await
相同:
try {
(await client.channels.fetch(logsChannel)).send(embed);
} catch (error) {
console.log(error);
}
如果您在三个不同的处理程序中使用了 function (如isEmpty
),则可以将其移出并仅定义一次。 虽然你甚至不需要这个。 message.attachments
返回消息中的附件集合。 Collections 有一个.size
访问器属性,它返回集合中元素的数量。
检查是否有附件就像检查其大小一样简单: message.attachments.size > 0
。
Collections 也有一个 .first .first()
方法来获取这个集合中的第一个值。 这意味着您可以获得第一个附件的 URL ,如下所示: message.attachments.first().url
。
另一个错误是message.author.avatarURL
将不起作用,因为.avatarURL()
是一种方法,因此您应该调用它。 您可能可以使用displayAvatarURL()
代替,因为如果用户没有任何头像,它会返回用户的默认头像。
您可以在代码下方找到所有这些更改:
const Discord = require('discord.js');
const client = new Discord.Client();
const { prefix, token, logsChannel } = require('./config.json');
client.once('ready', () => {
console.log('I am alive!');
});
client.on('message', async (message) => {
if (message.author.bot) return;
let username = message.author.tag;
let channel = message.channel.name;
let img = message.attachments.size > 0 ? message.attachments.first().url : '';
let embed = new Discord.MessageEmbed()
.setAuthor(username, message.author.displayAvatarURL())
.setColor('23c115')
.setTitle('Message sent!')
.setDescription(message.content + ' ' + img)
.setImage(img)
.setFooter('#' + channel)
.setTimestamp();
try {
let log = await client.channels.fetch(logsChannel);
log.send(embed);
} catch (error) {
console.log(error);
}
});
client.on('messageUpdate', async (oldMessage, newMessage) => {
if (oldMessage.content === newMessage.content) return;
let img =
oldMessage.attachments.size > 0 ? oldMessage.attachments.first().url : '';
let embed = new Discord.MessageEmbed()
.setAuthor(oldMessage.author.tag, oldMessage.author.displayAvatarURL())
.setColor('2615c1')
.setTitle('Message edited!')
.addField('Old', oldMessage.content + ' ' + img, true)
.addField('New', newMessage.content + ' ' + img, true)
.setFooter('#' + oldMessage.channel.name)
.setTimestamp();
try {
let log = await client.channels.fetch(logsChannel);
log.send(embed);
} catch (error) {
console.log(error);
}
});
client.on('messageDelete', async (message) => {
let img = message.attachments.size > 0 ? message.attachments.first().url : '';
let embed = new Discord.MessageEmbed()
.setAuthor(message.author.tag, message.author.displayAvatarURL())
.setColor('c11515')
.setTitle('Message deleted!')
.setDescription(message.content + ' ' + img)
.setImage(img)
.setFooter('#' + message.channel.name)
.setTimestamp();
try {
let log = await client.channels.fetch(logsChannel);
log.send(embed);
} catch (error) {
console.log(error);
}
});
client.login(token);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.