簡體   English   中英

需要幫助將機器人更新到 Discord.js v12

[英]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);

.fetch()返回一個Promise
因此,您需要使用.then()等待結果。

在您的代碼中(假設logsChannel是一個 ID):

client.channels
    .fetch(logsChannel)
    .then(fetchedChannel => fetchedChannel.send(embed_delete));

目前,您需要更新所有.fetch es

正如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM