From 4cad5389d39f10e2995e647c081c887a7d494ad6 Mon Sep 17 00:00:00 2001 From: damp11113 Date: Tue, 29 Oct 2024 22:48:05 +0700 Subject: [PATCH] more update to 1.6 --- assets/DOPFoundationLogo.png | Bin 0 -> 12572 bytes assets/DPSoftware2.png | Bin 0 -> 14179 bytes blocks/Advanced_Peripherals/block_design.json | 300 +++++++++++++++++- blocks/Advanced_Peripherals/generator.js | 135 ++++++++ blocks/Advanced_Peripherals/index.json | 2 +- blocks/Advanced_Peripherals/toolbox.xml | 62 +++- index.js | 80 ++--- package-lock.json | 275 +++++++++++++++- package.json | 3 + src/blocksmanager.js | 107 ++++++- src/ccRemote.js | 12 +- src/index.html | 263 +++++++-------- src/index.js | 159 ++++++---- src/styles.css | 88 +++-- 14 files changed, 1229 insertions(+), 257 deletions(-) create mode 100644 assets/DOPFoundationLogo.png create mode 100644 assets/DPSoftware2.png diff --git a/assets/DOPFoundationLogo.png b/assets/DOPFoundationLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e44e3e72f2234be481ab495898359a1c596f8178 GIT binary patch literal 12572 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 literal 0 HcmV?d00001 diff --git a/assets/DPSoftware2.png b/assets/DPSoftware2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb808f91d86a79bace58e36a0660408c71b21003 GIT binary patch literal 14179 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 literal 0 HcmV?d00001 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...

+
+ - -
-
-
- -
-

Initializing...

-
- - - - - -