From a87d0245778a01f743d703943fc348993ddc1283 Mon Sep 17 00:00:00 2001 From: Benedikt Weber <44091658+bewee@users.noreply.github.com> Date: Fri, 26 Feb 2021 20:35:32 +0100 Subject: [PATCH] Add macro class (#58) --- classes/macro/client.js | 54 +++++++++++++++++++++++++++++++ classes/macro/schema_exec.json | 13 ++++++++ classes/macro/schema_trigger.json | 15 +++++++++ classes/macro/server.js | 26 +++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 classes/macro/client.js create mode 100644 classes/macro/schema_exec.json create mode 100644 classes/macro/schema_trigger.json create mode 100644 classes/macro/server.js diff --git a/classes/macro/client.js b/classes/macro/client.js new file mode 100644 index 0000000..0e4fafc --- /dev/null +++ b/classes/macro/client.js @@ -0,0 +1,54 @@ +(() => { + class MacroClass { + + constructor(handler) { + this.macros = {}; + const load_card = handler.addLoadCard(null, (copy) => { + if (copy.getInternalAttribute('macro_id') in this.macros) { + this.setupExecuteMacro(copy); + } else { + copy.setAttribute('macro-waiting', copy.getInternalAttribute('macro_id')); + } + }); + load_card.setTooltipText(`Execute Macro _/_`); + load_card.addInternalAttribute('macro_id', null); + load_card.setShutdownText('Execute Macro (id=%a)', 'macro_id'); + load_card.addInput('moment', {type: 'string', enum: ['started', 'finished']}); + load_card.addAbilities('trigger', 'macro'); + + { + const block = handler.addBlock('execute', ['Macros']); + block.addParameter('macro', {accepts: 'macro', text: 'Macro'}); + block.setTooltipText('Execute Macro'); + block.setText('Execute %p', 'macro'); + } + + window.API.postJson('/extensions/macrozilla/api/list-macropaths').then((res) => { + res.list.forEach((p) => { + window.API.postJson('/extensions/macrozilla/api/list-macros', {path_id: p.id}).then((res) => { + res.list.forEach((m) => { + this.macros[m.id] = `${p.name}/${m.name}`; + const card = handler.addCard(null, ['Macros'], load_card); + card.updateInternalAttribute('macro_id', m.id); + this.setupMacro(card); + document.querySelectorAll(`macro-card[macro-waiting='${m.id}']`).forEach((c) => { + c.removeAttribute('macro-waiting'); + this.setupMacro(c); + }); + }); + }); + }); + }); + } + + setupMacro(card) { + card.updateAbility('trigger', `${this.macros[card.getInternalAttribute('macro_id')]} %i executing`, 'moment'); + card.setTooltipText(`Macro ${this.macros[card.getInternalAttribute('macro_id')]}`); + card.setText(`${this.macros[card.getInternalAttribute('macro_id')]}`); + card.revive(); + } + + } + + window.exports = MacroClass; +})(); diff --git a/classes/macro/schema_exec.json b/classes/macro/schema_exec.json new file mode 100644 index 0000000..0cf9c0b --- /dev/null +++ b/classes/macro/schema_exec.json @@ -0,0 +1,13 @@ +{ + "title": "exec", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "allOf": [{"$ref": "/class"}], + "properties": { + "macro": {"$ref": "/class"}, + "qualifier": { + "enum": ["execute"] + } + }, + "required": ["qualifier", "macro"] +} \ No newline at end of file diff --git a/classes/macro/schema_trigger.json b/classes/macro/schema_trigger.json new file mode 100644 index 0000000..cf8341c --- /dev/null +++ b/classes/macro/schema_trigger.json @@ -0,0 +1,15 @@ +{ + "title": "trigger", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "allOf": [{"$ref": "/class"}], + "properties": { + "macro_id": { + "type": "integer" + }, + "moment": { + "enum": ["started", "finished"] + } + }, + "required": ["macro_id", "moment"] +} \ No newline at end of file diff --git a/classes/macro/server.js b/classes/macro/server.js new file mode 100644 index 0000000..eb3e302 --- /dev/null +++ b/classes/macro/server.js @@ -0,0 +1,26 @@ +'use strict'; + +module.exports = { + + exec: async function() { + await this.handler.macrozilla.macrohandler.execMacro(this.params.description.macro.macro_id, `macro ${this.inf.macro_id}`); + }, + + trigger: function() { + const fn = (macro_id, _value) => { + if (macro_id == this.params.description.macro_id) + this.params.callback(); + }; + if (this.params.description.moment === 'started') + this.handler.macrozilla.eventhandler.on(`macroExecutionStarted`, fn); + else + this.handler.macrozilla.eventhandler.on(`macroExecutionFinished`, fn); + this.params.destruct = () => { + if (this.params.description.moment === 'started') + this.handler.macrozilla.eventhandler.removeListener(`macroExecutionStarted`, fn); + else + this.handler.macrozilla.eventhandler.removeListener(`macroExecutionFinished`, fn); + }; + }, + +};