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...

+
+ - -
-
-
- -
-

Initializing...

-
- - - - - -