soiz1's picture
Upload 811 files
30c32c8 verified
raw
history blame
8.09 kB
const BlockType = require('../../extension-support/block-type');
const ArgumentType = require('../../extension-support/argument-type');
const Cast = require('../../util/cast');
const Timer = require('./Timer');
/**
* Class for Timers blocks
* @constructor
*/
class JgTimersBlocks {
constructor(runtime) {
/**
* The runtime instantiating this block package.
* @type {Runtime}
*/
this.runtime = runtime;
this.timers = {};
// pause/unpause timers when the project pauses
runtime.on("RUNTIME_PAUSED", () => {
this._getTimersArray().forEach(timer => timer.instance.pause(true));
});
runtime.on("RUNTIME_UNPAUSED", () => {
this._getTimersArray().forEach(timer => timer.instance.start(true));
});
}
// util
_getTimersArray() {
return Object.values(this.timers);
}
/**
* @returns {object} metadata for this extension and its blocks.
*/
getInfo() {
return {
id: 'jgTimers',
name: 'Multiple Timers',
color1: '#0093FE',
color2: '#1177FC',
blocks: [
{
opcode: 'createTimer',
text: 'create timer named [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'deleteTimer',
text: 'delete timer named [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'deleteAllTimer',
text: 'delete all timers',
blockType: BlockType.COMMAND
},
{ text: "Values", blockType: BlockType.LABEL, },
{
opcode: 'getTimer',
text: 'get timer named [NAME]',
blockType: BlockType.REPORTER,
disableMonitor: false,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'getTimerData',
text: 'get [DATA] of timer named [NAME]',
blockType: BlockType.REPORTER,
disableMonitor: false,
arguments: {
DATA: { type: ArgumentType.STRING, menu: "timerData" },
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'existsTimer',
text: 'timer named [NAME] exists?',
blockType: BlockType.BOOLEAN,
disableMonitor: false,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'getAllTimer',
text: 'get all timers',
blockType: BlockType.REPORTER,
disableMonitor: false
},
{ text: "Operations", blockType: BlockType.LABEL, },
{
opcode: 'startTimer',
text: 'start timer [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'pauseTimer',
text: 'pause timer [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'stopTimer',
text: 'stop timer [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'resetTimer',
text: 'reset timer [NAME]',
blockType: BlockType.COMMAND,
arguments: {
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
{
opcode: 'addTimer',
text: 'add [SECONDS] seconds to timer [NAME]',
blockType: BlockType.COMMAND,
arguments: {
SECONDS: { type: ArgumentType.NUMBER, defaultValue: 5 },
NAME: { type: ArgumentType.STRING, defaultValue: "timer" }
}
},
],
menus: {
timerData: {
acceptReporters: true,
items: [
"milliseconds",
"minutes",
"hours",
// haha funny options
"days",
"weeks",
"years"
].map(item => ({ text: item, value: item }))
}
}
};
}
// blocks
createTimer(args) {
const timer = this.timers[args.NAME];
if (timer) return;
this.timers[args.NAME] = {
name: Cast.toString(args.NAME),
instance: new Timer()
};
}
deleteTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
delete this.timers[args.NAME];
}
deleteAllTimer() {
this.timers = {};
}
getTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return "";
const time = timer.instance.getTime(true);
return Cast.toNumber(time);
}
getTimerData(args) {
const timer = this.timers[args.NAME];
if (!timer) return "";
const seconds = Cast.toNumber(timer.instance.getTime(true));
switch (args.DATA) {
case "milliseconds":
return seconds * 1000;
case "minutes":
return Math.floor(seconds / 60);
case "hours":
return Math.floor(seconds / 3600);
case "days":
return Math.floor(seconds / 86400);
case "weeks":
return Math.floor(seconds / 604800);
case "years":
return Math.floor(seconds / 31536000);
default:
return seconds;
}
}
existsTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return false;
return true;
}
getAllTimer() {
return JSON.stringify(this._getTimersArray().map(timer => timer.name));
}
startTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
timer.instance.start();
}
pauseTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
timer.instance.pause();
}
stopTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
timer.instance.stop();
}
resetTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
timer.instance.reset();
}
addTimer(args) {
const timer = this.timers[args.NAME];
if (!timer) return;
const seconds = Cast.toNumber(args.SECONDS);
timer.instance.add(seconds * 1000);
}
}
module.exports = JgTimersBlocks;