add *draw

This commit is contained in:
ChomeNS 2022-10-15 19:53:48 +07:00
parent 85c12781d9
commit be52cb86b2
4 changed files with 105 additions and 1 deletions

View file

@ -1,3 +1,4 @@
[
"Discord *list fixed (finally)"
"Discord *list fixed (finally)",
"Added *draw"
]

35
commands/draw.js Normal file
View file

@ -0,0 +1,35 @@
const {resize} = require('../util/image');
const axios = require('axios');
const sharp = require('sharp');
module.exports = {
name: 'draw',
description: 'Draws an image',
alias: [],
trusted: 0,
usage: '<image url (JPEG, PNG, WebP, AVIF, GIF, SVG, TIFF)>',
execute: async function(bot, username, usernameraw, sender, prefix, args) {
const url = args.join(' ');
const image = await axios.get('https://http-proxy.nongsonchome.repl.co', {
params: {
uri: url,
},
responseType: 'arraybuffer',
});
const loaded = sharp(image.data);
const metadata = await loaded
.metadata();
const {width, height} = resize(metadata.width, metadata.height);
const {data, info} = await loaded
.resize({fit: 'fill', kernel: 'nearest', width, height})
.raw()
.toBuffer({resolveWithObject: true});
bot.draw(data, info);
},
};

47
plugins/draw.js Normal file
View file

@ -0,0 +1,47 @@
/* eslint-disable max-len */
const convert = require('color-convert');
function inject(bot) {
function draw(data, info, prefix = {}) {
const pixels = [];
// Data Buffer -> RGB Array
for (let i = 0; i < data.length; i += info.channels) {
pixels.push([
data[i + 0],
data[i + 1],
data[i + 2],
]);
}
const rows = [];
// RGB Array -> Rows Array
for (let i = 0; i < pixels.length; i += info.width) {
const row = pixels.slice(i, i + info.width);
rows.push(row);
}
const messages = [];
for (const row of rows) {
const message = [{...prefix, text: ''}];
for (const rgb of row) {
message.push({
text: '⎮',
color: `#${convert.rgb.hex(rgb)}`,
});
}
messages.push(message);
}
for (const message of messages) bot.core.run(`minecraft:tellraw @a ${JSON.stringify(message)}`);
}
bot.draw = draw;
}
module.exports = {inject};

21
util/image.js Normal file
View file

@ -0,0 +1,21 @@
function resize(width, height) {
const aspectRatio = width / height;
let optimalWidth = Math.round(aspectRatio * 20 * (27 / 3));
let optimalHeight = 20;
if (optimalWidth > 320) {
const reduction = optimalWidth / 320;
optimalWidth = 320;
optimalHeight *= reduction;
}
return {
width: Math.floor(optimalWidth),
height: Math.floor(optimalHeight),
};
}
module.exports = {resize};