on("ready", function () {
let lastTime = Date.now();
let lastSecond = Math.floor(lastTime / 1000) * 1000;
let rotPerSec = 360 / 60;
const updateSpeed = 250;
let bar2Splitor = /^(\w|)(\w|)(\w|)(\w|)([.]|)(\w+|)/i;
let bar2numSplitor = [/[-][-](\d+)/i];
let bar2num2Splitor = /[.](\d+)/i;
let bar1max2Splitor = [/[:]([\s\S]+)/i];
const statusLookup = [
"red",
"red,blue",
"red,blue,green",
"red,blue,green,brown",
"red,blue,green,brown,purple",
"red,blue,green,brown,purple,yellow",
"red,blue,green,brown,purple",
"red,blue,green,brown",
"red,blue,green",
"red,blue"
];
const aura1_colorLookup = [
"#ff0000", "#ffff00", "#00ff00", "#0000ff", "#ff00ff"
];
const aura1_radiusLookup = [
"0.7", "0.8", "0.9", "1", "1.1"
];
const doUpdates = () => {
let time = Date.now();
let deltaS = time - lastSecond;
lastTime = time;
findObjs({
type: 'graphic',
bar1_value: 'game.clock'
}, {
caseInsensitive: true
})
.forEach((obj) => {
let key = bar2Splitor.exec(obj.get('bar2_value'));
if (key.indexOf("o") === -1) {
let c = {
bar3_value: obj.get('bar3_value') || "0",
bar2_value: obj.get('bar2_value') || "",
name: obj.get('name') || '00:00:00',
showname: true
};
let sec = parseInt(c.bar3_value);
if (key.indexOf("r") === -1) {
c.rotation =
(((((parseInt(obj.get('bar3_value')) || 0) % 60) * rotPerSec) + (rotPerSec * (deltaS / 1000)) % 360 + 360) % 360) + parseInt(key[6] || 0)
}
else {
c.rotation = parseInt(key[6] || 0);
}
if (key.indexOf("s") === -1) {
let phase = (sec % (statusLookup.length));
c.statusmarkers = statusLookup[phase];
} else {
c.statusmarkers = ""
}
if (key.indexOf("a") === -1) {
let phase = (sec % (aura1_colorLookup.length));
c.aura1_color = aura1_colorLookup[phase];
c.aura1_radius = aura1_radiusLookup[phase];
} else {
c.aura1_radius = ""
}
if (deltaS > 1000) {
++sec;
let h = Math.floor(sec / 3600);
let m = Math.floor((sec - (h * 60)) / 60);
let s = Math.floor(sec % 60);
c.bar3_value = `${sec}`;
c.name = obj.get('bar1_max') + `${`00${h}`.slice(-2)}:${`00${m}`.slice(-2)}:${`00${s}`.slice(-2)}`;
}
obj.set(c);
};
});
if (deltaS > 1000) {
lastSecond += 1000;
}
};
setInterval(
doUpdates,
updateSpeed
);
on('chat:message', (msg) => {
if ('api' === msg.type && /^!game.clock\b/i.test(msg.content)) {
let cmd = msg.content.toLowerCase().split(/\s+/);
let create = cmd.includes('--create') || cmd.includes('-c');
let toggle = cmd.includes('--toggle') || cmd.includes('-t');
let reset = cmd.includes('--reset') || cmd.includes('-re');
let rotation = cmd.includes('--rotation') || cmd.includes('-ro');
let marker = cmd.includes('--marker') || cmd.includes('-m');
let aura = cmd.includes('--aura') || cmd.includes('-a');
let angle = bar2numSplitor.some(check => check.test(cmd));
let name = bar1max2Splitor.some(check => check.test(cmd));
(msg.selected || [])
.map((o) => getObj('graphic', o._id))
.filter(o => undefined !== o)
.filter((o) => create || 'game.clock' === o.get('bar1_value'))
.forEach((o) => {
let c = {};
c.bar2_value = o.get('bar2_value');
if (create) {
c.bar1_value = 'game.clock';
c.showname = true;
//c.bar2_value = 1;
//c.rotation = 0;
//c.statusmarkers = '';
//c.name = '00:00:00';
}
if (reset) {
c.bar3_value = 0;
c.bar2_value = "";
c.rotation = 0;
c.statusmarkers = '';
c.name = '00:00:00';
}
if (toggle) {
c.bar2_value = (c.bar2_value.indexOf("o") === -1 ? 'o' + c.bar2_value : c.bar2_value.replace("o", ""));
}
if (rotation) {
c.bar2_value = (c.bar2_value.indexOf("r") === -1 ? 'r' + c.bar2_value : c.bar2_value.replace("r", ""));
}
if (marker) {
c.bar2_value = (c.bar2_value.indexOf("s") === -1 ? 's' + c.bar2_value : c.bar2_value.replace("s", ""));
}
if (aura) {
c.bar2_value = (c.bar2_value.indexOf("a") === -1 ? 'a' + c.bar2_value : c.bar2_value.replace("a", ""));
}
if (angle) {
c.bar2_value = (c.bar2_value.match(/[.](\d+)/i) ? (c.bar2_value.replace(bar2num2Splitor, "." + msg.content.match(/[-][-](\d+)/i)[1])) : c.bar2_value + "." + msg.content.match(/[-][-](\d+)/i)[1]);
}
if (name) {
c.bar1_max = (msg.content.match(/[:]([\s\S]+)/i)[1]);
}
o.set(c);
});
}
});
}); Some idea. Create Game Clock !game.clock --create -c Stop the clock --toggle -t Reset the Clock --reset -re Turn on/off rotation --rotation -ro Turn on/off status markers --marker -m Turn on/off aura --aura -a Adjust angle --(number) like --90 Add word before clock :(word) like :StartFrom2019