discord.js argument separator issue(discord.js参数分隔符问题)
问题描述
我一直在尝试让我的参数正常工作,它们确实工作了,但是我不确定如何为它做一个分隔符,所以我不需要使用该命令两次。这是我的代码。
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()
方法已经是一个异步函数,您可以使用异步等待使您的代码更具可读性。这样,您就可以消除回调,并更容易跟踪正在发生的事情以及按什么顺序进行跟踪。
正如Skulaurun MR在他们的comment中提到的,您甚至不需要保存文件,只需发送一个缓冲区即可。JIMP有一个.getBuffer()
方法可用于生成图像的二进制缓冲区。
您可以将此缓冲区作为附件发送。js有一个MessageAttachment
对象,该对象接受缓冲区作为第一个参数。您可以将此附件传递给message.channel.send(new MessageAttachment(buffer))
。
Accept文本长于单个单词
目前,由于您的args
是一个空格分隔的字符串数组,因此您只能添加一个单词作为顶部的文本,另一个单词作为底部的文本。可能更容易接受双引号内的两个较长文本("
)。
所以应该这样使用该命令:
!cat "This is the text on the top" "And we are down here"
您可以使用与双引号内的字符串相匹配的";simple";regex。在下一个示例中,您可以看到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可以利用。要水平对齐文本,可以使用HORIZONTAL_ALIGN_CENTER
,要与顶部对齐,可以使用VERTICAL_ALIGN_TOP
,依此类推。请确保将最大宽度和最大高度设置为图像的宽度和高度。您可以使用image.bitmap.width
和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。
这篇关于discord.js参数分隔符问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:discord.js参数分隔符问题
基础教程推荐
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 动态更新多个选择框 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01