Refactor image job object, fixed image commands that don't require an existing image
This commit is contained in:
parent
30bcb7a969
commit
39ebae8cd7
5 changed files with 28 additions and 12 deletions
|
@ -31,3 +31,18 @@ A client sends *requests* (T-messages) to a server, which subsequently *replies*
|
||||||
- Twait tag[2] jid[4]
|
- Twait tag[2] jid[4]
|
||||||
- Rwait tag[2]
|
- Rwait tag[2]
|
||||||
- Rinit tag[2] max_jobs[2] formats[j]
|
- Rinit tag[2] max_jobs[2] formats[j]
|
||||||
|
|
||||||
|
### Job Object
|
||||||
|
The job object is formatted like this:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cmd": string, // name of internal image command, e.g. caption
|
||||||
|
"path": string, // canonical image URL, used for getting the actual image
|
||||||
|
"url": string, // original image URL, used for message filtering
|
||||||
|
"params": { // content varies depending on the command, some common parameters are listed here
|
||||||
|
"type": string, // mime type of output, should usually be the same as input
|
||||||
|
"delay": integer, // for manually specifying GIF frame delay, set to 0 to use the default delay
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
|
@ -241,7 +241,7 @@ const runJob = (job, ws) => {
|
||||||
|
|
||||||
const object = JSON.parse(job.msg);
|
const object = JSON.parse(job.msg);
|
||||||
// If the image has a path, it must also have a type
|
// If the image has a path, it must also have a type
|
||||||
if (object.path && !object.type) {
|
if (object.path && !object.params.type) {
|
||||||
reject(new TypeError("Unknown image type"));
|
reject(new TypeError("Unknown image type"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ class ImageCommand extends Command {
|
||||||
runningCommands.set(this.message.author.id, this.message.createdAt);
|
runningCommands.set(this.message.author.id, this.message.createdAt);
|
||||||
|
|
||||||
const magickParams = {
|
const magickParams = {
|
||||||
cmd: this.constructor.command
|
cmd: this.constructor.command,
|
||||||
|
params: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this.constructor.requiresImage) {
|
if (this.constructor.requiresImage) {
|
||||||
|
@ -64,9 +65,9 @@ class ImageCommand extends Command {
|
||||||
return "I've been rate-limited by Tenor. Please try uploading your GIF elsewhere.";
|
return "I've been rate-limited by Tenor. Please try uploading your GIF elsewhere.";
|
||||||
}
|
}
|
||||||
magickParams.path = image.path;
|
magickParams.path = image.path;
|
||||||
magickParams.type = image.type;
|
magickParams.params.type = image.type;
|
||||||
magickParams.url = image.url; // technically not required but can be useful for text filtering
|
magickParams.url = image.url; // technically not required but can be useful for text filtering
|
||||||
magickParams.delay = image.delay ? image.delay : 0;
|
magickParams.params.delay = image.delay ? image.delay : 0;
|
||||||
if (this.constructor.requiresGIF) magickParams.onlyGIF = true;
|
if (this.constructor.requiresGIF) magickParams.onlyGIF = true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
runningCommands.delete(this.message.author.id);
|
runningCommands.delete(this.message.author.id);
|
||||||
|
@ -84,15 +85,15 @@ class ImageCommand extends Command {
|
||||||
|
|
||||||
switch (typeof this.params) {
|
switch (typeof this.params) {
|
||||||
case "function":
|
case "function":
|
||||||
Object.assign(magickParams, this.params(magickParams.url, magickParams.delay));
|
Object.assign(magickParams.params, this.params(magickParams.url, magickParams.delay));
|
||||||
break;
|
break;
|
||||||
case "object":
|
case "object":
|
||||||
Object.assign(magickParams, this.params);
|
Object.assign(magickParams.params, this.params);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let status;
|
let status;
|
||||||
if (magickParams.type === "image/gif") {
|
if (magickParams.params.type === "image/gif") {
|
||||||
status = await this.processMessage(this.message);
|
status = await this.processMessage(this.message);
|
||||||
} else {
|
} else {
|
||||||
this.client.sendChannelTyping(this.message.channel.id);
|
this.client.sendChannelTyping(this.message.channel.id);
|
||||||
|
|
|
@ -11,7 +11,7 @@ function run(object) {
|
||||||
// If the image has a path, it must also have a type
|
// If the image has a path, it must also have a type
|
||||||
let promise = new Promise((resolveTest) => { resolveTest(); }); // no-op
|
let promise = new Promise((resolveTest) => { resolveTest(); }); // no-op
|
||||||
if (object.path) {
|
if (object.path) {
|
||||||
if (object.type !== "image/gif" && object.onlyGIF) resolve({
|
if (object.params.type !== "image/gif" && object.onlyGIF) resolve({
|
||||||
buffer: Buffer.alloc(0),
|
buffer: Buffer.alloc(0),
|
||||||
fileExtension: "nogif"
|
fileExtension: "nogif"
|
||||||
});
|
});
|
||||||
|
@ -20,10 +20,10 @@ function run(object) {
|
||||||
// Convert from a MIME type (e.g. "image/png") to something ImageMagick understands (e.g. "png").
|
// 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.
|
// 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.
|
// If no image type is given (say, the command generates its own image), make it a PNG.
|
||||||
const fileExtension = object.type ? object.type.split("/")[1] : "png";
|
const fileExtension = object.params.type ? object.params.type.split("/")[1] : "png";
|
||||||
promise.then(buf => {
|
promise.then(buf => {
|
||||||
object.data = buf;
|
object.params.data = buf;
|
||||||
const objectWithFixedType = Object.assign({}, object, {type: fileExtension});
|
const objectWithFixedType = Object.assign({}, object.params, {type: fileExtension});
|
||||||
try {
|
try {
|
||||||
const result = magick[object.cmd](objectWithFixedType);
|
const result = magick[object.cmd](objectWithFixedType);
|
||||||
const returnObject = {
|
const returnObject = {
|
||||||
|
|
|
@ -71,7 +71,7 @@ class ImageWorker extends BaseServiceWorker {
|
||||||
if (connection.conn.readyState !== 0 && connection.conn.readyState !== 1) {
|
if (connection.conn.readyState !== 0 && connection.conn.readyState !== 1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!connection.formats[object.cmd].includes(object.type)) continue;
|
if (object.params.type && !connection.formats[object.cmd].includes(object.params.type)) continue;
|
||||||
idealServers.push({
|
idealServers.push({
|
||||||
addr: address,
|
addr: address,
|
||||||
load: connection.njobs / connection.max
|
load: connection.njobs / connection.max
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue