javascript - 如何在画布构造函数中将文本放在特定宽度和长度之间
问题描述
有没有办法把那些vvvv
放在白盒子里,直到黑线所在的地方
like it starts from the end of the blue color and ends at that black line in the white color and the whole paragraph stays inside it
代码
const { Canvas } = require('canvas-constructor');
const { createCanvas, loadImage } = require('canvas');
const { MessageAttachment } = require('discord.js');
const { get } = require('node-superfetch');
const db = require('quick.db');
const fsn = require('fs-nextra');
const { crFormat } = require('../../functions')
Canvas.registerFont(`${process.cwd()}/assets/font/NotoEmoji-Regular.ttf`, "NotoEmoji")
Canvas.registerFont(`${process.cwd()}/assets/font/Roboto-Regular.ttf`, "RobotoRegular")
module.exports = {
config: {
name: "profile2",
aliases: ['prof'],
category: 'economy',
description: 'Shows User Profile',
usage: '[mention | username | nickname | ID]',
accessableby: "everyone"
},
run: async (bot, message, args) => {
let user = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.guild.members.cache.find(r => r.user.username.toLowerCase() === args.join(' ').toLocaleLowerCase()) || message.guild.members.cache.find(r => r.displayName.toLowerCase() === args.join(' ').toLocaleLowerCase()) || message.member;
if (user.user.bot) return message.channel.send(`**Bots Don't Have A Profile!**`);
let works = await db.fetch(`works_${user.id}`)
if (works === null) works = 0;
let bg = await db.fetch(`bg_${user.id}`)
if (bg === null) bg = 'https://images.wallpaperscraft.com/image/cat_profile_muzzle_eyes_113734_3840x2400.jpg'
let money = await db.fetch(`money_${message.guild.id}_${user.id}`)
if (money === null) money = 0;
let bank = await db.fetch(`bank_${message.guild.id}_${user.id}`)
if (bank === null) bank = 0;
let level = await db.fetch(`level_${message.guild.id}_${user.id}`)
if (level === null) level = 0;
let info = await db.fetch(`info_${user.id}`)
if (info === null) info = 'No Info'
let xp = await db.fetch(`messages_${message.guild.id}_${user.id}`)
if (xp == null) xp = 1
let vip = await db.fetch(`bronze_${message.guild.id}_${user.id}`)
if (vip === null) vip = '0'
if (vip === true) vip = '1'
let shoes = await db.fetch(`nikes_${message.guild.id}_${user.id}`)
if (shoes === null) shoes = '0'
let newcar = await db.fetch(`car_${message.guild.id}_${user.id}`)
if (newcar === null) newcar = '0'
let newhouse = await db.fetch(`house_${message.guild.id}_${user.id}`)
if (newhouse === null) newhouse = '0'
let uLevel = level + 1;
let nxtLvlXp = uLevel * 100;
let difference = xp / nxtLvlXp * 297;
let balance = money;
let Info = info
let background = bg;
let work = works;
try {
async function createCanvas() {
var username = user.user.username;
var name = username.length > 10 ? username.substring(0, 12) + "..." : username;
var { body: avatar } = await get(user.user.displayAvatarURL({ format: 'jpg', size: 1024 }));
var { body: background1 } = await get(background)
var background2 = await fsn.readFile('assets/images/profile.png');
return new Canvas(600, 600)
.setColor('#000000')
.addImage(background1, 0, 0, 600, 500)
.addBeveledImage(background2, 0, 0, 600, 400)
.setTextFont('30px Impact')
.addText(`${name}'s Profile Card`, 190, 105)
.setTextFont('30px Impact')
.addText('|', 280, 380)
.addText('|', 280, 400)
.addText('|', 280, 420)
.addText('|', 280, 450)
.addText('|', 280, 470)
.addText('|', 280, 495)
.addText('__ ___', 495, 420)
.addText('_______', 495, 460)
.addText('__ ___', 495, 520)
.addText('_______', 495, 560)
.addText('_______________________', 150, 500)
.setTextFont('bold 28px Courier New')
.addText(` About ${user.user.username}`, 180, 182)
.setTextFont('30px Impact')
.addText('Level', 190, 140)
.addText('Ranks', 310, 140)
.addText('Works', 445, 140)
.setTextFont('30px Impact')
.addText('Total XP', 180, 530)
.addText('Balance', 180, 560)
.addText(`${crFormat(xp)}`, 370, 530)
.addText(`$${crFormat(balance)}`, 370, 560)
.setTextAlign('center')
.setTextFont('bold 20px Courier New')
.setTextFont('30px Impact')
.addText(`${uLevel}`, 280, 140)
.addText(`${vip}`, 410, 140)
.addText(`${crFormat(work)}`, 555, 140)
.addText('-', 260, 140)
.addText('-', 393, 140)
.addText('-', 535, 140)
.setColor("#459466")
.addRect(150, 570, difference, 34)
.setTextFont("16px RobotoRegular")
.setColor("#000000")
.setTextAlign('right')
.addText(`${Info}`, 210, 200)
.setTextAlign("center")
.addText(`XP: ${xp} / ${nxtLvlXp}`, 330, 590)
.addCircularImage(avatar, 90, 93, 89, 104)
.toBufferAsync();
}
const msg = `**User profile card for ${user.user.tag}**`;
const attachment = new MessageAttachment(await createCanvas(), 'profile.png')
message.channel.send(`${msg}`, attachment)
} catch (e) {
console.log(e)
return message.channel.send(`Oh no an error occurred :( \`${e.message}\` try again later.`);
}
}
}
解决方案
getWrapText: function (text, length) {
const temp = [];
for (let i = 0; i < text.length; i += length) {
temp.push(text.slice(i, i + length));
}
return temp.map(x => x.trim());
},
推荐阅读
- c - C中的字符串输入:char *s; s = malloc(...) 有效吗?
- python - Raspbian OS:Amixer PulseAudio:无法连接:连接被拒绝
- c# - 使用 OpenXML 在 Word 文档中创建动态列
- python - openpyxl 写入单列追加()?
- php - Symfony UseLocaleSubscriber 和 InMemoryUser
- r - 通过在同一数据框中搜索并在 R 中应用条件语句来插入具有值的列
- java - Gatling 在响应中的 queryParam 值中设置
- c# - c#在推送之前检查堆栈中的最后一项是否等于X?
- python - tensorflow对象检测...python model_main_tf2.py --model_di ....命令导致错误utf-8
- java - 可扩展性的不同场景