discord.js 参数分隔符问题
discord.js argument separator issue
我一直在努力让我的 args 起作用,它们确实起作用了,但我不确定如何为它制作分隔符,所以我不必两次使用该命令。这是我的代码。
const discord = require('discord.js');
const Jimp = require('jimp');
const fs = require('fs')
module.exports = {
name: "cat",
aliases: [],
run: async(client, message, args) => {
//const top = args[0]
//const bottom = args[1]
let [top, bottom] = args
Jimp.read("assets/cat.jpg").then(function(image) {
Jimp.loadFont(Jimp.FONT_SANS_32_WHITE).then(function(font) {
image.print(font, 60, 22, top, 5);
image.print(font, 60, 350, bottom);
image.write('output-image.jpg');
});
});
await message.channel.send({
files: [
"output-image.jpg"
]
});
fs.unlinkSync('output-image.jpg');
}
};
这是我得到的输出。
output image here
问题是您想在 promise 的 .then()
方法之外发送文件。当您调用 await message.channel.send()
时,文件正被 jimp
读取,而 output-image.jpg
还远没有准备好。
使用异步等待
由于您的 run()
方法已经是一个异步函数,您可以使用 async-await 使您的代码更具可读性。这样您就可以摆脱回调并更容易地了解正在发生的事情以及顺序。
缓冲区而不是文件
正如 Skulaurun Mrusal 在他们的 , you don't even need to save the file, you could just send a buffer. Jimp has a .getBuffer()
方法中提到的那样,您可以使用它来生成图像的二进制缓冲区。
您可以将此缓冲区作为附件发送。 Discord.js 有一个 MessageAttachment
接受缓冲区作为第一个参数的对象。您可以将此附件传递给 message.channel.send(new MessageAttachment(buffer))
.
接受长度超过一个单词的文本
目前,由于您的 args
是一组 space 分隔的字符串,您只能添加一个单词作为顶部文本,另一个单词作为底部文本。接受双引号内的两个较长文本可能更容易 ("
).
所以命令应该这样使用:
!cat "This is the text on the top" "And we are down here"
您可以使用“简单”的正则表达式来匹配双引号内的字符串。在下一个示例中,您可以看到 matches
是双引号内的两个子字符串的数组。它们也包含引号,因此您需要使用 String#replace()
方法去除它。
let content = '!cat "This is the text on the top" "And we are down here"'
let matches = content.match(/"(.*?)"/g)
console.log({ matches })
文本对齐方式
目前您正在使用“幻数”(60、22、350、5 等)来定位文本。它不会工作,并且(取决于通过命令提交的文本)它会遍布整个图像,并且很可能永远不会居中。
Jimp 有不同 align modes you can take advantage of. To align the text to the centre horizontally, you can use HORIZONTAL_ALIGN_CENTER
, to align to the top, you can use VERTICAL_ALIGN_TOP
, etc. Make sure to set the max width and max height to the image's width and height. You can get it using image.bitmap.width
and image.bitmap.height
工作代码
const { MessageAttachment } = require('discord.js');
const Jimp = require('jimp');
module.exports = {
name: 'cat',
aliases: [],
run: async (client, message, args) => {
let matches = message.content.match(/"(.*?)"/g);
let [topText, bottomText] = matches
? matches.map((m) => m.replace(/"/g, '').toUpperCase())
: args;
if (!topText)
return message.channel.send(`Don't forget to add the text you want to print`);
try {
let image = await Jimp.read('cat.jpg');
let font = await Jimp.loadFont(Jimp.FONT_SANS_64_WHITE);
let padding = 40;
let pos = {
x: 0,
yTop: padding,
yBottom: padding * -1,
maxWidth: image.bitmap.width,
maxHeight: image.bitmap.height,
};
image.print(
font,
pos.x,
pos.yTop,
{
text: topText,
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
alignmentY: Jimp.VERTICAL_ALIGN_TOP,
},
pos.maxWidth,
pos.maxHeight,
);
if (bottomText)
image.print(
font,
pos.x,
pos.yBottom,
{
text: bottomText,
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
alignmentY: Jimp.VERTICAL_ALIGN_BOTTOM,
},
pos.maxWidth,
pos.maxHeight,
);
let buffer = await image.getBufferAsync(Jimp.MIME_JPEG);
message.channel.send(new MessageAttachment(buffer));
} catch (err) {
console.log(err);
message.channel.send('Oops, there was an error. Maybe try again later?!');
}
},
};
结果
猫的图片在 Unsplash 上可用。
我一直在努力让我的 args 起作用,它们确实起作用了,但我不确定如何为它制作分隔符,所以我不必两次使用该命令。这是我的代码。
const discord = require('discord.js');
const Jimp = require('jimp');
const fs = require('fs')
module.exports = {
name: "cat",
aliases: [],
run: async(client, message, args) => {
//const top = args[0]
//const bottom = args[1]
let [top, bottom] = args
Jimp.read("assets/cat.jpg").then(function(image) {
Jimp.loadFont(Jimp.FONT_SANS_32_WHITE).then(function(font) {
image.print(font, 60, 22, top, 5);
image.print(font, 60, 350, bottom);
image.write('output-image.jpg');
});
});
await message.channel.send({
files: [
"output-image.jpg"
]
});
fs.unlinkSync('output-image.jpg');
}
};
这是我得到的输出。
output image here
问题是您想在 promise 的 .then()
方法之外发送文件。当您调用 await message.channel.send()
时,文件正被 jimp
读取,而 output-image.jpg
还远没有准备好。
使用异步等待
由于您的 run()
方法已经是一个异步函数,您可以使用 async-await 使您的代码更具可读性。这样您就可以摆脱回调并更容易地了解正在发生的事情以及顺序。
缓冲区而不是文件
正如 Skulaurun Mrusal 在他们的 .getBuffer()
方法中提到的那样,您可以使用它来生成图像的二进制缓冲区。
您可以将此缓冲区作为附件发送。 Discord.js 有一个 MessageAttachment
接受缓冲区作为第一个参数的对象。您可以将此附件传递给 message.channel.send(new MessageAttachment(buffer))
.
接受长度超过一个单词的文本
目前,由于您的 args
是一组 space 分隔的字符串,您只能添加一个单词作为顶部文本,另一个单词作为底部文本。接受双引号内的两个较长文本可能更容易 ("
).
所以命令应该这样使用:
!cat "This is the text on the top" "And we are down here"
您可以使用“简单”的正则表达式来匹配双引号内的字符串。在下一个示例中,您可以看到 matches
是双引号内的两个子字符串的数组。它们也包含引号,因此您需要使用 String#replace()
方法去除它。
let content = '!cat "This is the text on the top" "And we are down here"'
let matches = content.match(/"(.*?)"/g)
console.log({ matches })
文本对齐方式
目前您正在使用“幻数”(60、22、350、5 等)来定位文本。它不会工作,并且(取决于通过命令提交的文本)它会遍布整个图像,并且很可能永远不会居中。
Jimp 有不同 align modes you can take advantage of. To align the text to the centre horizontally, you can use HORIZONTAL_ALIGN_CENTER
, to align to the top, you can use VERTICAL_ALIGN_TOP
, etc. Make sure to set the max width and max height to the image's width and height. You can get it using image.bitmap.width
and image.bitmap.height
工作代码
const { MessageAttachment } = require('discord.js');
const Jimp = require('jimp');
module.exports = {
name: 'cat',
aliases: [],
run: async (client, message, args) => {
let matches = message.content.match(/"(.*?)"/g);
let [topText, bottomText] = matches
? matches.map((m) => m.replace(/"/g, '').toUpperCase())
: args;
if (!topText)
return message.channel.send(`Don't forget to add the text you want to print`);
try {
let image = await Jimp.read('cat.jpg');
let font = await Jimp.loadFont(Jimp.FONT_SANS_64_WHITE);
let padding = 40;
let pos = {
x: 0,
yTop: padding,
yBottom: padding * -1,
maxWidth: image.bitmap.width,
maxHeight: image.bitmap.height,
};
image.print(
font,
pos.x,
pos.yTop,
{
text: topText,
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
alignmentY: Jimp.VERTICAL_ALIGN_TOP,
},
pos.maxWidth,
pos.maxHeight,
);
if (bottomText)
image.print(
font,
pos.x,
pos.yBottom,
{
text: bottomText,
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
alignmentY: Jimp.VERTICAL_ALIGN_BOTTOM,
},
pos.maxWidth,
pos.maxHeight,
);
let buffer = await image.getBufferAsync(Jimp.MIME_JPEG);
message.channel.send(new MessageAttachment(buffer));
} catch (err) {
console.log(err);
message.channel.send('Oops, there was an error. Maybe try again later?!');
}
},
};
结果
猫的图片在 Unsplash 上可用。