111 lines
3.3 KiB
JavaScript
111 lines
3.3 KiB
JavaScript
module.exports = {
|
|
name: "sgrelo",
|
|
descriptiom: "Calculate reload time for shotgun",
|
|
run: async (client, message, args) => {
|
|
let err = "",
|
|
wrn = "",
|
|
interpretedAs = [];
|
|
function mather(inp) {
|
|
const inpArr = interpreter(inp),
|
|
outArr = [];
|
|
inpArr.map((x, i, a) => {
|
|
for (let j = i + 1; j < a.length; j++) {
|
|
outArr.push(worker(x, a[j]));
|
|
}
|
|
});
|
|
const aArr = outArr.map(x => x.a),
|
|
iArr = outArr.map(x => x.i);
|
|
return (
|
|
"Input: `" +
|
|
interpretedAs.join("`, `") +
|
|
"`" +
|
|
(aArr.length == 1
|
|
? "\nOpening and Closing Animation Time: " +
|
|
beautifier(aArr[0]) +
|
|
"\nReload Time: " +
|
|
beautifier(iArr[0])
|
|
: "\nAll Opening and Closing Animation Time: " +
|
|
aArr.map(x => beautifier(x)).join(", ") +
|
|
"\nAll Reload Time: " +
|
|
iArr.map(x => beautifier(x)).join(", ") +
|
|
"\nAverage Opening and Closing Animation Time: " +
|
|
beautifier(aArr.reduce((t, x) => t + x, 0) / aArr.length) +
|
|
"\nAverage Reload Time: " +
|
|
beautifier(iArr.reduce((t, x) => t + x, 0) / iArr.length))
|
|
);
|
|
}
|
|
|
|
function interpreter(inp) {
|
|
let out = [
|
|
...new Set(
|
|
inp
|
|
.split(/\n|, |,/g)
|
|
.filter(x => x)
|
|
.map(x => x.toLowerCase().replace(/[^0-9a-z]/g, ""))
|
|
),
|
|
];
|
|
out = out
|
|
.map(x => {
|
|
interpretedAs.push(x);
|
|
const obj = {
|
|
b: 0,
|
|
f: 0,
|
|
};
|
|
if (
|
|
x.split(/b/g).length > 2 ||
|
|
x.split(/f/g).length > 2 ||
|
|
x.split(/[a-z]/g).length > 3
|
|
) {
|
|
err += "Unknown identifier `" + x + "`\n";
|
|
} else if (x.indexOf("b") === -1 || x.indexOf("f") === -1) {
|
|
err += "Missing identifier `" + x + "`\n";
|
|
} else if (x.indexOf("b") === x.length - 1) {
|
|
obj.b = parseFloat(x.split("f")[1].trim());
|
|
obj.f = parseFloat(x.split("f")[0].trim());
|
|
} else if (x.indexOf("f") === x.length - 1) {
|
|
obj.b = parseFloat(x.split("b")[0].trim());
|
|
obj.f = parseFloat(x.split("b")[1].trim());
|
|
} else {
|
|
err += "Unknown identifier `" + x + "`\n";
|
|
}
|
|
if (!obj.b && obj.f) {
|
|
err += "Couldn't interpret `" + x + "`\n";
|
|
} else if (!Number.isInteger(obj.b)) {
|
|
err += "Decimal bullet count found `" + x + "`\n";
|
|
} else if (!Number.isInteger(obj.f)) {
|
|
wrn += "Decimal value found `" + x + "`\n";
|
|
}
|
|
return obj;
|
|
})
|
|
.filter(x => JSON.stringify(x).length && x);
|
|
if (out.length === 1) {
|
|
err += "Single equation found\n";
|
|
}
|
|
return err || !out.length ? [] : out;
|
|
}
|
|
|
|
function worker(o1, o2) {
|
|
const out = {
|
|
i: 0,
|
|
a: 0,
|
|
};
|
|
out.i = (o1.f - o2.f) / (o1.b - o2.b);
|
|
out.a = o1.f - out.i * o1.b;
|
|
return out;
|
|
}
|
|
|
|
function beautifier(num) {
|
|
return parseFloat(num.toFixed(2)).toString() + "s";
|
|
}
|
|
|
|
const msg = mather(args.join(" "));
|
|
|
|
if (err !== "") {
|
|
message.reply(err);
|
|
} else if (wrn !== "") {
|
|
message.reply({ content: wrn + "\n" + msg });
|
|
} else {
|
|
message.channel.send({ content: msg });
|
|
}
|
|
},
|
|
};
|