diff --git a/assets/DOPFoundationLogo.png b/assets/DOPFoundationLogo.png
new file mode 100644
index 0000000..e44e3e7
Binary files /dev/null and b/assets/DOPFoundationLogo.png differ
diff --git a/assets/DPSoftware2.png b/assets/DPSoftware2.png
new file mode 100644
index 0000000..fb808f9
Binary files /dev/null and b/assets/DPSoftware2.png differ
diff --git a/blocks/Advanced_Peripherals/block_design.json b/blocks/Advanced_Peripherals/block_design.json
index 476aa3e..4d6de07 100644
--- a/blocks/Advanced_Peripherals/block_design.json
+++ b/blocks/Advanced_Peripherals/block_design.json
@@ -218,7 +218,7 @@
"tooltip": "Send message formatted to player chat"
},
"advanced_peripherals_chatbox_send_toast_formatted_to_player": {
- "message0": "Chatbox %1 toast send %2 and title %3 to player %4\nPrefix %5 Brackets %6 Bracket color %7 Range %8",
+ "message0": "Chatbox %1 toast send formatted json %2 and title %3 to player %4\nPrefix %5 Brackets %6 Bracket color %7 Range %8",
"args0": [
{
"type": "input_value",
@@ -227,7 +227,7 @@
},
{
"type": "input_value",
- "name": "TEXT",
+ "name": "JSON",
"check": "String"
},
{
@@ -1508,5 +1508,301 @@
"nextStatement": null,
"colour": 200,
"tooltip": "Sets the redstone level output on the given side to the given power level. (0-15)"
+ },
+
+ "advanced_peripherals_mc_beacon_get_level": {
+ "message0": "Get level from beacon %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "BEACON",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the level of the Beacon."
+ },
+ "advanced_peripherals_mc_beacon_get_primary_effect": {
+ "message0": "Get primary effect from beacon %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "BEACON",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "String",
+ "colour": 200,
+ "tooltip": "Returns the registry name of the beacon's primary effect."
+ },
+ "advanced_peripherals_mc_beacon_get_secondary_effect": {
+ "message0": "Get secondary secondary effect from beacon %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "BEACON",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "String",
+ "colour": 200,
+ "tooltip": "Returns the registry name of the beacon's secondary effect."
+ },
+
+ "advanced_peripherals_mc_note_block_play_note": {
+ "message0": "Play current note sound at note block %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "NOTEBLOCK",
+ "check": "Peripheral"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 200,
+ "tooltip": "Plays the Note Block's current note sound."
+ },
+ "advanced_peripherals_mc_note_block_get_note": {
+ "message0": "Get current note from note block %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "NOTEBLOCK",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the index for the Note Block's current note. A number from 0 to 24."
+ },
+ "advanced_peripherals_mc_note_block_change_note_by": {
+ "message0": "Change note to %1 at note block %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "TO",
+ "check": "Number"
+ },
+ {
+ "type": "input_value",
+ "name": "NOTEBLOCK",
+ "check": "Peripheral"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 200,
+ "tooltip": "Changes the Note Block's note to the given note. note must be a number from 0 to 24."
+ },
+ "advanced_peripherals_mc_note_block_change_note": {
+ "message0": "Change note by 1 at note block %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "NOTEBLOCK",
+ "check": "Peripheral"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 200,
+ "tooltip": "Increments the Note Block's note to the next available note."
+ },
+
+ "advanced_peripherals_botania_flowers_get_mana": {
+ "message0": "Get mana from flower %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the amount of mana stored in the flower."
+ },
+ "advanced_peripherals_botania_flowers_get_max_mana": {
+ "message0": "Get max mana from flower %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the maximum amount of mana that the flower can hold."
+ },
+ "advanced_peripherals_botania_flowers_is_floating": {
+ "message0": "Is flower %1 floating",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the flower is a floating flower.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_flowers_is_on_enchanted_soil": {
+ "message0": "Is flower %1 on enchanted soil",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the flower is placed on enchanted soil.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_flowers_is_empty": {
+ "message0": "Is flower %1 empty",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the Flower is empty.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_flowers_is_full": {
+ "message0": "Is flower %1 full",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "FLOWER",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the Flower is full.",
+ "inputsInline": true
+ },
+
+ "advanced_peripherals_botania_mana_pool_get_mana": {
+ "message0": "Get mana from pool %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the amount of mana stored in the pool."
+ },
+ "advanced_peripherals_botania_mana_pool_get_max_mana": {
+ "message0": "Get max mana from pool %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the maximum amount of mana that the pool can hold."
+ },
+ "advanced_peripherals_botania_mana_pool_get_mana_needed": {
+ "message0": "Get amount of mana is pool %1 needed to fill full",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Number",
+ "colour": 200,
+ "tooltip": "Returns the amount of mana needed to fill the pool. Equivalent to getMaxMana() - getMana().",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_mana_pool_is_empty": {
+ "message0": "Is pool %1 empty",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the Mana Pool is empty.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_mana_pool_is_full": {
+ "message0": "Is pool %1 full",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the Mana Pool is full.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_mana_pool_can_charge_item": {
+ "message0": "Can pool %1 change item",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if mode of the Mana Pool is set to charge the items on it.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_mana_pool_has_items": {
+ "message0": "Is pool %1 has item",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Boolean",
+ "colour": 200,
+ "tooltip": "Returns true if the Mana Pool has at least one item on it.",
+ "inputsInline": true
+ },
+ "advanced_peripherals_botania_mana_pool_get_items": {
+ "message0": "get items from pool %1 ",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POOL",
+ "check": "Peripheral"
+ }
+ ],
+ "output": "Array",
+ "colour": 200,
+ "tooltip": "Returns a table with the items lying on the Mana Pool."
}
+
+
}
diff --git a/blocks/Advanced_Peripherals/generator.js b/blocks/Advanced_Peripherals/generator.js
index 275d6f1..f88f56f 100644
--- a/blocks/Advanced_Peripherals/generator.js
+++ b/blocks/Advanced_Peripherals/generator.js
@@ -552,4 +552,139 @@ luaGenerator.forBlock['advanced_peripherals_redstone_integrator_set_analog_outpu
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
return `${integrator}.setOutput("${side}", ${power})\n`;
+};
+
+// Generator for Minecraft: Beacon
+
+luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_level'] = function(block, generator) {
+ var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
+
+ return [`${beacon}.getLevel()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_primary_effect'] = function(block, generator) {
+ var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
+
+ return [`${beacon}.getPrimaryEffect()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_secondary_effect'] = function(block, generator) {
+ var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
+
+ return [`${beacon}.getSecondaryEffect()`, luaGenerator.ORDER_NONE];
+};
+
+// Generator for Minecraft: Note Block
+
+luaGenerator.forBlock['advanced_peripherals_mc_note_block_play_note'] = function(block, generator) {
+ var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
+
+ return `${noteblock}.playNote()\n`;
+};
+
+luaGenerator.forBlock['advanced_peripherals_mc_note_block_get_note'] = function(block, generator) {
+ var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
+
+ return [`${beacon}.getNote()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_mc_note_block_change_note_by'] = function(block, generator) {
+ var to = generator.valueToCode(block, 'TO', generator.ORDER_ATOMIC);
+ var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
+
+ return `${noteblock}.changeNoteBy(${to})\n`;
+};
+
+luaGenerator.forBlock['advanced_peripherals_mc_note_block_change_note'] = function(block, generator) {
+ var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
+
+ return `${noteblock}.changeNote()\n`;
+};
+
+// Generator for Botania: Flowers
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_get_mana'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.getMana()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_get_max_mana'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.getMaxMana()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_floating'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.isFloating()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_on_enchanted_soil'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.isOnEnchantedSoil()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_empty'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.isEmpty()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_full'] = function(block, generator) {
+ var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
+
+ return [`${flower}.isFull()`, luaGenerator.ORDER_NONE];
+};
+
+// Generator for Botania: Mana Pool
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_mana'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.getMana()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_max_mana'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.getMaxMana()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_mana_needed'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.getManaNeeded()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_is_empty'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.isEmpty()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_is_full'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.isFull()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_can_charge_item'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.canChargeItem()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_has_items'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.hasItems()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_items'] = function(block, generator) {
+ var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
+
+ return [`${pool}.getItems()`, luaGenerator.ORDER_NONE];
};
\ No newline at end of file
diff --git a/blocks/Advanced_Peripherals/index.json b/blocks/Advanced_Peripherals/index.json
index b7cc662..23619a0 100644
--- a/blocks/Advanced_Peripherals/index.json
+++ b/blocks/Advanced_Peripherals/index.json
@@ -2,7 +2,7 @@
"name": "Advanced Peripherals",
"author": "DPSoftware Foundation",
"description": "Advanced Peripherals is a mod that adds many useful extensions for CC:Tweaked.",
- "version": "1.0.0",
+ "version": "1.2",
"category": "Mod",
"keyword": "mod",
"license": "GPL-3.0-or-later",
diff --git a/blocks/Advanced_Peripherals/toolbox.xml b/blocks/Advanced_Peripherals/toolbox.xml
index 44a3587..223abfb 100644
--- a/blocks/Advanced_Peripherals/toolbox.xml
+++ b/blocks/Advanced_Peripherals/toolbox.xml
@@ -45,7 +45,7 @@
-
+
Hello, world!
@@ -107,6 +107,30 @@
+
+
+
+ Hi
+
+
+
+
+ Player
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -462,5 +486,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/index.js b/index.js
index dcbdd75..f2aead9 100644
--- a/index.js
+++ b/index.js
@@ -7,10 +7,11 @@ const pino = require('pino')
const pretty = require('pino-pretty');
const https = require('node:https');
const LocalStorage = require('node-localstorage').LocalStorage
+
const ipc = ipcMain
const logger = pino(pretty())
-const localStorage = new LocalStorage('.');
+const localStorage = new LocalStorage('./data');
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
@@ -111,46 +112,51 @@ app.whenReady().then(async () => {
logger.error('Error in update check:', error);
}
- logger.info("Version in github: " + gitver)
logger.info("Current version: " + version)
+ logger.info("Version in github: " + gitver)
+
const normalizedAppVersion = normalizeVersion(version);
- const normalizedReleaseVersion = normalizeVersion(gitver);
- if (normalizedAppVersion >= normalizedReleaseVersion) {
- logger.info("Software is up-to-date.");
+ if (!gitver) {
+ logger.error("Can't check update")
} else {
- logger.info("A new update is available: " + gitver)
- var is_not_skip_update = localStorage.getItem('skip_update_version') != normalizedAppVersion;
- var is_ignore = localStorage.getItem('ignore_update');
- if (is_ignore || is_not_skip_update) {
- const result = dialog.showMessageBoxSync({
- type: 'question',
- buttons: ['Update', 'Ignore', 'Skip'],
- defaultId: 0,
- title: 'Update Available',
- message: `A new version (${gitver}) is available. Do you want to update now?`,
- detail: 'Click "Update" to go to the release page, "Ignore" to ignore this update, or "Skip" to skip this version.'
- });
- switch (result.response) {
- case 0: // 'Update'
- (async () => {
- try {
- const { default: open } = await import('open');
-
- await open('https://github.com/DPSoftware-Foundation/ccIDE/releases/latest');
- console.log('URL opened in default browser');
- } catch (err) {
- console.error('Error opening URL:', err);
- }
- })();
- break;
- case 1: // 'Ignore'
- localStorage.setItem('ignore_update', true);
- break;
- case 2: // 'Skip'
- localStorage.setItem('skip_update_version', normalizedReleaseVersion);
- break;
+ const normalizedReleaseVersion = normalizeVersion(gitver);
+ if (normalizedAppVersion >= normalizedReleaseVersion) {
+ logger.info("Software is up-to-date.");
+ } else {
+ logger.info("A new update is available: " + gitver)
+ var is_not_skip_update = localStorage.getItem('skip_update_version') != normalizedAppVersion;
+ var is_ignore = localStorage.getItem('ignore_update');
+ if (is_ignore || is_not_skip_update) {
+ const result = dialog.showMessageBoxSync({
+ type: 'question',
+ buttons: ['Update', 'Ignore', 'Skip'],
+ defaultId: 0,
+ title: 'Update Available',
+ message: `A new version (${gitver}) is available. Do you want to update now?`,
+ detail: 'Click "Update" to go to the release page, "Ignore" to ignore this update, or "Skip" to skip this version.'
+ });
+ switch (result.response) {
+ case 0: // 'Update'
+ (async () => {
+ try {
+ const { default: open } = await import('open');
+
+ await open('https://github.com/DPSoftware-Foundation/ccIDE/releases/latest');
+ console.log('URL opened in default browser');
+ } catch (err) {
+ console.error('Error opening URL:', err);
+ }
+ })();
+ break;
+ case 1: // 'Ignore'
+ localStorage.setItem('ignore_update', true);
+ break;
+ case 2: // 'Skip'
+ localStorage.setItem('skip_update_version', normalizedReleaseVersion);
+ break;
+ }
}
}
}
@@ -168,7 +174,7 @@ app.whenReady().then(async () => {
enableRemoteModule: true,
contextIsolation: false,
},
- show: false,
+ //show: false,
center: true,
})
diff --git a/package-lock.json b/package-lock.json
index 598ba0d..081d813 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,16 @@
{
"name": "ccide",
- "version": "1.4",
+ "version": "1.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ccide",
- "version": "1.4",
+ "version": "1.5",
"license": "GPL-3.0-or-later",
"dependencies": {
"@blockly/plugin-workspace-search": "^9.0.5",
+ "@blockly/theme-dark": "^7.0.7",
"@electron/remote": "^2.1.2",
"blockly": "^11.1.1",
"bootstrap": "^5.3.3",
@@ -18,6 +19,8 @@
"open": "^10.1.0",
"pino": "^9.3.2",
"pino-pretty": "^11.2.2",
+ "toastify-js": "^1.12.0",
+ "unzipper": "^0.12.3",
"xmldom": "^0.6.0"
},
"devDependencies": {
@@ -35,6 +38,18 @@
"blockly": "^11.0.0"
}
},
+ "node_modules/@blockly/theme-dark": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-7.0.7.tgz",
+ "integrity": "sha512-p6urK/fLyzLhrHcSo1DhEvRkasyJjBYDpBPgPipAqGNJRlLR1pbNoBRcrpv3RzTgKIKbA0TeawsWHrHOXG0S/w==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.17.0"
+ },
+ "peerDependencies": {
+ "blockly": "^11.0.0"
+ }
+ },
"node_modules/@electron/get": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
@@ -209,6 +224,12 @@
"node": ">=18"
}
},
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
"node_modules/boolean": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
@@ -330,6 +351,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
"node_modules/cssstyle": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
@@ -500,6 +527,45 @@
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"optional": true
},
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/duplexer2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/duplexer2/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/duplexer2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/electron": {
"version": "31.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-31.1.0.tgz",
@@ -946,6 +1012,12 @@
"node": ">=0.8.19"
}
},
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
"node_modules/is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
@@ -996,6 +1068,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
"node_modules/joycon": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
@@ -1130,6 +1208,12 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "license": "MIT"
+ },
"node_modules/node-localstorage": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-3.0.5.tgz",
@@ -1290,6 +1374,12 @@
"node": ">= 0.6.0"
}
},
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
"node_modules/process-warning": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz",
@@ -1576,6 +1666,12 @@
"real-require": "^0.2.0"
}
},
+ "node_modules/toastify-js": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz",
+ "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==",
+ "license": "MIT"
+ },
"node_modules/tough-cookie": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
@@ -1634,6 +1730,54 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/unzipper": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
+ "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "~3.7.2",
+ "duplexer2": "~0.1.4",
+ "fs-extra": "^11.2.0",
+ "graceful-fs": "^4.2.2",
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/unzipper/node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/unzipper/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/unzipper/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/url-parse": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
@@ -1643,6 +1787,12 @@
"requires-port": "^1.0.0"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
"node_modules/w3c-xmlserializer": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
@@ -1768,6 +1918,12 @@
"integrity": "sha512-T6LGwXLtsrVi7LjcuRjHLu4uQGniu9GUBwBCka9/WfkpuUIp6LQSU5DzEhJvGrt7UHiadDaEbcIi82lTfwqV9w==",
"requires": {}
},
+ "@blockly/theme-dark": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-7.0.7.tgz",
+ "integrity": "sha512-p6urK/fLyzLhrHcSo1DhEvRkasyJjBYDpBPgPipAqGNJRlLR1pbNoBRcrpv3RzTgKIKbA0TeawsWHrHOXG0S/w==",
+ "requires": {}
+ },
"@electron/get": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
@@ -1896,6 +2052,11 @@
"jsdom": "23.0.0"
}
},
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
"boolean": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
@@ -1970,6 +2131,11 @@
"delayed-stream": "~1.0.0"
}
},
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
"cssstyle": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
@@ -2077,6 +2243,43 @@
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"optional": true
},
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "requires": {
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
"electron": {
"version": "31.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-31.1.0.tgz",
@@ -2385,6 +2588,11 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
},
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
"is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
@@ -2411,6 +2619,11 @@
"is-inside-container": "^1.0.0"
}
},
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
"joycon": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
@@ -2513,6 +2726,11 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
+ },
"node-localstorage": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-3.0.5.tgz",
@@ -2637,6 +2855,11 @@
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
},
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"process-warning": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz",
@@ -2846,6 +3069,11 @@
"real-require": "^0.2.0"
}
},
+ "toastify-js": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz",
+ "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ=="
+ },
"tough-cookie": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
@@ -2888,6 +3116,44 @@
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
+ "unzipper": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
+ "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==",
+ "requires": {
+ "bluebird": "~3.7.2",
+ "duplexer2": "~0.1.4",
+ "fs-extra": "^11.2.0",
+ "graceful-fs": "^4.2.2",
+ "node-int64": "^0.4.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="
+ }
+ }
+ },
"url-parse": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
@@ -2897,6 +3163,11 @@
"requires-port": "^1.0.0"
}
},
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
"w3c-xmlserializer": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
diff --git a/package.json b/package.json
index e14893d..afe123d 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
},
"dependencies": {
"@blockly/plugin-workspace-search": "^9.0.5",
+ "@blockly/theme-dark": "^7.0.7",
"@electron/remote": "^2.1.2",
"blockly": "^11.1.1",
"bootstrap": "^5.3.3",
@@ -23,6 +24,8 @@
"open": "^10.1.0",
"pino": "^9.3.2",
"pino-pretty": "^11.2.2",
+ "toastify-js": "^1.12.0",
+ "unzipper": "^0.12.3",
"xmldom": "^0.6.0"
}
}
diff --git a/src/blocksmanager.js b/src/blocksmanager.js
index 0309b2b..04d69e1 100644
--- a/src/blocksmanager.js
+++ b/src/blocksmanager.js
@@ -1,11 +1,103 @@
const fs = require('fs');
const path = require('path');
+const https = require('https');
+const unzipper = require('unzipper');
const { DOMParser, XMLSerializer } = require('xmldom');
const peripheralsfolder = path.join(__dirname, "../blocks");
const fallbackImagePath = path.join(__dirname, '..', 'assets', 'noimagefallback.png'); // Path to fallback image
+let progressBar = document.getElementById('progressBarloading');
+let blocks_url = "https://cdn.damp11113.xyz/file/zip/ccide/blockslastest.zip?dl=1"
+
+function isBlocksFolderEmpty() {
+ try {
+ const files = fs.readdirSync(peripheralsfolder);
+ return files.length === 0; // Returns true if the folder is empty
+ } catch (err) {
+ console.error('Error reading folder:', err);
+ return false; // Return false or handle error as needed
+ }
+}
+
+async function downloadBlocks() {
+ try {
+ progressBar.style.display = 'inline-block';
+ // Create the output directory if it doesn't exist
+ if (!fs.existsSync(peripheralsfolder)) {
+ fs.mkdirSync(peripheralsfolder, { recursive: true });
+ }
+
+ console.log('Downloading blocks...');
+
+ const zipFilePath = path.join(peripheralsfolder, 'blocks.zip');
+
+ // Download the file as a Promise
+ await new Promise((resolve, reject) => {
+ https.get(blocks_url, (response) => {
+ if (response.statusCode !== 200) {
+ reject(new Error(`Download failed with status code ${response.statusCode}`));
+ return;
+ }
+
+ const totalBytes = parseInt(response.headers['content-length'], 10);
+ let downloadedBytes = 0;
+
+ const file = fs.createWriteStream(zipFilePath);
+
+ response.on('data', (chunk) => {
+ downloadedBytes += chunk.length;
+ const percentCompleted = Math.round((downloadedBytes / totalBytes) * 100);
+ progressBar.value = percentCompleted;
+ progressBar.innerText = percentCompleted + '%'; // Fallback text
+ process.stdout.write(`Download progress: ${percentCompleted}%\r`);
+ });
+
+ response.pipe(file);
+
+ file.on('finish', () => {
+ file.close();
+ console.log('\nFile downloaded successfully.');
+ resolve();
+ });
+
+ file.on('error', (error) => {
+ fs.unlinkSync(zipFilePath);
+ reject(error);
+ });
+ }).on('error', (error) => {
+ reject(error);
+ });
+ });
+
+ console.log('Unzipping file...');
+
+ // Unzip the file as a Promise
+ await new Promise((resolve, reject) => {
+ fs.createReadStream(zipFilePath)
+ .pipe(unzipper.Extract({ path: peripheralsfolder }))
+ .on('close', () => {
+ console.log('File unzipped successfully.');
+ fs.unlinkSync(zipFilePath); // Delete the zip file after extraction
+ console.log('Zip file deleted.');
+
+ console.log('Downloaded blocks');
+ progressBar.style.display = 'none';
+ resolve();
+ })
+ .on('error', (error) => {
+ reject(error);
+ });
+ });
+
+
+
+ } catch (error) {
+ console.error('Error downloading or unzipping file:', error);
+ }
+}
+
const defineicon = {
computer: {
@@ -76,7 +168,7 @@ function loadperipheral(workspace, currenttoolbar, peripherals, usedlibinproject
const newxml = mergeXml(currenttoolbar, toolbar);
workspace.updateToolbox(newxml);
- document.getElementById('statusMessage').textContent = `Loaded ${peripherals}`;
+ fireNotify(`Loaded ${peripherals}`, "success")
// Synchronously require generator.js
require(generatorfilePath); // This will execute generator.js if it's a Node.js module
@@ -86,7 +178,7 @@ function loadperipheral(workspace, currenttoolbar, peripherals, usedlibinproject
return newxml;
} catch (e) {
- document.getElementById('statusMessage').textContent = `Can't Import ${peripherals}: ${e}`;
+ fireNotify(`Can't Import ${peripherals}: ${e}`, "error")
ipc.send("error", `Can't Import ${peripherals}: ${e}`);
}
} else {
@@ -125,7 +217,6 @@ function addimageiconinfo(div, src, tiptool) {
function scanindex() {
let foundedpackages = 0;
- document.getElementById('statusMessage').textContent = "Scanning Packages...";
// clear all item in libcontainer
document.getElementById('libcontainer').innerHTML = "";
@@ -230,14 +321,12 @@ function scanindex() {
});
});
- document.getElementById('statusMessage').textContent = `Founded ${foundedpackages} Packages`;
- setTimeout(() => {
- document.getElementById('statusMessage').textContent = `Ready`;
- }, 1000);
+ fireNotify(`Founded ${foundedpackages} Packages`, "success")
}
-
module.exports = {
loadperipheral,
- scanindex
+ scanindex,
+ isBlocksFolderEmpty,
+ downloadBlocks
}
\ No newline at end of file
diff --git a/src/ccRemote.js b/src/ccRemote.js
index edbe7a6..79a4ddc 100644
--- a/src/ccRemote.js
+++ b/src/ccRemote.js
@@ -9,14 +9,13 @@ class CCRemote {
console.log("Remote server is started");
+ fireNotify("Computer isn't connect", "warning", "https://github.com/DPSoftware-Foundation/ccIDE#install-remote-code-into-computercraft")
+
this.socket.on('connection', (ws) => {
document.getElementById("navbar-button-computer-disconnect").disabled = false;
document.getElementById("navbar-button-computer-run").disabled = false;
- document.getElementById('statusMessage').textContent = "Computer connected";
- setTimeout(() => {
- document.getElementById('statusMessage').textContent = `Ready`;
- }, 1000);
+ fireNotify("Computer connected", "success")
console.log('WebSocket connection established.');
@@ -34,10 +33,7 @@ class CCRemote {
document.getElementById("navbar-button-computer-disconnect").disabled = true;
document.getElementById("navbar-button-computer-run").disabled = true;
- document.getElementById('statusMessage').textContent = "Computer disconnected";
- setTimeout(() => {
- document.getElementById('statusMessage').textContent = `Ready`;
- }, 1000);
+ fireNotify("Computer disconnected", "warning")
});
ws.on('error', (error) => {
diff --git a/src/index.html b/src/index.html
index 3bfddac..bf0002f 100644
--- a/src/index.html
+++ b/src/index.html
@@ -3,137 +3,150 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
Please wait...
+
+
-
-
-
-
-
-
-
-
-
-