用于 discord 机器人的 base 64 url 转换器

base 64 url converter for discord bot

我使用 api 获取 mincraft 服务器详细信息,它为我提供了 ip、玩家数量和所有爵士乐,但对于服务器图标,它为我提供了一个 base 64url,所以我需要先在内部解码我的不和谐机器人,但我不确定如何做到这一点 https://www.npmjs.com/package/minecraft-server-util 这是我使用的 api 如果你想看一看,如果你需要看一下我的代码,这样你就可以告诉我如何集成它,就是这样

const discord = require("discord.js");
const util = require('minecraft-server-util');
const {MessageEmbed} = require('discord.js');
const bot = new discord.Client();
const token = "my token but i removed it here for privecy reasons";
const PREFIX = "-";


var version = "1.0.1"
util.status("hypixel.net")

bot.on("ready", ()=>{
  console.log("this bot is online!")
})

bot.on("message", message=>{
  let args = message.content.slice(PREFIX.length).split(" ")

  switch(args[0]){
    case "ping":
      message.reply ("pong");
      break;
    case "website":
      message.channel.send("youtube.com/probler")
      break;
    case "info":
      if(args[1] === "version"){
        message.channel.send("We Are Curently In Version " + version)
      }
      else{
        message.channel.send("Invalid Command")
      }
      break;
    case "clear":
      if(!args[1]) return message.reply("Error Please Define A Number")
      message.channel.bulkDelete(args[1]);
      break;

    case "embed":
      const embed = new MessageEmbed()
      .setColor('RANDOM')
      .setTitle("User Information")
      .addField("Player Name", message.author.username, true)
      .addField("Current Server", message.guild.name,)
      .setThumbnail(message.author.displayAvatarURL())
      .setFooter("Version " + version)
      message.channel.send(embed);
      break;

      case 'mc':
        const util = require('minecraft-server-util');
    
        util.status(args[1])
        .then ((response) => {
            const embed = new MessageEmbed()
            .setColor("RANDOM")
            .setTitle('__Server Status__')
            .addField('Server IP', response.host)
            .addField('Server Version', response.version)
            .addField('Online Players', response.onlinePlayers)
            .addField('Max Players', response.maxPlayers)    
            .setThumbnail("Server Icon", response.favicon)
            message.channel.send(embed)
        
        })
       .catch((error, response) => {
           throw error;
       });
       break;
      }
  }
)

bot.login(token);```

解决方案

我花了一些时间和很多失败的测试才弄明白这一点。但我终于成功了,这是最终结果:

const Discord = require('discord.js');
const util = require('minecraft-server-util');

util.status("hypixel.net").then(response => {

    var fav = response.favicon.split(",").slice(1).join(",");
    var imageStream = Buffer.from(fav, "base64");
    var attachment = new Discord.MessageAttachment(imageStream, "favicon.png");
    
    const embed = new Discord.MessageEmbed()
    .attachFiles([attachment])
    .setThumbnail("attachment://favicon.png");

    message.channel.send(embed);
}).catch(console.error);

我使用我的 bot 的 eval 命令测试了它,它使用我自己的 minecraft 服务器的 IP 运行得很好。如果您的 base64 URL 格式或文件类型与我的不同,您可能需要稍微调整代码。

说明

我将在下面解释此解决方案的每个步骤:

  1. response.favicon.split(",").slice(1).join(",")

这从 base64 字符串中获取数据。 base64 的格式通常类似于:data:<media type>;[charset=<character set>];base64,<data>。如您所见,base64的实际数据仅在第一个逗号之后开始,因此我在这行代码中删除了逗号之前的所有内容。

  1. Buffer.from(fav, "base64")

这会将 base64 转换为缓冲区。 Discord 的消息附件不能使用 base64 URLs,但它们可以使用任何可以解析为 Buffer 的东西。这一行允许我们的 base64 数据被转换成可以在 Discord 中作为附件发送的东西。

  1. new Discord.MessageAttachment(imageStream, "favicon.png")

请注意,base64 URLs 和Buffers 都不能直接设置为嵌入的缩略图。缩略图只支持常规URL。所以我们可以使用 discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后再将其移动到缩略图中。这一行创建了我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问这个名称)。

  1. .attachFiles([attachment])

此行将我们新创建的 MessageAttachment 附加到嵌入。它仅作为文件附加,尚未出现在我们嵌入的缩略图中。

  1. .setThumbnail("attachment://favicon.png")

现在我们可以使用 discord.js 的解决方法将我们的图像放入缩略图。我们可以使用 attachment://fileName.extension 来访问我们嵌入的任何和所有附加文件。这将允许我们通过从附件中抓取文件来将嵌入的缩略图、图标或图像设置为 minecraft 服务器的图标。最重要的是,当我们执行此操作时,文件会移动到缩略图,而不会另外作为附件发送。

相关资源

https://discord.js.org/#/docs/main/stable/class/MessageEmbed?scrollTo=attachFiles https://discord.js.org/#/docs/main/stable/class/MessageAttachment

https://github.com/discordjs/discord.js/issues/2175#issuecomment-538948474
^ 这是为 discord.js v11 编写的,并不完全是 full/working 解决方案,但提供了如何执行此操作的一般思路