微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

discord.js 参数分隔符问题

如何解决discord.js 参数分隔符问题

我一直试图让我的 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,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 在他们的 comment 中提到的,您甚至不需要保存文件,您只需发送一个缓冲区即可。 Jimp 有一个 .getBuffer() 方法可用于生成图像的二进制缓冲区。

您可以将此缓冲区作为附件发送。 Discord.js 有一个 MessageAttachment 对象,它接受一个缓冲区作为第一个参数。您可以通过将此附件传递给 message.channel.send(new MessageAttachment(buffer)) 来发送它。

接受长度超过一个单词的文本

目前,由于您的 args 是一个空格分隔的字符串数组,您只能添加一个单词作为顶部的文本,另一个作为底部的文本。接受双引号 (") 内的两个较长文本可能更容易。

所以命令应该这样使用:

!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 您可以利用。要使文本水平居中对齐,可以使用 HORIZONTAL_ALIGN_CENTER,要对齐到顶部,可以使用 VERTICAL_ALIGN_TOP 等。确保将最大宽度和最大高度设置为图像的宽度和高度。您可以使用 image.bitmap.widthimage.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.yBottom,{
            text: bottomText,alignmentY: Jimp.VERTICAL_ALIGN_BOTTOM,);

      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?!');
    }
  },};

结果

enter image description here

enter image description here

猫的图片可在 Unsplash 上找到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。