2021-08-19 14:19:14 +00:00
|
|
|
import { createRequire } from "module";
|
|
|
|
import { isMainThread, parentPort, workerData } from "worker_threads";
|
|
|
|
import fetch from "node-fetch";
|
2022-04-17 15:40:56 +00:00
|
|
|
import path from "path";
|
|
|
|
import { fileURLToPath } from "url";
|
2021-01-10 01:50:29 +00:00
|
|
|
|
2021-08-19 14:19:14 +00:00
|
|
|
const nodeRequire = createRequire(import.meta.url);
|
|
|
|
|
2022-04-17 15:40:56 +00:00
|
|
|
const relPath = `../build/${process.env.DEBUG && process.env.DEBUG === "true" ? "Debug" : "Release"}/image.node`;
|
|
|
|
const magick = nodeRequire(relPath);
|
2021-08-19 14:19:14 +00:00
|
|
|
|
2022-03-08 23:24:48 +00:00
|
|
|
const enumMap = {
|
2022-03-09 19:30:18 +00:00
|
|
|
"forget": 0,
|
|
|
|
"northwest": 1,
|
|
|
|
"north": 2,
|
|
|
|
"northeast": 3,
|
|
|
|
"west": 4,
|
|
|
|
"center": 5,
|
|
|
|
"east": 6,
|
|
|
|
"southwest": 7,
|
|
|
|
"south": 8,
|
|
|
|
"southeast": 9
|
|
|
|
};
|
2022-03-08 23:24:48 +00:00
|
|
|
|
2022-01-29 21:04:41 +00:00
|
|
|
export default function run(object) {
|
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
|
|
|
return new Promise((resolve, reject) => {
|
2021-01-10 01:50:29 +00:00
|
|
|
// If the image has a path, it must also have a type
|
2022-01-16 21:04:30 +00:00
|
|
|
let promise = Promise.resolve();
|
2021-01-10 01:50:29 +00:00
|
|
|
if (object.path) {
|
2021-12-10 04:31:52 +00:00
|
|
|
if (object.params.type !== "image/gif" && object.onlyGIF) resolve({
|
2021-01-10 01:50:29 +00:00
|
|
|
buffer: Buffer.alloc(0),
|
|
|
|
fileExtension: "nogif"
|
|
|
|
});
|
2022-01-16 21:04:30 +00:00
|
|
|
promise = fetch(object.path).then(res => res.arrayBuffer()).then(buf => Buffer.from(buf));
|
2021-01-10 01:50:29 +00:00
|
|
|
}
|
|
|
|
// Convert from a MIME type (e.g. "image/png") to something ImageMagick understands (e.g. "png").
|
|
|
|
// Don't set `type` directly on the object we are passed as it will be read afterwards.
|
|
|
|
// If no image type is given (say, the command generates its own image), make it a PNG.
|
2021-12-10 04:31:52 +00:00
|
|
|
const fileExtension = object.params.type ? object.params.type.split("/")[1] : "png";
|
2021-05-11 19:25:02 +00:00
|
|
|
promise.then(buf => {
|
2021-12-10 04:31:52 +00:00
|
|
|
object.params.data = buf;
|
2022-03-09 19:30:18 +00:00
|
|
|
const objectWithFixedType = Object.assign({}, object.params, { type: fileExtension });
|
2022-03-08 23:24:48 +00:00
|
|
|
if (objectWithFixedType.gravity) {
|
2022-03-09 19:30:18 +00:00
|
|
|
if (isNaN(objectWithFixedType.gravity)) {
|
|
|
|
objectWithFixedType.gravity = enumMap[objectWithFixedType.gravity];
|
2022-03-08 23:24:48 +00:00
|
|
|
}
|
|
|
|
}
|
2022-04-17 15:40:56 +00:00
|
|
|
objectWithFixedType.basePath = path.join(path.dirname(fileURLToPath(import.meta.url)), "../");
|
2021-05-11 19:25:02 +00:00
|
|
|
try {
|
|
|
|
const result = magick[object.cmd](objectWithFixedType);
|
|
|
|
const returnObject = {
|
|
|
|
buffer: result.data,
|
|
|
|
fileExtension: result.type
|
|
|
|
};
|
|
|
|
resolve(returnObject);
|
|
|
|
} catch (e) {
|
|
|
|
reject(e);
|
|
|
|
}
|
|
|
|
});
|
2021-01-10 01:50:29 +00:00
|
|
|
});
|
2021-08-19 14:19:14 +00:00
|
|
|
}
|
2021-01-10 01:50:29 +00:00
|
|
|
|
|
|
|
if (!isMainThread) {
|
2021-08-19 14:19:14 +00:00
|
|
|
run(workerData)
|
2021-01-10 01:50:29 +00:00
|
|
|
.then(returnObject => {
|
|
|
|
parentPort.postMessage(returnObject);
|
|
|
|
process.exit();
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
// turn promise rejection into normal error
|
|
|
|
throw err;
|
|
|
|
});
|
|
|
|
}
|