用于 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 格式或文件类型与我的不同,您可能需要稍微调整代码。
说明
我将在下面解释此解决方案的每个步骤:
response.favicon.split(",").slice(1).join(",")
这从 base64 字符串中获取数据。 base64 的格式通常类似于:data:<media type>;[charset=<character set>];base64,<data>
。如您所见,base64的实际数据仅在第一个逗号之后开始,因此我在这行代码中删除了逗号之前的所有内容。
Buffer.from(fav, "base64")
这会将 base64 转换为缓冲区。 Discord 的消息附件不能使用 base64 URLs,但它们可以使用任何可以解析为 Buffer
的东西。这一行允许我们的 base64 数据被转换成可以在 Discord 中作为附件发送的东西。
new Discord.MessageAttachment(imageStream, "favicon.png")
请注意,base64 URLs 和Buffers 都不能直接设置为嵌入的缩略图。缩略图只支持常规URL。所以我们可以使用 discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后再将其移动到缩略图中。这一行创建了我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问这个名称)。
.attachFiles([attachment])
此行将我们新创建的 MessageAttachment
附加到嵌入。它仅作为文件附加,尚未出现在我们嵌入的缩略图中。
.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 解决方案,但提供了如何执行此操作的一般思路
我使用 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 格式或文件类型与我的不同,您可能需要稍微调整代码。
说明
我将在下面解释此解决方案的每个步骤:
response.favicon.split(",").slice(1).join(",")
这从 base64 字符串中获取数据。 base64 的格式通常类似于:data:<media type>;[charset=<character set>];base64,<data>
。如您所见,base64的实际数据仅在第一个逗号之后开始,因此我在这行代码中删除了逗号之前的所有内容。
Buffer.from(fav, "base64")
这会将 base64 转换为缓冲区。 Discord 的消息附件不能使用 base64 URLs,但它们可以使用任何可以解析为 Buffer
的东西。这一行允许我们的 base64 数据被转换成可以在 Discord 中作为附件发送的东西。
new Discord.MessageAttachment(imageStream, "favicon.png")
请注意,base64 URLs 和Buffers 都不能直接设置为嵌入的缩略图。缩略图只支持常规URL。所以我们可以使用 discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后再将其移动到缩略图中。这一行创建了我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问这个名称)。
.attachFiles([attachment])
此行将我们新创建的 MessageAttachment
附加到嵌入。它仅作为文件附加,尚未出现在我们嵌入的缩略图中。
.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 解决方案,但提供了如何执行此操作的一般思路