From 51c20a58798eaef6fe10afb631e55716c326ff72 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Wed, 7 Apr 2021 23:00:30 -0300 Subject: [PATCH 1/8] POcketmine init --- index.js | 33 +++++++++++++++++++++--- package-lock.json | 5 ++-- package.json | 5 ++-- postinstall/curlCheck.js | 28 ++++++++++++++++++++ scripts/basic_server.js | 11 +++++--- scripts/download.js | 55 +++++++++++++++++++++++++++++++++++++--- 6 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 postinstall/curlCheck.js diff --git a/index.js b/index.js index 98a2eec..94fc246 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ const { resolve } = require("path"); const { error } = console; const shell = require("shelljs"); const {getDesktopFolder, getConfigHome} = require("platform-folders") +const { execSync } = require("child_process"); const bds_core_package = resolve(__dirname, "package.json") const bds_maneger_version = require(bds_core_package).version @@ -40,9 +41,10 @@ module.exports.package_path = bds_core_package if (process.platform == "win32") { home = process.env.USERPROFILE; tmp = process.env.TMP - system = "windows"; + system = "Windows"; valid_platform = { "bedrock": true, + "pocketmine": true, "java": true } } else if (process.platform == "linux") { @@ -50,9 +52,10 @@ if (process.platform == "win32") { if (process.env.BDS_DOCKER_IMAGE) desktop = "/home/bds/" else desktop = "/tmp" tmp = "/tmp"; - system = "linux"; + system = "Linux"; valid_platform = { "bedrock": true, + "pocketmine": true, "java": true } } else if (process.platform == "darwin") { @@ -60,9 +63,10 @@ if (process.platform == "win32") { else require("open")("https://github.com/The-Bds-Maneger/core/wiki/system_support#macos-with-intel-processors"); home = process.env.HOME; tmp = "/tmp"; - system = "macOS"; + system = "MacOS"; valid_platform = { "bedrock": false, + "pocketmine": true, "java": true } } else { @@ -165,6 +169,15 @@ if (!(fs.existsSync(bds_dir_bedrock))){ } module.exports.bds_dir_bedrock = bds_dir_bedrock +/* PocketMine Path */ +const bds_dir_pocketmine = path.join(bds_dir, "pocketmine"); +if (!(fs.existsSync(bds_dir_pocketmine))){ + console.log("Creating the bds directory to Pocketmine") + fs.mkdirSync(bds_dir_pocketmine) + if (!(fs.existsSync(bds_dir_pocketmine))) shell.mkdir("-p", bds_dir_pocketmine); +} +module.exports.bds_dir_pocketmine = bds_dir_pocketmine + // Create backup folder if (!(fs.existsSync(bds_dir_backup))){ fs.mkdirSync(bds_dir_backup) @@ -192,6 +205,18 @@ if (!(fs.existsSync(log_dir))){ if (typeof fetch === "undefined") global.fetch = require("node-fetch"); if (typeof localStorage === "undefined") global.localStorage = new require("node-localstorage").LocalStorage(path.join(LocalStorageFolder, "Local_Storage")); +/* Minecraft Servers URLs and depedencies */ +// urls +const SERVER_URLs = JSON.parse(execSync("curl -sS \"https://raw.githubusercontent.com/Bds-Maneger/Raw_files/main/Server.json\"").toString()) +module.exports.SERVER_URLs = SERVER_URLs + +// PHP Bins +const PHPbinsUrl = JSON.parse(execSync("curl -sS \"https://raw.githubusercontent.com/The-Bds-Maneger/Raw_files/main/php_bin.json\"").toString()) +module.exports.PHPbinsUrls = PHPbinsUrl +console.log(PHPbinsUrl); +const PHPurlNames = Object.getOwnPropertyNames(PHPbinsUrl) +module.exports.PHPurlNames = PHPurlNames + /* ---------------------------------------------------------------------------- Variables ---------------------------------------------------------------------------- */ // Configs var bds_config, bds_config_file = path.join(bds_dir, "bds_config.json"); @@ -376,7 +401,7 @@ if (require("fs").existsSync(path.join(bds_dir, "telegram_token.txt"))){ throw new error("It was not possible to move the old telegram token file to the new bds maneger api file") } } -const getSize = require("get-folder-size") +const getSize = require("get-folder-size"); getSize(bds_dir_backup, function(err, info) { if (err) throw err function toGB(x) {return (x / (1024 * 1024 * 1024)).toFixed(1);} diff --git a/package-lock.json b/package-lock.json index 5390cec..c4bf0e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "@the-bds-maneger/core", - "version": "1.8.5.4", + "version": "1.8.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@the-bds-maneger/core", - "version": "1.8.5.4", + "version": "1.8.6", + "hasInstallScript": true, "license": "AGPL-3.0-or-later", "dependencies": { "adm-zip": "^0.5.1", diff --git a/package.json b/package.json index b6b1818..ddb215d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.8.5.5", + "version": "1.8.6", "description": "scripts to manage minecraft bedrock server", "private": false, "main": "index.js", @@ -12,7 +12,8 @@ "eslint": "eslint .", "eslint:fix": "eslint --fix .", "start": "node bin/bds_maneger.js", - "debug": "node bin/debug.js" + "debug": "node bin/debug.js", + "postinstall": "node ./postinstall/curlCheck.js" }, "bin": { "bds_maneger": "./bin/bds_maneger.js" diff --git a/postinstall/curlCheck.js b/postinstall/curlCheck.js new file mode 100644 index 0000000..ee45f9e --- /dev/null +++ b/postinstall/curlCheck.js @@ -0,0 +1,28 @@ +const { existsSync, mkdirSync, writeFileSync, chmodSync } = require("fs") +const { resolve, join } = require("path") +const binFolder = resolve((process.env.USERPROFILE||process.env.HOME), "bds_core", "bin") + +if (typeof fetch === "undefined") {var fetch = require("node-fetch")} +(function (){ + if (require("command-exists").sync("curl")) {console.log("Curl is already installed.");process.exit(0)} + else { + if (!(existsSync(binFolder))) mkdirSync(binFolder) + if (process.platform === "linux"){ + fetch("https://api.github.com/repos/moparisthebest/static-curl/releases").then(response => response.json()).then(function (res){ + var arch = process.arch + if (arch === "x64") arch = "amd64" + let url = `https://github.com/moparisthebest/static-curl/releases/download/${res[0].tag_name}/curl-${arch}` + console.log(url); + fetch(url).then(response => response.arrayBuffer()).then(response => Buffer.from(response)).then(response => { + writeFileSync(join(binFolder, "curl"), response, "binary") + chmodSync(join(binFolder, "curl"), 7777) + process.exit(0) + }).catch(function (err){if (err) {console.log(err);process.exit(1)}}) + }) + } else if (process.platform === "darwin") throw Error("You will have to install cURL manually, download page: https://curl.se/download.html"); + else if (process.platform === "win32") { + if (Math.trunc(require("os").release()) === "10") throw Error("Please make sure you are on the latest version of Windows 10"); + else throw Error(`Please manually install curl for Windows ${Math.trunc(require("os").release())}, download page: https://curl.se/download.html`) + } else throw Error("Please install curl manually, download page: https://curl.se/download.html") + } +})() \ No newline at end of file diff --git a/scripts/basic_server.js b/scripts/basic_server.js index 5de3d1d..88465a7 100644 --- a/scripts/basic_server.js +++ b/scripts/basic_server.js @@ -3,7 +3,8 @@ const Storage = localStorage; const {exec, execSync} = require("child_process"); const fs = require("fs") const path = require("path") -const {CheckBan} = require("./check") +const {CheckBan} = require("./check"); +const { resolve } = require("path"); module.exports.start = () => { function KickPlayer(player){ @@ -41,7 +42,7 @@ module.exports.start = () => { }, cwd: bds.bds_dir_bedrock}); } else if (process.platform === "darwin") throw Error("We don't have MacOS support yet") else process.exit(210) - } else { + } else if (plat === "java") { if (require("command-exists").sync("java")) start_server = exec(`java -Xmx${bds.bds_config.java_config.max}M -Xms${bds.bds_config.java_config.max}M -jar server.jar nogui`, {cwd: bds.bds_dir_java}); else { if (bds.system == "windows"){ @@ -55,7 +56,11 @@ module.exports.start = () => { console.log("http://docs.sirherobrine23.com/scripts/_java") } } - } + } else if (plat === "pocketmine") { + start_server = exec(`${resolve(bds.bds_dir_pocketmine, "bin/php7/bin/php")} ${resolve(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { + ...process.env, + }, cwd: bds.bds_dir_pocketmine}); + } else throw Error("") Storage.setItem("old_log_file", bds.log_file) start_server.stdout.on("data", function(data){ if (data.includes("agree", "EULA")){ diff --git a/scripts/download.js b/scripts/download.js index 40f7759..a491797 100644 --- a/scripts/download.js +++ b/scripts/download.js @@ -2,9 +2,11 @@ var AdmZip = require("adm-zip"); const { warn } = require("console"); const {writeFileSync, existsSync, readFileSync} = require("fs"); const { join } = require("path"); -const {bds_config, bds_dir_bedrock, bds_dir_java, platform_version_update, valid_platform} = require("../index") +const {bds_config, bds_dir_bedrock, bds_dir_java, platform_version_update, valid_platform, PHPurlNames, bds_dir_pocketmine, PHPbinsUrls} = require("../index") +const bdsSystem = require("../index").system +const response = require("../index").SERVER_URLs module.exports = function (version, force_install) { - return fetch("https://raw.githubusercontent.com/Bds-Maneger/Raw_files/main/Server.json").then(response => response.json()).then(response => { + try { if (version === "") version="latest" if (version === undefined) version="latest" const server_platform = bds_config.bds_platform @@ -61,6 +63,53 @@ module.exports = function (version, force_install) { if (process.env.BDS_DOCKER_IMAGE === "true") process.exit(0); } } else throw Error("Java not suported") + } else if (server_platform === "pocketmine") { + if (valid_platform.pocketmine === true) { + if (version === "latest") version = response.PocketMine_latest + url = response.PocketMine[version].url + console.log(`Server data publish: ${response.PocketMine[version].data}`) + console.log(bds_dir_pocketmine); + fetch(url).then(response => response.arrayBuffer()).then(response => Buffer.from(response)).then(response => { + writeFileSync(join(bds_dir_pocketmine, "PocketMine-MP.phar"), response, "binary") + console.log("PocketMine-MP.phar saved"); + platform_version_update(version) + const binFolder = join(bds_dir_pocketmine, "bin") + if (!(existsSync(binFolder))) { + var urlPHPBin; + for (let index in PHPurlNames){ + const nameFile = PHPurlNames[index] + var archS; + if (process.platform === "linux") if (process.arch === "x64") archS = "x86_64"; + if (process.platform === "darwin") if (process.arch === "x64") archS = "x86_64"; + if (process.platform === "win32") if (process.arch === "x64") archS = "x64"; + var arch = false, system = false; + if (nameFile.includes(bdsSystem)) system = true + if (nameFile.includes(archS)) arch = true + // -*-*-*-*- + console.log({ + arch, + system + }); + if (arch === true && system === true){ + urlPHPBin = PHPbinsUrls[nameFile] + } + } + if (urlPHPBin === undefined) throw Error("File not found") + else { + console.log(urlPHPBin); + fetch(urlPHPBin).then(response => response.arrayBuffer()).then(response => Buffer.from(response)).then(response => { + console.log("Download Sucess") + var zipExtractBin = new AdmZip(response); + zipExtractBin.extractAllTo(bds_dir_pocketmine, true) + console.log("Extract Sucess") + if (process.env.BDS_DOCKER_IMAGE === "true") process.exit(0); + }) + } + } else if (process.env.BDS_DOCKER_IMAGE === "true") process.exit(0); + }) + } else throw Error("Pocketmine not suported") } else throw Error("Bds maneger Config file error") - }).catch(function (err){if (err) throw err;}) + } catch (error) { + console.error(error); + } } -- 2.45.2 From d538e332b984b4aabafa1126832ead555ca405f4 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Thu, 8 Apr 2021 12:00:05 -0300 Subject: [PATCH 2/8] POcketmine: Basic_server.js add php bin in PATH, download.js fix php.ini and add configurations to bds_settings.js --- bin/bds_maneger.js | 2 +- index.js | 10 +++---- scripts/basic_server.js | 18 +++++++++++-- scripts/bds_settings.js | 58 +++++++++++++++++++++++++++++++++-------- scripts/download.js | 32 ++++++++++++++++++++--- 5 files changed, 98 insertions(+), 22 deletions(-) diff --git a/bin/bds_maneger.js b/bin/bds_maneger.js index 2f8271e..05519c9 100755 --- a/bin/bds_maneger.js +++ b/bin/bds_maneger.js @@ -54,7 +54,7 @@ if (!(existsSync(server_exec))) { if (bds_version){ try { process.env.BDS_DOCKER_IMAGE = true - bds.download(bds_version) + bds.download(bds_version, true) } catch (error) { console.error(error) process.exit(165) diff --git a/index.js b/index.js index 94fc246..9726405 100644 --- a/index.js +++ b/index.js @@ -221,9 +221,9 @@ module.exports.PHPurlNames = PHPurlNames // Configs var bds_config, bds_config_file = path.join(bds_dir, "bds_config.json"); const current_version_bds_core = bds_maneger_version -var default_porcess; -if (process.platform.includes("win32", "linux")) default_porcess = "bedrock" -else default_porcess = "java" +var default_platformConfig; +if (process.platform.includes("win32", "linux")) default_platformConfig = "bedrock" +else default_platformConfig = "java" if (fs.existsSync(bds_config_file)){ bds_config = JSON.parse(fs.readFileSync(bds_config_file, "utf8")) if (bds_config.version !== current_version_bds_core){ @@ -234,7 +234,7 @@ if (fs.existsSync(bds_config_file)){ bds_config = { "version": current_version_bds_core, "bds_pages": (bds_config.bds_pages||"default"), - "bds_platform": (bds_config.bds_platform||default_porcess), + "bds_platform": (bds_config.bds_platform||default_platformConfig), "platform_version": { "bedrock": (bds_config.platform_version.bedrock||"latest"), "java": (bds_config.platform_version.java||"latest") @@ -260,7 +260,7 @@ if (fs.existsSync(bds_config_file)){ bds_config = { "version": current_version_bds_core, "bds_pages": "default", - "bds_platform": default_porcess, + "bds_platform": default_platformConfig, "platform_version": { "bedrock": "latest", "java": "latest" diff --git a/scripts/basic_server.js b/scripts/basic_server.js index 88465a7..6dc9fa7 100644 --- a/scripts/basic_server.js +++ b/scripts/basic_server.js @@ -5,6 +5,7 @@ const fs = require("fs") const path = require("path") const {CheckBan} = require("./check"); const { resolve } = require("path"); +const commandExists = require("command-exists").sync module.exports.start = () => { function KickPlayer(player){ @@ -57,8 +58,21 @@ module.exports.start = () => { } } } else if (plat === "pocketmine") { - start_server = exec(`${resolve(bds.bds_dir_pocketmine, "bin/php7/bin/php")} ${resolve(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { - ...process.env, + let childPorcessEnv = process.env + const phpinCore = resolve(bds.bds_dir_pocketmine, "bin", "php7", "bin") + if (commandExists("php")) throw Error("php command installed in system, please remove php from your system as it may conflict with pocketmine"); + else if (fs.existsSync(phpinCore)) { + console.log(phpinCore); + if (process.env.PATH.includes(phpinCore))console.log("PHP bin folder includes in PATH"); + else { + if (process.platform === "win32") childPorcessEnv.PATH += `;${phpinCore}` + else childPorcessEnv.PATH += `:${phpinCore}` + } + } + else throw Error("Reinstall Pocketmine-MP, PHP binaries not found") + console.log(childPorcessEnv.PATH); + start_server = exec(`php ${resolve(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { + ...childPorcessEnv }, cwd: bds.bds_dir_pocketmine}); } else throw Error("") Storage.setItem("old_log_file", bds.log_file) diff --git a/scripts/bds_settings.js b/scripts/bds_settings.js index 8c812e2..53f72c3 100644 --- a/scripts/bds_settings.js +++ b/scripts/bds_settings.js @@ -6,7 +6,9 @@ function bds_config(json_config){ var Server_Config; if (bds.platform === "java") Server_Config = path.join(bds.bds_dir_java, "server.properties"); - else Server_Config = path.join(bds.bds_dir_bedrock, "server.properties"); + else if (bds.platform === "bedrock") Server_Config = path.join(bds.bds_dir_bedrock, "server.properties"); + else if (bds.platform === "pocketmine") Server_Config = path.join(bds.bds_dir_pocketmine, "server.properties"); + else throw Error("Bds Maneger Config, Platforms not valid: "+bds.platform) var CPU if (2 < cpuCount - 2) CPU = cpuCount - 2; @@ -18,8 +20,8 @@ function bds_config(json_config){ // var - description_name = "Dedicated Server", - level_name = "Bedrock level", + description_name = "A minecraft server", + level_name = "Minecraft World", gamemode = "survival", difficulty = "easy", allow_cheats = false, @@ -29,7 +31,8 @@ function bds_config(json_config){ server_port = 19132, server_portv6 = 19133, player_permission = "member", - tick = 0 + tick = 0, + hardcore; if (config.description !== undefined) description_name = config.description; @@ -91,7 +94,11 @@ server-authoritative-block-breaking=false # Created on Bds-Manager by Sirherobrine23` -} else { +} else if (bds.platform === "java") { + hardcore = "false" + if (gamemode === "survival") null + else if (gamemode === "creative") null + else {gamemode = 0;hardcore = "true"} config_file_content = `enable-jmx-monitoring=false rcon.port=25575 level-seed= @@ -101,7 +108,7 @@ enable-query=true generator-settings= level-name=${level_name} motd=${description_name} -query.port=${server_port} +query.port=${server_port+1} pvp=true generate-structures=true difficulty=${difficulty} @@ -128,7 +135,7 @@ rcon.password=25as65d3 player-idle-timeout=0 force-gamemode=false rate-limit=0 -hardcore=false +hardcore=${hardcore} white-list=${white_list} broadcast-console-to-ops=true spawn-npcs=true @@ -144,10 +151,39 @@ spawn-protection=16 max-world-size=29999984 # # Created on Bds-Manager by Sirherobrine23` -} -// console.log(config_file_content); -fs.writeFileSync(Server_Config, config_file_content); -return true +} else if (bds.platform === "pocketmine") { + hardcore = "off" + if (gamemode === "survival") gamemode = 0 + else if (gamemode === "creative") gamemode = 1 + else {gamemode = 0;hardcore = "on"} + config_file_content = `language=eng +motd=${description_name} +server-port=${server_port} +white-list=off +announce-player-achievements=on +spawn-protection=16 +max-players=${max_players} +gamemode=${gamemode} +force-gamemode=off +hardcore=${hardcore} +pvp=on +difficulty=2 +generator-settings= +level-name=${level_name} +level-seed= +level-type=DEFAULT +enable-query=on +enable-rcon=off +rcon.password=F/deZ5kefY +auto-save=on +view-distance=${tick} +xbox-auth=on +# +# Created on Bds-Manager by Sirherobrine23` +} else throw Error("Plaforms not valid: "+bds.platform) + // Write file + fs.writeFileSync(Server_Config, config_file_content); + return true } function bds_get_config(){ var fs = require("fs"); diff --git a/scripts/download.js b/scripts/download.js index a491797..2922ef1 100644 --- a/scripts/download.js +++ b/scripts/download.js @@ -1,10 +1,11 @@ var AdmZip = require("adm-zip"); const { warn } = require("console"); -const {writeFileSync, existsSync, readFileSync} = require("fs"); -const { join } = require("path"); +const {writeFileSync, existsSync, readFileSync, readdirSync} = require("fs"); +const { join, resolve } = require("path"); const {bds_config, bds_dir_bedrock, bds_dir_java, platform_version_update, valid_platform, PHPurlNames, bds_dir_pocketmine, PHPbinsUrls} = require("../index") const bdsSystem = require("../index").system const response = require("../index").SERVER_URLs +const commandExists = require("command-exists").sync module.exports = function (version, force_install) { try { if (version === "") version="latest" @@ -74,7 +75,11 @@ module.exports = function (version, force_install) { console.log("PocketMine-MP.phar saved"); platform_version_update(version) const binFolder = join(bds_dir_pocketmine, "bin") - if (!(existsSync(binFolder))) { + var CheckBinPHPFolder; + if (existsSync(binFolder)) CheckBinPHPFolder = false + else if (commandExists("php")) CheckBinPHPFolder = false + else CheckBinPHPFolder = true + if (CheckBinPHPFolder||force_install) { var urlPHPBin; for (let index in PHPurlNames){ const nameFile = PHPurlNames[index] @@ -102,6 +107,27 @@ module.exports = function (version, force_install) { var zipExtractBin = new AdmZip(response); zipExtractBin.extractAllTo(bds_dir_pocketmine, true) console.log("Extract Sucess") + const phpBinFolder = resolve(bds_dir_pocketmine, "bin") + const phpIni = readFileSync(join(phpBinFolder, "php7", "bin", "php.ini"), "utf-8") + const phpIniSplit = phpIni.split("\n") + var check_extension_dir = false + for (let index in phpIniSplit){ + let test = phpIniSplit[index] + if (test.includes("extension_dir")) check_extension_dir = true; + console.log(test); + } + if (check_extension_dir) console.log("Pulando configuração do php.ini"); + else { + const phpExtensiosnsDir = resolve(bds_dir_pocketmine, "bin/php7/lib/php/extensions") + const phpExtensiosns = readdirSync(phpExtensiosnsDir) + var exetensionZen; + for (let index2 in phpExtensiosns){ + + if (phpExtensiosns[index2].includes("debug-zts")) exetensionZen = phpExtensiosns[index2] + } + phpIniSplit.push(`extension_dir="${resolve(phpExtensiosnsDir, exetensionZen)}"`) + writeFileSync(join(phpBinFolder, "php7", "bin", "php.ini"), phpIniSplit.join("\n")) + } if (process.env.BDS_DOCKER_IMAGE === "true") process.exit(0); }) } -- 2.45.2 From 73709a1a2eeb6de3a79c4977cbab555a38705f89 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Thu, 8 Apr 2021 12:16:54 -0300 Subject: [PATCH 3/8] push --- postinstall/curlCheck.js | 2 +- scripts/basic_server.js | 140 +++++++++++++++++++-------------------- scripts/bds_settings.js | 4 +- scripts/download.js | 2 +- 4 files changed, 70 insertions(+), 78 deletions(-) diff --git a/postinstall/curlCheck.js b/postinstall/curlCheck.js index ee45f9e..4879c7d 100644 --- a/postinstall/curlCheck.js +++ b/postinstall/curlCheck.js @@ -2,7 +2,7 @@ const { existsSync, mkdirSync, writeFileSync, chmodSync } = require("fs") const { resolve, join } = require("path") const binFolder = resolve((process.env.USERPROFILE||process.env.HOME), "bds_core", "bin") -if (typeof fetch === "undefined") {var fetch = require("node-fetch")} +if (typeof fetch === "undefined") {global.fetch = require("node-fetch")} (function (){ if (require("command-exists").sync("curl")) {console.log("Curl is already installed.");process.exit(0)} else { diff --git a/scripts/basic_server.js b/scripts/basic_server.js index 6dc9fa7..f50f2a8 100644 --- a/scripts/basic_server.js +++ b/scripts/basic_server.js @@ -4,7 +4,7 @@ const {exec, execSync} = require("child_process"); const fs = require("fs") const path = require("path") const {CheckBan} = require("./check"); -const { resolve } = require("path"); +const { resolve, join } = require("path"); const commandExists = require("command-exists").sync module.exports.start = () => { @@ -41,6 +41,68 @@ module.exports.start = () => { ...process.env, LD_LIBRARY_PATH: bds.bds_dir_bedrock }, cwd: bds.bds_dir_bedrock}); + start_server.stdout.on("data", function(data){ + data = data.split("\n") + var username; + for (let line in data){ + const value = data[line].split(" ") + // const list_player = value + const status = value[2] + if (status === "connected:"){ + if (value[3].includes(",")) username = value[3] + else username = `${value[3]} ${value[4]}` + if (username.slice(-1) === ",") username = username.slice(0, -1) + //------------------ + if (CheckBan(username)) KickPlayer(username) + else { + console.log("Server Username connected: "+username); + const file_users = fs.readFileSync(bds.players_files); + const users = JSON.parse(file_users, "utf-8") + if (file_users.includes(username)){ + for (let rem in users){ + if (users[rem].player === username) { + users[rem].connected = true + users[rem].date = new Date() + users[rem].update.push({ + date: new Date(), + connected: true + }) + } + } + } else users.push({ + player: username, + date: new Date(), + connected: true, + update: [ + { + date: new Date(), + connected: true, + } + ] + }) + fs.writeFileSync(bds.players_files, JSON.stringify(users, null, 2)) + } + + } else if (status === "disconnected:"){ + if (value[3].includes(",")) username = value[3] + else username = `${value[3]} ${value[4]}` + if (username.slice(-1) === ",") username = username.slice(0, -1) + console.log("Server Username disconnected: "+username); + const users = JSON.parse(fs.readFileSync(bds.players_files, "utf-8")) + for (let rem in users){ + if (users[rem].player === username) { + users[rem].connected = false + users[rem].date = new Date() + users[rem].update.push({ + date: new Date(), + connected: false + }) + } + } + fs.writeFileSync(bds.players_files, JSON.stringify(users, null, 2)) + } + } + }) } else if (process.platform === "darwin") throw Error("We don't have MacOS support yet") else process.exit(210) } else if (plat === "java") { @@ -71,7 +133,7 @@ module.exports.start = () => { } else throw Error("Reinstall Pocketmine-MP, PHP binaries not found") console.log(childPorcessEnv.PATH); - start_server = exec(`php ${resolve(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { + start_server = exec(`php ${join(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { ...childPorcessEnv }, cwd: bds.bds_dir_pocketmine}); } else throw Error("") @@ -89,77 +151,9 @@ module.exports.start = () => { }, 1000); } } - }) - var logConsoleStream = require("fs").createWriteStream(bds.log_file, {flags: "a"}); - var latestLog = require("fs").createWriteStream(path.join(bds.bds_dir, "log", "latest.log"), {flags: "w"}); - start_server.stdout.pipe(logConsoleStream); - start_server.stdout.pipe(latestLog); - if (bds.bds_config.bds_platform === "bedrock"){ - start_server.stdout.on("data", function(data){ - data = data.split("\n") - var username; - for (let line in data){ - const value = data[line].split(" ") - // const list_player = value - const status = value[2] - if (status === "connected:"){ - if (value[3].includes(",")) username = value[3] - else username = `${value[3]} ${value[4]}` - if (username.slice(-1) === ",") username = username.slice(0, -1) - //------------------ - if (CheckBan(username)) KickPlayer(username) - else { - console.log("Server Username connected: "+username); - const file_users = fs.readFileSync(bds.players_files); - const users = JSON.parse(file_users, "utf-8") - if (file_users.includes(username)){ - for (let rem in users){ - if (users[rem].player === username) { - users[rem].connected = true - users[rem].date = new Date() - users[rem].update.push({ - date: new Date(), - connected: true - }) - } - } - } else users.push({ - player: username, - date: new Date(), - connected: true, - update: [ - { - date: new Date(), - connected: true, - } - ] - }) - fs.writeFileSync(bds.players_files, JSON.stringify(users, null, 2)) - } - - } else if (status === "disconnected:"){ - if (value[3].includes(",")) username = value[3] - else username = `${value[3]} ${value[4]}` - if (username.slice(-1) === ",") username = username.slice(0, -1) - console.log("Server Username disconnected: "+username); - const users = JSON.parse(fs.readFileSync(bds.players_files, "utf-8")) - for (let rem in users){ - if (users[rem].player === username) { - users[rem].connected = false - users[rem].date = new Date() - users[rem].update.push({ - date: new Date(), - connected: false - }) - } - } - fs.writeFileSync(bds.players_files, JSON.stringify(users, null, 2)) - } - } - }) - } else if (bds.bds_config.bds_platform === "java"){ - console.log("Java is not yet supported the user list"); - } + }); + start_server.stdout.pipe(fs.createWriteStream(bds.log_file, {flags: "a"})); + start_server.stdout.pipe(fs.createWriteStream(path.join(bds.bds_dir, "log", "latest.log"), {flags: "w"})); if (typeof bds_log_string !== "undefined"){bds_log_string = ""} start_server.stdout.on("data", function(data){if (global.bds_log_string === undefined) global.bds_log_string = data;else global.bds_log_string += data}) Storage.setItem("bds_status", true); diff --git a/scripts/bds_settings.js b/scripts/bds_settings.js index 53f72c3..06b903b 100644 --- a/scripts/bds_settings.js +++ b/scripts/bds_settings.js @@ -96,9 +96,7 @@ server-authoritative-block-breaking=false } else if (bds.platform === "java") { hardcore = "false" - if (gamemode === "survival") null - else if (gamemode === "creative") null - else {gamemode = 0;hardcore = "true"} + if (gamemode === "hardcore") {gamemode = 0;hardcore = "true"} config_file_content = `enable-jmx-monitoring=false rcon.port=25575 level-seed= diff --git a/scripts/download.js b/scripts/download.js index 2922ef1..530c3bd 100644 --- a/scripts/download.js +++ b/scripts/download.js @@ -116,7 +116,7 @@ module.exports = function (version, force_install) { if (test.includes("extension_dir")) check_extension_dir = true; console.log(test); } - if (check_extension_dir) console.log("Pulando configuração do php.ini"); + if (check_extension_dir) console.log("Skipping php.ini configuration"); else { const phpExtensiosnsDir = resolve(bds_dir_pocketmine, "bin/php7/lib/php/extensions") const phpExtensiosns = readdirSync(phpExtensiosnsDir) -- 2.45.2 From 80f7ec3a3f1111d0f50ed2ec2fb7764312182502 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Thu, 8 Apr 2021 12:29:31 -0300 Subject: [PATCH 4/8] push --- scripts/basic_server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/basic_server.js b/scripts/basic_server.js index f50f2a8..28bf22b 100644 --- a/scripts/basic_server.js +++ b/scripts/basic_server.js @@ -4,7 +4,7 @@ const {exec, execSync} = require("child_process"); const fs = require("fs") const path = require("path") const {CheckBan} = require("./check"); -const { resolve, join } = require("path"); +const { resolve } = require("path"); const commandExists = require("command-exists").sync module.exports.start = () => { @@ -115,7 +115,7 @@ module.exports.start = () => { require("open")("http://docs.sirherobrine23.com/bds_maneger_api_java#Linux"); console.log("http://docs.sirherobrine23.com/bds_maneger_api_java#Linux") } else { - require("open")("http://docs.sirherobrine23.com/bds_maneger_api_java"); + require("open")("http://docs.sirherobrine23.com/bds_maneger_api_java#MacOS"); console.log("http://docs.sirherobrine23.com/scripts/_java") } } @@ -133,7 +133,7 @@ module.exports.start = () => { } else throw Error("Reinstall Pocketmine-MP, PHP binaries not found") console.log(childPorcessEnv.PATH); - start_server = exec(`php ${join(bds.bds_dir_pocketmine, "PocketMine-MP.phar")}`, {env: { + start_server = exec("php ./PocketMine-MP.phar", {env: { ...childPorcessEnv }, cwd: bds.bds_dir_pocketmine}); } else throw Error("") -- 2.45.2 From 17ecc09216edf5a673ddd1b47807af119fa00ad4 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Thu, 8 Apr 2021 21:13:50 -0300 Subject: [PATCH 5/8] Push From Windows --- .../{nightly_docker.yml => DockerCheck.yml} | 11 +++---- .github/workflows/codeql-analysis.yml | 6 ++-- .github/workflows/{npm_dev.yml => main.yml} | 33 ++++++++++++++++--- .github/workflows/merge_depedencies.yaml | 2 ++ README.md | 6 ++++ postinstall/curlCheck.js => curlCheck.js | 22 +++++++++++-- package.json | 4 +-- 7 files changed, 66 insertions(+), 18 deletions(-) rename .github/workflows/{nightly_docker.yml => DockerCheck.yml} (77%) rename .github/workflows/{npm_dev.yml => main.yml} (55%) rename postinstall/curlCheck.js => curlCheck.js (56%) diff --git a/.github/workflows/nightly_docker.yml b/.github/workflows/DockerCheck.yml similarity index 77% rename from .github/workflows/nightly_docker.yml rename to .github/workflows/DockerCheck.yml index 477abdb..c542180 100644 --- a/.github/workflows/nightly_docker.yml +++ b/.github/workflows/DockerCheck.yml @@ -1,8 +1,6 @@ -name: The nightly Docker Image +name: The Docker Image Check on: - push: - branches-ignore: - - dependabot/** + pull_request: jobs: Docker: @@ -27,9 +25,8 @@ jobs: id: docker_build uses: docker/build-push-action@v2 with: - push: true file: Docker/Dockerfile + push: false tags: | - sirherobrine23/bdsmaneger:nightly - bdsmaneger/maneger:nightly + bdsmaneger:test_${{ github.run_id }} platforms: linux/amd64,linux/arm64 \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3c4aa3f..c308787 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,9 +2,11 @@ name: "CodeQL" on: push: - branches: [ main, stable ] + branches: + - main pull_request: - branches: [ main, stable ] + branches: + - main schedule: - cron: "38 17 * * */3" diff --git a/.github/workflows/npm_dev.yml b/.github/workflows/main.yml similarity index 55% rename from .github/workflows/npm_dev.yml rename to .github/workflows/main.yml index 008a7b2..2e74f93 100644 --- a/.github/workflows/npm_dev.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Npm dev package Publish +name: Dev Publish NPM and Docker Image on: push: branches: @@ -11,18 +11,16 @@ on: - 'CHANGELOG.md' - 'Docker/*/**' jobs: - Npm-Publish: + Npm-Publish-Dev: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@master - - name: Npm and Node Setup uses: actions/setup-node@v1 with: node-version: 15.x registry-url: https://registry.npmjs.org/ - - name: Edit Version run: | id_run1=$(echo ${{ github.run_id }} |cut -b 1-2) @@ -33,6 +31,31 @@ jobs: sed "s|$old|\"version\": \"$new_version\",|g" package.json > package2.json cat package2.json > package.json rm -rfv package2.json - - name: Install Packages run: npm install + + Docker: + runs-on: ubuntu-latest + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_ORG_USER }} + password: ${{ secrets.DOCKER_ORG_PASS }} + - name: checkout + uses: actions/checkout@master + + - name: Build Nightly Image + id: docker_build + uses: docker/build-push-action@v2 + with: + push: true + file: Docker/Dockerfile + tags: | + sirherobrine23/bdsmaneger:nightly + bdsmaneger/maneger:nightly + platforms: linux/amd64,linux/arm64 \ No newline at end of file diff --git a/.github/workflows/merge_depedencies.yaml b/.github/workflows/merge_depedencies.yaml index f574a0e..8655b6f 100644 --- a/.github/workflows/merge_depedencies.yaml +++ b/.github/workflows/merge_depedencies.yaml @@ -1,6 +1,8 @@ name: "Dependabot Automerge - Action" on: pull_request: + branches: + - dependabot/** check_suite: types: - completed diff --git a/README.md b/README.md index a95cf51..1cbf5e2 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,9 @@ bdsmaneger/maneger:latest ### Microsoft Azure Virtual machine [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FThe-Bds-Maneger%2FAzure_VMs%2Fmain%2Fdeploy.json) More Information Access the repository: [Azure VMs](https://github.com/The-Bds-Maneger/Azure_VMs) + +## Common Mistakes + +* ### On Windows if you are receiving any error from platform-tools, follow these [steps](https://github.com/nodejs/node-gyp#on-windows), and install [python](https://www.python.org/downloads/). + +* ### If you are using Branch main, there may be several errors and corrections may take time to arrive, I recommend using the Tags. diff --git a/postinstall/curlCheck.js b/curlCheck.js similarity index 56% rename from postinstall/curlCheck.js rename to curlCheck.js index 4879c7d..647fcfa 100644 --- a/postinstall/curlCheck.js +++ b/curlCheck.js @@ -21,8 +21,26 @@ if (typeof fetch === "undefined") {global.fetch = require("node-fetch")} }) } else if (process.platform === "darwin") throw Error("You will have to install cURL manually, download page: https://curl.se/download.html"); else if (process.platform === "win32") { - if (Math.trunc(require("os").release()) === "10") throw Error("Please make sure you are on the latest version of Windows 10"); - else throw Error(`Please manually install curl for Windows ${Math.trunc(require("os").release())}, download page: https://curl.se/download.html`) + // Version major.minor + // ------------------------------------------ ------------- + // Windows 10, Windows Server 2016 10.0 + // Windows 8.1, Windows Server 2012 R2 6.3 + // Windows 8, Windows Server 2012 6.2 + // Windows 7, Windows Server 2008 R2 6.1 + // Windows Vista, Windows Server 2008 6.0 + // Windows XP Professional x64 Edition, 5.2 + // Windows Server 2003, Windows Home Server + // Windows XP 5.1 + // Windows 2000 5.0 + var WindowsVersion = require("os").release() + if (WindowsVersion.includes("10.0")) WindowsVersion = 10 + else if (WindowsVersion.includes("6.3")) WindowsVersion = 8.1 + else if (WindowsVersion.includes("6.2")) WindowsVersion = 8 + else if (WindowsVersion.includes("6.1")) WindowsVersion = 7 + else WindowsVersion = "unsupported" + + if (WindowsVersion === 10) throw Error("Please make sure you are on the latest version of Windows 10"); + else throw Error(`Please manually install curl for Windows ${WindowsVersion}, download page: https://curl.se/download.html`) } else throw Error("Please install curl manually, download page: https://curl.se/download.html") } })() \ No newline at end of file diff --git a/package.json b/package.json index cc2fde0..ea93699 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,12 @@ "private": false, "main": "index.js", "scripts": { - "test": "", + "test": "exit 0", "eslint": "eslint .", "eslint:fix": "eslint --fix .", "start": "node bin/bds_maneger.js", "debug": "node bin/debug.js", - "postinstall": "node ./postinstall/curlCheck.js" + "postinstall": "node curlCheck.js" }, "bin": { "bds_maneger": "./bin/bds_maneger.js" -- 2.45.2 From 720ae3995849029a883262a8f9426d597859d1ff Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Fri, 9 Apr 2021 13:09:07 -0300 Subject: [PATCH 6/8] Push 1.8.6.5 --- .dockerignore | 3 +- .github/workflows/merge_depedencies.yaml | 4 - Docker.sh | 10 + Docker/Dockerfile | 6 +- Docker/etc/nginx/sites-available/default | 11 - Docker/{ => root_path}/base/init.sh | 0 Docker/{ => root_path}/base/server_start.js | 0 Docker/{ => root_path}/base/setup_node.js | 2 +- .../etc/nginx/sites-available/default | 21 ++ Docker/root_path/html/README.md | 11 + .../root_path/html/assents/css/Minecraft.ttf | Bin 0 -> 14488 bytes .../html/assents/css/Mojang-Bold.ttf | Bin 0 -> 26528 bytes .../html/assents/css/Mojang-Regular.ttf | Bin 0 -> 28416 bytes Docker/root_path/html/assents/css/check.css | 64 +++++ .../root_path/html/assents/css/complete.css | 11 + Docker/root_path/html/assents/css/main.css | 253 ++++++++++++++++++ .../root_path/html/assents/image/cancelar.svg | 3 + .../root_path/html/assents/image/confirm.svg | 3 + .../root_path/html/assents/image/favicon.ico | Bin 0 -> 58567 bytes .../image/google-drive-svgrepo-com.svg | 40 +++ .../html/assents/image/settings-24px.svg | 1 + .../html/assents/image/shopping_cart-24px.svg | 1 + .../html/assents/image/text_snippet-24px.svg | 1 + .../html/assents/image/trip_origin-24px.svg | 1 + Docker/root_path/html/assents/js/modal.js | 14 + .../html/assents/js/setting_server.js | 16 ++ Docker/root_path/html/index.html | 128 +++++++++ Docker/root_path/html/web_main.js | 79 ++++++ README.md | 20 +- docker_build_image.sh | 4 - index.js | 13 +- package-lock.json | 5 +- package.json | 2 +- scripts/basic_server.js | 5 +- 34 files changed, 685 insertions(+), 47 deletions(-) create mode 100755 Docker.sh delete mode 100644 Docker/etc/nginx/sites-available/default rename Docker/{ => root_path}/base/init.sh (100%) rename Docker/{ => root_path}/base/server_start.js (100%) rename Docker/{ => root_path}/base/setup_node.js (92%) create mode 100644 Docker/root_path/etc/nginx/sites-available/default create mode 100644 Docker/root_path/html/README.md create mode 100644 Docker/root_path/html/assents/css/Minecraft.ttf create mode 100644 Docker/root_path/html/assents/css/Mojang-Bold.ttf create mode 100644 Docker/root_path/html/assents/css/Mojang-Regular.ttf create mode 100644 Docker/root_path/html/assents/css/check.css create mode 100644 Docker/root_path/html/assents/css/complete.css create mode 100644 Docker/root_path/html/assents/css/main.css create mode 100644 Docker/root_path/html/assents/image/cancelar.svg create mode 100644 Docker/root_path/html/assents/image/confirm.svg create mode 100644 Docker/root_path/html/assents/image/favicon.ico create mode 100644 Docker/root_path/html/assents/image/google-drive-svgrepo-com.svg create mode 100644 Docker/root_path/html/assents/image/settings-24px.svg create mode 100644 Docker/root_path/html/assents/image/shopping_cart-24px.svg create mode 100644 Docker/root_path/html/assents/image/text_snippet-24px.svg create mode 100644 Docker/root_path/html/assents/image/trip_origin-24px.svg create mode 100644 Docker/root_path/html/assents/js/modal.js create mode 100644 Docker/root_path/html/assents/js/setting_server.js create mode 100644 Docker/root_path/html/index.html create mode 100644 Docker/root_path/html/web_main.js delete mode 100644 docker_build_image.sh diff --git a/.dockerignore b/.dockerignore index be0edca..f0bf5c3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ node_modules/ Docker/ -!Docker/base -!Docker/etc \ No newline at end of file +!Docker/root_path \ No newline at end of file diff --git a/.github/workflows/merge_depedencies.yaml b/.github/workflows/merge_depedencies.yaml index 8655b6f..e264a60 100644 --- a/.github/workflows/merge_depedencies.yaml +++ b/.github/workflows/merge_depedencies.yaml @@ -3,10 +3,6 @@ on: pull_request: branches: - dependabot/** - check_suite: - types: - - completed - status: {} jobs: automerge: runs-on: ubuntu-latest diff --git a/Docker.sh b/Docker.sh new file mode 100755 index 0000000..3e87696 --- /dev/null +++ b/Docker.sh @@ -0,0 +1,10 @@ +#!/bin/bash +docker_image_name='thebdsmaneger/maneger' +docker build -f Docker/Dockerfile --tag ${docker_image_name} . && { + echo "----------------------------------------------" + read -rp "Run Image? (Y/n) " -e -i "y" DockerRun + if [ "${DockerRun}" == "y" ];then docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}; + elif [ "${DockerRun}" == "Y" ];then docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}; + else echo "Run: \"docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}\""; + fi +} \ No newline at end of file diff --git a/Docker/Dockerfile b/Docker/Dockerfile index a616322..bf2e006 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -6,12 +6,14 @@ RUN \ echo "Arch: $(uname -m)"; \ apt update && \ apt install -y git curl openjdk-14-jdk openjdk-14-jre wget jq sudo unzip zip screen nginx python make build-essential $(case $(uname -m) in "x86_64") echo "";; *) echo "qemu-user-static binfmt-support";; esac) && \ +case $(uname -m) in "x86_64") echo "";; \ +*) wget https://raw.githubusercontent.com/The-Bds-Maneger/Raw_files/main/linux_libries.zip -O /tmp/libries.zip && unzip /tmp/libries.zip -d / && rm -rfv /tmp/libries.zip ;; \ +esac ;\ rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* /tmp/* && \ mkdir -p /home/bds/ && rm -rfv /etc/nginx/sites-available/default # Copy Files -COPY ./Docker/base/ /base/ -COPY ./Docker/etc/ /etc/ +COPY ./Docker/root_path/ / COPY ./ /opt/bdsCore/ RUN cd /opt/bdsCore/ && npm install --no-save ENV TELEGRAM_TOKEN="null" DESCRIPTION="running Minecraft Bedrock Server on the docker by Bds Manager" \ diff --git a/Docker/etc/nginx/sites-available/default b/Docker/etc/nginx/sites-available/default deleted file mode 100644 index 1024e58..0000000 --- a/Docker/etc/nginx/sites-available/default +++ /dev/null @@ -1,11 +0,0 @@ -server { - listen [::]:80 ipv6only=on; - listen 80; - server_name _; - location /log { - proxy_pass http://localhost:6565/; - } - location / { - proxy_pass http://localhost:1932; - } -} \ No newline at end of file diff --git a/Docker/base/init.sh b/Docker/root_path/base/init.sh similarity index 100% rename from Docker/base/init.sh rename to Docker/root_path/base/init.sh diff --git a/Docker/base/server_start.js b/Docker/root_path/base/server_start.js similarity index 100% rename from Docker/base/server_start.js rename to Docker/root_path/base/server_start.js diff --git a/Docker/base/setup_node.js b/Docker/root_path/base/setup_node.js similarity index 92% rename from Docker/base/setup_node.js rename to Docker/root_path/base/setup_node.js index 895c180..2fb2acd 100644 --- a/Docker/base/setup_node.js +++ b/Docker/root_path/base/setup_node.js @@ -24,6 +24,6 @@ else if (existsSync(join(bds.bds_dir_java, "server.jar"))) bds_software = true if (bds_software){ // ------------------------------ - /* Install version */if (process.env.BDS_REINSTALL === "true") bds.download(process.env.BDS_VERSION);/* Skipping */ else console.log("Skipping reinstallation") + /* Install version */if (process.env.BDS_REINSTALL === "true") bds.download("latest");/* Skipping */ else console.log("Skipping reinstallation") // ------------------------------ } else bds.download(process.env.BDS_VERSION) diff --git a/Docker/root_path/etc/nginx/sites-available/default b/Docker/root_path/etc/nginx/sites-available/default new file mode 100644 index 0000000..d68d360 --- /dev/null +++ b/Docker/root_path/etc/nginx/sites-available/default @@ -0,0 +1,21 @@ +server { + listen [::]:80 ipv6only=on; + listen 80; + server_name _; + location /api/log { + proxy_pass http://localhost:6565/; + } + location /api { + proxy_pass http://localhost:1932; + } + # + location /api/log/ { + proxy_pass http://localhost:6565/; + } + location /api/ { + proxy_pass http://localhost:1932; + } + location / { + root /html/ + } +} \ No newline at end of file diff --git a/Docker/root_path/html/README.md b/Docker/root_path/html/README.md new file mode 100644 index 0000000..fb1e5ea --- /dev/null +++ b/Docker/root_path/html/README.md @@ -0,0 +1,11 @@ +Controlling your Minecraft server straight from the web. + +### Attention + +This requires that Bds_Maneger_Api is running in a Docker pool with Image ``sirherobrine23/bdsmaneger:latest``, or your own computer with the nodejs and the API running. + +---- + +This page works with the Bds Maneger APIs. do not try with any other platform will not work. + +Your data is also not saved, everything that is requested will be saved a ``sessionStorage`` after leaving the tab everything will be deleted. diff --git a/Docker/root_path/html/assents/css/Minecraft.ttf b/Docker/root_path/html/assents/css/Minecraft.ttf new file mode 100644 index 0000000000000000000000000000000000000000..85c14725a3bf6d67aaf0f03292f9b763c1654f07 GIT binary patch literal 14488 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 Z*c*kN@$GAW{e3oGeYSI$CI24pe*xM150(G` literal 0 HcmV?d00001 diff --git a/Docker/root_path/html/assents/css/Mojang-Bold.ttf b/Docker/root_path/html/assents/css/Mojang-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc71ca356a3d957baec33ff0db0b941c65325ddb GIT binary patch literal 26528 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 |=GRZft5m}MJJm7?W%vOn3Pu8D{r)ghthDF#o zh4&1n`Rt&0cwB)%anV?~Fz@(~HMC7cDG{<)*2n4R37R7|w*f0?t3=!HP@Z6nl?scn zvB*5RfPW8F`>TYY$#uFXL|?=o(=I;GM@c1>4Mu;Cx1Y^(yzW)XG!e0m3uNdQYo}2I zibe7K2otmoatp8-Mx|wN1k1&#@iyAmUOi>|r@2?@89i29G**0s3*`W=#XMOgHS{*d zi6=WT3eTeQ(pkqKCkNt4^+X#;n}yapR{Ph_UU8Ifm3J zeed9Ne%-S|wCnjr-}8solUF>|s~(b*u=^}-yjL@rNlkQnp1=1jANCc3gjj^#$J$E& z9)c@gZ)n*UXE>EY9lK<@-%dFn%Cz27Kr?L0KJ9Sd)V#Oi=kt93S$Tf zwS*n4om@QWc}^&<=q0DgDd;UvCSqTd-o__Z#X*?a61Oz_I)>o{;waQ#Y+g$wSunRn6x{tP7pi z^nhc}Q=AW(^I!36B@ekLCn8YhZ=rn#enwE%pgCCTYD4s(8?&{4JK*z>q$+p?^Gh*^ zSD4f3;v>9xRp#N;2oCzQZ~b?|kzX>z;ik~Cj}r|q9bhBUFhit)u;&6U#=CNcf!l+{ zstGz`w8>j&@VbiQL|2bbRiLiGAw0Cf#0ZyK&u&ng&zJJdU|!s66C5=@(HD_&%gjJe zT;cDyW3|L!dOa@SlLr!#%0Pi8&ZTHedy0U#)fT5Aq#2!4_9~ZaxY{N zJ61WvRq9rCIaa0;m5!$7-iS5NHP2%*szoGn>V(Fw7A#%{i#QWp4*Y0cq!@GW*8L4p zIPXGi@m+rR-i*=%7CePc%mi%RdlR+On*TW$5vaaWNoE#fyw;ulhP(FqL;g&X8NHY86Aa^uV<_<3i`ZY|B11 z3IpdDf5poc7PgfcN|3XOd}~>((S^TLp(YDnDn`;QZ#~%HODzK%C3Cen%_B!0PQ{3t z8BqL&kU4I+r%;o$u%%R@0VCE2Ph?h9JeiAlgoF)nt$I%fw!6>umHr}}%cQpyq6o`R99x(nz_BomJFY%gAQumY+ zAZn2&*OJTy8{$wauC#R^J#E5DVM~%iPtBTp3pQP)@!#)A={Ux3A~KW6&zYd7P#$-H zV59XKel<7>dI>*Uy$WLJ?p@`?u6L~!25yEf*^Ml z`d6WU)pMX9o2>_?^^p4@V)Dy3gCM^F?S@y)uHFwqyAk>~zF@ZLJ`ngeL-*#F%&s{f zbSLO35csbB7zlW`Al_SkXm;Hs2>L#R@rRCpVCVWnAlSVDYd4_1@r!03z6gZ&CIdZY z_A8fy(B8ZqbR6`i*)7+B9t8pSudW4Q{Ufmdk)vi?H-J6`dd=)s;JNh)v)jOP8+f*@ z1pN-^RkQ6M2SLYn@cr6W5c0O;d=U6{0PpRR;gxsBwyX$5UTgd-L2HFn#6zC}EMYFqM|8D5L8!~qT`>w70H+KFXw+BBX literal 0 HcmV?d00001 diff --git a/Docker/root_path/html/assents/css/Mojang-Regular.ttf b/Docker/root_path/html/assents/css/Mojang-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..da89fa7833ce52a4eb156e039940648a6d162d8d GIT binary patch literal 28416 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 D!?Spp literal 0 HcmV?d00001 diff --git a/Docker/root_path/html/assents/css/check.css b/Docker/root_path/html/assents/css/check.css new file mode 100644 index 0000000..781cd10 --- /dev/null +++ b/Docker/root_path/html/assents/css/check.css @@ -0,0 +1,64 @@ +/* The switch - the box around the slider */ +.switch { + position: relative; + display: inline-block; + width: 33px; + height: 19px; + margin-right: 3.5px; + } + + /* Hide default HTML checkbox */ + .switch input { + opacity: 0; + width: 0; + height: 0; + } + + /* The slider */ + .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; + } + + .slider:before { + position: absolute; + content: ""; + height: 12px; + width: 12px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; + } + + input:checked + .slider { + background-color: #2196F3; + } + + input:focus + .slider { + box-shadow: 0 0 1px #2196F3; + } + + input:checked + .slider:before { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } + + /* Rounded sliders */ + .slider.round { + border-radius: 34px; + margin-left: 4px; + } + + .slider.round:before { + border-radius: 50%; + } \ No newline at end of file diff --git a/Docker/root_path/html/assents/css/complete.css b/Docker/root_path/html/assents/css/complete.css new file mode 100644 index 0000000..7929fea --- /dev/null +++ b/Docker/root_path/html/assents/css/complete.css @@ -0,0 +1,11 @@ +.svg_sucess { + --svg-color: #1fff1f; +} +.svg_erro { + --svg-color: red; +} + +.svg_color { + fill: var(--svg-color); + display: none; +} \ No newline at end of file diff --git a/Docker/root_path/html/assents/css/main.css b/Docker/root_path/html/assents/css/main.css new file mode 100644 index 0000000..0fe658e --- /dev/null +++ b/Docker/root_path/html/assents/css/main.css @@ -0,0 +1,253 @@ +@font-face { + font-family: minecraft; + src: url(Minecraft.ttf); +} +@font-face { + font-family: minecraft-bold; + src: url(Mojang-Bold.ttf); +} +@font-face { + font-family: minecraft-regular; + src: url(Mojang-Regular.ttf); +} + +*{ + font-family: "minecraft", "minecraft-bold", "minecraft-regular"; + color: var(--text-primary) +} + +.Log_div_Title { + text-align: center; + font-size: 4vh; + margin-bottom: 1.5vh; +} + +.bds_log{ + color: var(--text-secondary); + background-color: var(--bg-secondary); + font-family: minecraft; + font-size: 2.4vh !important; + border-radius: 2px; + min-width: 100%; + min-height: 100%; +} + +/* .bds_log{ + line-height: 4.5vh; +} */ + +fieldset{ + border-radius: 5px; + min-height: 100%; + min-width: 90%; +} + +input{ + color: var(--text-primary); + background-color: var(--bg-secondary); + font-size: 2.4vh; +} + +input[type="text"], input[type="number"], input[type="file"]{ + min-width: 90%; + max-width: 1%; +} + +.bds_aiptoken{ + border-radius: 12px; + margin-left: 6px; + height: 18px; + text-align: center; + width: 10rem; +} + +select{ + color: var(--text-primary); + background-color: var(--bg-secondary) +} +button{ + color: var(--text-primary); + background-color: var(--bg-secondary) +} +label,div{ + color: var(--text-primary); +} + +div,html{ + background-color: var(--bg-primary); +} + +:root { + /* font-size: 16px; */ + color: var(--text-primary); + --transition-speed: 600ms; +} + +.command_area { + height: 100%; + width: 80%; +} + +.command_send { + height: 100%; + font-size: 2.4vh; + margin-left: 1vh; +} + +.root{ + align-content: center; + display: flex; + justify-content: center; + margin-right: -1.3vh; +} + +.buttons { + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; +} + +.bds_service { + margin-top: 12px; + width: 10rem; + height: 90%; + border-color: var(--bg-secondary); + background-color: var(--bg-secondary); + text-align: center; + border-radius: 12rem; + cursor: pointer; +} +.space { + width: 10px; +} + +body { + color: var(--text-primary); + background-color: var(--bg-primary); + margin-right: 1rem; + /* margin-left: 0.5rem; */ + padding: 0; +} + + + +@media only screen and (min-height: 1000px) { + .bds_log { + height: 10rem; + } +} + +*::-webkit-scrollbar { +width: 0.45rem; +} +*::-webkit-scrollbar-track { +background: var(--bg-secondary); +} + +*::-webkit-scrollbar-thumb { + background: var(--text-primary); +} + +.dark { + --text-primary: #b6b6b6; + --text-secondary: #ececec; + --bg-primary: #23232e; + --bg-secondary: #141418; + --box-primary: rgba(0,0,0,0.4); + --border-color: rgba(255, 255, 255, 0.5); +} + +.light { + --text-primary: #1f1f1f; + --text-secondary: #000000; + --bg-primary: #ffffff; + --bg-secondary: #e4e4e4; + --box-primary: rgba(0,0,0,0.4); + --border-color: rgba(0,0,0,0.5); +} + +.system{ + --text-primary: #fff; + --text-secondary: #fff; + --bg-primary: #1d1d1d; + --bg-secondary: #3e3e3e; + --box-primary: rgba(0,0,0,0.4); + --border-color: rgba(0,0,0,0.5); +} + +.loading { + z-index: 1; + font-size: 3rem !important; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + min-height: 100vh; + /* ------------------------------------------------------- */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + padding-top: 10px; /* Location of the box */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + display: none; + cursor: progress; +} + +@media only screen and (max-width: 970px) { + .config_space { + margin-top: 15px; + display: block !important; + } +} +.config_space { + display: none; + background-color: var(--bg-secondary); +} +.config { + z-index: 1; + left: 0; + top: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: fixed; + padding-top: 10px; + width: 100%; + height: 100%; + overflow: auto; + background: rgba(124, 124, 124, 0.635); + display: none; +} +.config_conatainer { + border-radius: 0.5rem; + width: 90%; + height: 90%; + margin-left: 5%; + margin-right: 10; + margin-top: 1%; + background-color: var(--bg-secondary); +} +.config_root { + background: var(--bg-secondary); + background-color: var(--bg-secondary); + padding-left: 1vh; + padding-right: 4vh; + padding-top: 4vh; +} +.close { + float: right; + background-color: var(--bg-secondary); + color: var(--text-secondary); + margin-right: 12px; + margin-left: 12px; + margin-top: 12px; + border-radius: 1rem; + cursor: pointer; +} \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/cancelar.svg b/Docker/root_path/html/assents/image/cancelar.svg new file mode 100644 index 0000000..1aee3ee --- /dev/null +++ b/Docker/root_path/html/assents/image/cancelar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/confirm.svg b/Docker/root_path/html/assents/image/confirm.svg new file mode 100644 index 0000000..bfd2d71 --- /dev/null +++ b/Docker/root_path/html/assents/image/confirm.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/favicon.ico b/Docker/root_path/html/assents/image/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fca8e912c86b19f1b5cc604f1eb87a7c84acf219 GIT binary patch literal 58567 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Docker/root_path/html/assents/image/settings-24px.svg b/Docker/root_path/html/assents/image/settings-24px.svg new file mode 100644 index 0000000..e40c849 --- /dev/null +++ b/Docker/root_path/html/assents/image/settings-24px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/shopping_cart-24px.svg b/Docker/root_path/html/assents/image/shopping_cart-24px.svg new file mode 100644 index 0000000..81e8dcd --- /dev/null +++ b/Docker/root_path/html/assents/image/shopping_cart-24px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/text_snippet-24px.svg b/Docker/root_path/html/assents/image/text_snippet-24px.svg new file mode 100644 index 0000000..8de5950 --- /dev/null +++ b/Docker/root_path/html/assents/image/text_snippet-24px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Docker/root_path/html/assents/image/trip_origin-24px.svg b/Docker/root_path/html/assents/image/trip_origin-24px.svg new file mode 100644 index 0000000..561f848 --- /dev/null +++ b/Docker/root_path/html/assents/image/trip_origin-24px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Docker/root_path/html/assents/js/modal.js b/Docker/root_path/html/assents/js/modal.js new file mode 100644 index 0000000..4b26ef8 --- /dev/null +++ b/Docker/root_path/html/assents/js/modal.js @@ -0,0 +1,14 @@ +// Info Box +document.getElementById("InfoB").onclick = function() {document.getElementById("Info").style.display = "block";} +document.getElementsByClassName("infoclose")[0].onclick = function() {document.getElementById("Info").style.display = "none";} +window.onclick = function(event) {if (event.target == document.getElementById("Info")) {document.getElementById("Info").style.display = "none";}} + +// Config Modal +document.getElementById("configbuttom").onclick = function() {document.getElementById("configmodal").style.display = "block";} + document.getElementsByClassName("closeConfig")[0].onclick = function() {document.getElementById("configmodal").style.display = "none"} + window.onclick = function(event) {if (event.target == document.getElementById("configmodal")) {document.getElementById("configmodal").style.display = "none"} +} +// Give Item +// document.getElementById("giveMENU").onclick = function() {document.getElementById("GIVEM").style.display = "block"} +// document.getElementsByClassName("closeG")[0].onclick = function() {document.getElementById("GIVEM").style.display = "none"} +// window.onclick = function(event) {if (event.target == document.getElementById("GIVEM")) {document.getElementById("GIVEM").style.display = "none"}} diff --git a/Docker/root_path/html/assents/js/setting_server.js b/Docker/root_path/html/assents/js/setting_server.js new file mode 100644 index 0000000..f3e6c2e --- /dev/null +++ b/Docker/root_path/html/assents/js/setting_server.js @@ -0,0 +1,16 @@ +fetch(`http://${localStorage.getItem("bds_ip-remote")}:1932/configs`).then(response => response.json()).then(CONFIGS => { + document.getElementById('name') .value = CONFIGS.server_name; + document.getElementById('gameMode') .value = CONFIGS.gamemode; + document.getElementById('difficulty') .value = CONFIGS.difficulty; + document.getElementById('timeout_server').value = CONFIGS.player_idle_timeout; + document.getElementById('level_name') .value = CONFIGS.level_name; + document.getElementById('permissions') .value = CONFIGS.default_player_permission_level; + document.getElementById('max_pla') .value = CONFIGS.max_players + + // cheats + if (CONFIGS.allow_cheats == 'true'){document.getElementById('cheats').checked = true} else {document.getElementById('cheats').checked = false}; + // online mode + if (CONFIGS.online_mode == 'true'){document.getElementById('xbox').checked = true} else {document.getElementById('xbox').checked = false}; + // cheats + if (CONFIGS.white_list == 'true'){document.getElementById('whitelist').checked = true} else {document.getElementById('whitelist').checked = false}; +}) \ No newline at end of file diff --git a/Docker/root_path/html/index.html b/Docker/root_path/html/index.html new file mode 100644 index 0000000..6aedac9 --- /dev/null +++ b/Docker/root_path/html/index.html @@ -0,0 +1,128 @@ + + + + + + + + Bds Maneger Web + + + + + + + +
+
+ + + + + + +
+ +
Bds Maneger Log
+
+
+
+
+ + + +
+
+
Start
+
Stop
+
Restart
+
Settings and information
+
+
+ + + +
+
Wait .
+
Wait ..
+
Wait ...
+ +
\ No newline at end of file diff --git a/Docker/root_path/html/web_main.js b/Docker/root_path/html/web_main.js new file mode 100644 index 0000000..f9bff32 --- /dev/null +++ b/Docker/root_path/html/web_main.js @@ -0,0 +1,79 @@ +console.info("Welcome to Bds Maneger Web 2.0") +const token = (localStorage.getItem("the_token") || undefined), + andress = (localStorage.getItem("the_addr") || undefined), + port_log = (localStorage.getItem("the_log_port") || 6565), + port_REST = (localStorage.getItem("the_log_port") || 1932) + +if (andress){ + document.getElementById("bds_token").value = token + document.getElementById("bds_addr").value = andress + function basic_service (service){ + const post_men = { + "token": token, + "command": service + } + fetch(`http://${andress}:${port_REST}/service`,{ + method: "POST", + mode: "cors", + body: JSON.stringify(post_men), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + }).then(response => response.json()).then(lan => { + console.log(lan) + }) + } + function bds_start(){ + basic_service("start") + } + + function bds_stop (){ + basic_service("stop") + } + + function bds_restart(){ + let log = document.getElementById("bds_log").innerHTML + console.log("restart request") + if (!(log.includes("Quit correctly"))) bds_stop() + bds_start + } + function bds_command(){ + var post_men = { + "token": token, + "command": document.getElementById("command").value + }; + fetch(`http://${andress}:${port_REST}/bds_command`, { + method: "POST", + mode: "cors", + body: JSON.stringify(post_men), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + } + ).then(response => response.json()).then(lan => { + if (lan.status !== 200) {console.log(lan)} + else { + + } + }) + } + setInterval(() => { + fetch(`http://${andress}:${port_log}/?format=html`).then(response => response.text()).then(lan => { + document.getElementById("bds_log").innerHTML = lan + }).catch (function (err){null}); + }, 2 * 1000); +} else { + /* alert("Please set the Bds Maneger's ip or address, and the authorization token for some advanced features") + document.getElementById("config").style.display = "block" */ +} + +function settings_display(){ + const se_display = document.getElementById("config").style.display + if (se_display === "block"){ + document.getElementById("config").style.display = "none" + } else { + document.getElementById("config").style.display = "block" + } +} diff --git a/README.md b/README.md index 1cbf5e2..789b193 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,13 @@ For now we are in a version qualified for general use and implementations in com ## CI/CD status -[![CodeQL](https://github.com/Bds-Maneger/bds_maneger_api/workflows/CodeQL/badge.svg)](https://github.com/The-Bds-Maneger/core/actions/workflows/codeql-analysis.yml) [![Total alerts](https://img.shields.io/lgtm/alerts/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/alerts/) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/context:javascript) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/4d19af8fe5b146608a8f4a5e2092f66d)](https://www.codacy.com/gh/Bds-Maneger/bds_maneger_api/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Bds-Maneger/bds_maneger_api&utm_campaign=Badge_Grade) +[![CodeQL](https://github.com/Bds-Maneger/bds_maneger_api/workflows/CodeQL/badge.svg)](https://github.com/The-Bds-Maneger/core/actions/workflows/codeql-analysis.yml) [![Total alerts](https://img.shields.io/lgtm/alerts/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/alerts/) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/context:javascript) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/4d19af8fe5b146608a8f4a5e2092f66d)](https://www.codacy.com/gh/Bds-Maneger/bds_maneger_api/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Bds-Maneger/bds_maneger_api&utm_campaign=Badge_Grade) + +## Common Mistakes + +* On Windows if you are receiving any error from platform-tools, follow these [steps](https://github.com/nodejs/node-gyp#on-windows) and install [python](https://www.python.org/downloads/). + +* If you are using Branch main, there may be several errors and corrections may take time to arrive, I recommend using the Tags. ## Start the Bds Maneger Core docker server @@ -29,18 +35,12 @@ bdsmaneger/maneger:latest ## Azure Deploys -**Recommended to use a new resource group** +### *Recommended to use a new resource group* -### Microsoft Azure Container +#### Microsoft Azure Container [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FBds-Maneger%2FThe-Bds-Maneger-Docker%2Fmain%2Fazure%2FBdsMangerCore_docker.json) -### Microsoft Azure Virtual machine +#### Microsoft Azure Virtual machine [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FThe-Bds-Maneger%2FAzure_VMs%2Fmain%2Fdeploy.json) More Information Access the repository: [Azure VMs](https://github.com/The-Bds-Maneger/Azure_VMs) - -## Common Mistakes - -* ### On Windows if you are receiving any error from platform-tools, follow these [steps](https://github.com/nodejs/node-gyp#on-windows), and install [python](https://www.python.org/downloads/). - -* ### If you are using Branch main, there may be several errors and corrections may take time to arrive, I recommend using the Tags. diff --git a/docker_build_image.sh b/docker_build_image.sh deleted file mode 100644 index 0ff683b..0000000 --- a/docker_build_image.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -docker_image_name='thebdsmaneger/maneger' -docker build -f Docker/Dockerfile --tag ${docker_image_name} . && \ -echo "Run: \"docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}\"" \ No newline at end of file diff --git a/index.js b/index.js index 9726405..25e0ba3 100644 --- a/index.js +++ b/index.js @@ -213,7 +213,8 @@ module.exports.SERVER_URLs = SERVER_URLs // PHP Bins const PHPbinsUrl = JSON.parse(execSync("curl -sS \"https://raw.githubusercontent.com/The-Bds-Maneger/Raw_files/main/php_bin.json\"").toString()) module.exports.PHPbinsUrls = PHPbinsUrl -console.log(PHPbinsUrl); + +// PHP bins System availble in Json File const PHPurlNames = Object.getOwnPropertyNames(PHPbinsUrl) module.exports.PHPurlNames = PHPurlNames @@ -227,10 +228,9 @@ else default_platformConfig = "java" if (fs.existsSync(bds_config_file)){ bds_config = JSON.parse(fs.readFileSync(bds_config_file, "utf8")) if (bds_config.version !== current_version_bds_core){ - let ram_total = Math.trunc((require("os").freemem() / 1000 / 1000) - 212) - if (ram_total >= 1000) ram_total = ram_total - 1000 + if (bds_config.platform_version === undefined) bds_config.platform_version = {} - if (bds_config.bedrock_config === undefined) bds_config.bedrock_config = {} + // New Config JSon bds_config = { "version": current_version_bds_core, "bds_pages": (bds_config.bds_pages||"default"), @@ -242,13 +242,8 @@ if (fs.existsSync(bds_config_file)){ "bds_ban": (bds_config.bds_ban||["Steve", "Alex", "steve", "alex"]), "telegram_token": (bds_config.telegram_token||undefined), "Google_Drive_root_backup_id": (bds_config.Google_Drive_root_backup_id||undefined), - "telegram_admin": (bds_config.telegram_admin||["all_users"]), "java_config": { "max": ram_total - }, - "bedrock_config": { - "from": (bds_config.bedrock_config.from||"oficial"), // Use the official version provided by Mojang Studios AB - "url": (bds_config.bedrock_config.from||null) // JSON Array file with versions and download url } } fs.writeFileSync(bds_config_file, JSON.stringify(bds_config, null, 4)) diff --git a/package-lock.json b/package-lock.json index 7ad55cb..19f8dde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "@the-bds-maneger/core", - "version": "1.8.5.5", + "version": "1.8.6.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@the-bds-maneger/core", - "version": "1.8.5.5", + "version": "1.8.6.5", + "hasInstallScript": true, "license": "AGPL-3.0-or-later", "dependencies": { "adm-zip": "^0.5.1", diff --git a/package.json b/package.json index ea93699..2f3a667 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.8.6", + "version": "1.8.6.5", "description": "scripts to manage minecraft bedrock server", "private": false, "main": "index.js", diff --git a/scripts/basic_server.js b/scripts/basic_server.js index 28bf22b..d4f4a83 100644 --- a/scripts/basic_server.js +++ b/scripts/basic_server.js @@ -106,7 +106,10 @@ module.exports.start = () => { } else if (process.platform === "darwin") throw Error("We don't have MacOS support yet") else process.exit(210) } else if (plat === "java") { - if (require("command-exists").sync("java")) start_server = exec(`java -Xmx${bds.bds_config.java_config.max}M -Xms${bds.bds_config.java_config.max}M -jar server.jar nogui`, {cwd: bds.bds_dir_java}); + var ram_max = Math.trunc((require("os").freemem() / 1000 / 1000) - 212) + var ram_minimun = ram_max; + if (ram_max >= 1000) {ram_max = Math.trunc(ram_max / 10);ram_minimun = Math.trunc(ram_max / 50)} + if (require("command-exists").sync("java")) start_server = exec(`java -Xmx${ram_max}M -Xms${ram_minimun}M -jar server.jar nogui`, {cwd: bds.bds_dir_java}); else { if (bds.system == "windows"){ require("open")("http://docs.sirherobrine23.com/bds_maneger_api_java#Windows"); -- 2.45.2 From 11a4028c8956fe30a1777c99b1b832e358d3e454 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Sat, 10 Apr 2021 00:17:40 -0300 Subject: [PATCH 7/8] ultimate pocketmine push --- .dockerignore | 6 +- Docker.sh | 9 +- Docker/Dockerfile | 23 ++- Docker/root_path/base/server_start.js | 3 +- .../etc/nginx/conf.d/largerequest.conf | 1 + .../etc/nginx/sites-available/default | 9 +- .../root_path/etc/nginx/sites-enabled/default | 1 + Docker/root_path/html/index.html | 16 +- Docker/root_path/html/web_main.js | 138 ++++++++++-------- index.js | 54 ++----- package-lock.json | 75 +++++++++- package.json | 3 +- rest/api.js | 43 +++--- 13 files changed, 212 insertions(+), 169 deletions(-) create mode 100644 Docker/root_path/etc/nginx/conf.d/largerequest.conf create mode 120000 Docker/root_path/etc/nginx/sites-enabled/default diff --git a/.dockerignore b/.dockerignore index f0bf5c3..c2dbf71 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,5 @@ -node_modules/ +# node_modules/ Docker/ -!Docker/root_path \ No newline at end of file +!Docker/root_path +.git/ +Docker.sh \ No newline at end of file diff --git a/Docker.sh b/Docker.sh index 3e87696..195e357 100755 --- a/Docker.sh +++ b/Docker.sh @@ -1,10 +1,9 @@ #!/bin/bash docker_image_name='thebdsmaneger/maneger' -docker build -f Docker/Dockerfile --tag ${docker_image_name} . && { +docker build -f Docker/Dockerfile ${1} --tag ${docker_image_name} . && { echo "----------------------------------------------" - read -rp "Run Image? (Y/n) " -e -i "y" DockerRun - if [ "${DockerRun}" == "y" ];then docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}; - elif [ "${DockerRun}" == "Y" ];then docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}; - else echo "Run: \"docker run -ti --rm -P -v /tmp/bds:/home/bds ${1} ${docker_image_name}\""; + if [ -e "/tmp/start_image" ];then DockerRun="y"; else read -rp "Run Image? (Y/n) " -e -i "y" DockerRun;fi + if [ -e "/tmp/start_image" ] || [ "${DockerRun}" == "y" ] || [ "${DockerRun}" == "Y" ];then [ -e "/tmp/start_image" ]|| touch /tmp/start_image ; docker run -ti --rm -p 8887:80/tcp -p 19132/udp -p 19133/udp -v /tmp/bds:/home/bds ${2} ${docker_image_name}; + else echo "Run: \"docker run -ti --rm -p 8887:80 -p 19132/udp -p 19133/udp -v /tmp/bds:/home/bds ${2} ${docker_image_name}\""; fi } \ No newline at end of file diff --git a/Docker/Dockerfile b/Docker/Dockerfile index bf2e006..404727f 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -10,20 +10,29 @@ case $(uname -m) in "x86_64") echo "";; \ *) wget https://raw.githubusercontent.com/The-Bds-Maneger/Raw_files/main/linux_libries.zip -O /tmp/libries.zip && unzip /tmp/libries.zip -d / && rm -rfv /tmp/libries.zip ;; \ esac ;\ rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* /tmp/* && \ -mkdir -p /home/bds/ && rm -rfv /etc/nginx/sites-available/default +mkdir -p /home/bds/ && rm -rfv /etc/nginx/sites-*/default + +ENV \ +TELEGRAM_TOKEN="null" \ +DESCRIPTION="running Minecraft Bedrock Server on the docker by Bds Manager" \ +WORLD_NAME="Bds Maneger Docker" \ +GAMEMODE="survival" \ +DIFFICULTY="normal" \ +XBOX_ACCOUNT="false" \ +PLAYERS="13" \ +BDS_VERSION="latest" \ +SERVER="bedrock" \ +BDS_REINSTALL="true" \ +Docker_Debug_Script="false" +EXPOSE 80/tcp 19132/udp 19133/udp +ENV BDS_DOCKER_IMAGE="true" HOME="/home/bds/" # Copy Files COPY ./Docker/root_path/ / COPY ./ /opt/bdsCore/ RUN cd /opt/bdsCore/ && npm install --no-save -ENV TELEGRAM_TOKEN="null" DESCRIPTION="running Minecraft Bedrock Server on the docker by Bds Manager" \ -WORLD_NAME="Bds Maneger Docker" GAMEMODE="survival" DIFFICULTY="normal" XBOX_ACCOUNT="false" PLAYERS="13" \ -BDS_VERSION="latest" SERVER="bedrock" BDS_REINSTALL="true" Docker_Debug_Script="false" \ -ngrok_token="" RUN mkdir -p /home/bds/.config/bds_core -EXPOSE 80/tcp 19132/udp 19133/udp -ENV BDS_DOCKER_IMAGE="true" HOME="/home/bds/" # Entrypint WORKDIR /home/bds/ diff --git a/Docker/root_path/base/server_start.js b/Docker/root_path/base/server_start.js index c8f0867..4a9c950 100644 --- a/Docker/root_path/base/server_start.js +++ b/Docker/root_path/base/server_start.js @@ -1,10 +1,9 @@ const bds = require("/opt/bdsCore/index"); -// const {bds_dir} = require("/opt/bdsCore/index"); const { existsSync, readFileSync } = require("fs") const { resolve, join } = require("path") // Enable APIs -bds.api(); +bds.rest(); // Log function function output(dados){var out = dados; if (out.slice(-1) == "\n") out = out.slice(0, -1); console.log(out)} diff --git a/Docker/root_path/etc/nginx/conf.d/largerequest.conf b/Docker/root_path/etc/nginx/conf.d/largerequest.conf new file mode 100644 index 0000000..b2db3b9 --- /dev/null +++ b/Docker/root_path/etc/nginx/conf.d/largerequest.conf @@ -0,0 +1 @@ +client_max_body_size 512M; \ No newline at end of file diff --git a/Docker/root_path/etc/nginx/sites-available/default b/Docker/root_path/etc/nginx/sites-available/default index d68d360..3772ffe 100644 --- a/Docker/root_path/etc/nginx/sites-available/default +++ b/Docker/root_path/etc/nginx/sites-available/default @@ -2,20 +2,19 @@ server { listen [::]:80 ipv6only=on; listen 80; server_name _; + root /html; + index index.html; location /api/log { proxy_pass http://localhost:6565/; } location /api { - proxy_pass http://localhost:1932; + proxy_pass http://localhost:1932/; } # location /api/log/ { proxy_pass http://localhost:6565/; } location /api/ { - proxy_pass http://localhost:1932; - } - location / { - root /html/ + proxy_pass http://localhost:1932/; } } \ No newline at end of file diff --git a/Docker/root_path/etc/nginx/sites-enabled/default b/Docker/root_path/etc/nginx/sites-enabled/default new file mode 120000 index 0000000..ad35b83 --- /dev/null +++ b/Docker/root_path/etc/nginx/sites-enabled/default @@ -0,0 +1 @@ +/etc/nginx/sites-available/default \ No newline at end of file diff --git a/Docker/root_path/html/index.html b/Docker/root_path/html/index.html index 6aedac9..c6e88a9 100644 --- a/Docker/root_path/html/index.html +++ b/Docker/root_path/html/index.html @@ -71,21 +71,11 @@ }
- Bds Maneger REST port: -

Bds Maneger Log port:

-
-

- Bds Maneger address: - -

- Bds Maneger Token: + Bds Maneger Token:

-

+
- - +
diff --git a/Docker/root_path/html/web_main.js b/Docker/root_path/html/web_main.js index f9bff32..cc1f38f 100644 --- a/Docker/root_path/html/web_main.js +++ b/Docker/root_path/html/web_main.js @@ -1,79 +1,89 @@ console.info("Welcome to Bds Maneger Web 2.0") -const token = (localStorage.getItem("the_token") || undefined), - andress = (localStorage.getItem("the_addr") || undefined), - port_log = (localStorage.getItem("the_log_port") || 6565), - port_REST = (localStorage.getItem("the_log_port") || 1932) - -if (andress){ - document.getElementById("bds_token").value = token - document.getElementById("bds_addr").value = andress - function basic_service (service){ - const post_men = { +const token = (localStorage.getItem("the_token") || undefined) +document.getElementById("bds_token").value = token +function basic_service (service){ + fetch("/api/service",{ + method: "POST", + mode: "cors", + body: JSON.stringify({ "token": token, "command": service + }), + headers: { + "Accept": "application/json", + "Content-Type": "application/json" } - fetch(`http://${andress}:${port_REST}/service`,{ - method: "POST", - mode: "cors", - body: JSON.stringify(post_men), - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - }).then(response => response.json()).then(lan => { - console.log(lan) - }) - } - function bds_start(){ - basic_service("start") - } + }).then(response => response.json()).then(lan => { + console.log(lan) + }) +} +function bds_start(){return basic_service("start")} - function bds_stop (){ - basic_service("stop") - } +function bds_stop (){basic_service("stop")} - function bds_restart(){ - let log = document.getElementById("bds_log").innerHTML - console.log("restart request") - if (!(log.includes("Quit correctly"))) bds_stop() - bds_start - } - function bds_command(){ - var post_men = { +// eslint-disable-next-line no-unused-vars +function bds_restart(){ + let log = document.getElementById("bds_log").innerHTML + console.log("restart request") + if (!(log.includes("Quit correctly"))) bds_stop() + bds_start() +} + +// eslint-disable-next-line no-unused-vars +function bds_command(){ + fetch("/api/bds_command", { + method: "POST", + mode: "cors", + body: JSON.stringify({ "token": token, "command": document.getElementById("command").value - }; - fetch(`http://${andress}:${port_REST}/bds_command`, { - method: "POST", - mode: "cors", - body: JSON.stringify(post_men), - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } + }), + headers: { + "Accept": "application/json", + "Content-Type": "application/json" } - ).then(response => response.json()).then(lan => { - if (lan.status !== 200) {console.log(lan)} - else { - - } - }) } - setInterval(() => { - fetch(`http://${andress}:${port_log}/?format=html`).then(response => response.text()).then(lan => { - document.getElementById("bds_log").innerHTML = lan - }).catch (function (err){null}); - }, 2 * 1000); -} else { - /* alert("Please set the Bds Maneger's ip or address, and the authorization token for some advanced features") - document.getElementById("config").style.display = "block" */ + ).then(response => response.json()).then(lan => { + console.log(lan); + }) } +// eslint-disable-next-line no-unused-vars +function UploadWorld(){ + const input = document.getElementById("WorldUpload").files + const formData = new FormData(); + console.log(input); + formData.append(input[0].name, input[0]); + for(var pair of formData.entries()) { + console.log(pair[0]+ ", "+ JSON.stringify(pair[1])); + } + fetch("/api/upload_world", { + method: "POST", + headers: { + "Content-Type": "multipart/form-data", + "token": token + }, + body: input[0] + }).catch( + err => { + throw Error(err) + } + ) +} + +const logInterval = setInterval(() => { + fetch("/api/log?format=html").then(response => response.text()).then(lan => { + document.getElementById("bds_log").innerHTML = lan + }).catch (function (err){ + if (confirm("The server crashed or had an error, wants to reload the page")) location.reload(true) + else clearInterval(logInterval) + throw Error(err) + }); +}, 2 * 1000); + +// eslint-disable-next-line no-unused-vars function settings_display(){ const se_display = document.getElementById("config").style.display - if (se_display === "block"){ - document.getElementById("config").style.display = "none" - } else { - document.getElementById("config").style.display = "block" - } + if (se_display === "block") document.getElementById("config").style.display = "none" + else document.getElementById("config").style.display = "block" } diff --git a/index.js b/index.js index 25e0ba3..5cb56e9 100644 --- a/index.js +++ b/index.js @@ -58,6 +58,7 @@ if (process.platform == "win32") { "pocketmine": true, "java": true } + if (process.arch === "aarch64") valid_platform.pocketmine = false; } else if (process.platform == "darwin") { if (arch === "arm64") require("open")("https://github.com/The-Bds-Maneger/core/wiki/system_support#information-for-users-of-macbooks-and-imacs-with-m1-processor") else require("open")("https://github.com/The-Bds-Maneger/core/wiki/system_support#macos-with-intel-processors"); @@ -241,10 +242,7 @@ if (fs.existsSync(bds_config_file)){ }, "bds_ban": (bds_config.bds_ban||["Steve", "Alex", "steve", "alex"]), "telegram_token": (bds_config.telegram_token||undefined), - "Google_Drive_root_backup_id": (bds_config.Google_Drive_root_backup_id||undefined), - "java_config": { - "max": ram_total - } + "Google_Drive_root_backup_id": (bds_config.Google_Drive_root_backup_id||undefined) } fs.writeFileSync(bds_config_file, JSON.stringify(bds_config, null, 4)) bds_config_export() @@ -265,15 +263,7 @@ if (fs.existsSync(bds_config_file)){ "Google_Drive_root_backup_id": undefined, "telegram_admin": [ "all_users" - ], - "java_config": { - "max": ram_total - }, - // bedrock_config is not yet in use - "bedrock_config": { - "from": "oficial", // Bedrock Server software, such as the one provided by Mojang, lifeboat, pocketmine-mp. more information: https://github.com/The-Bds-Maneger/core/wiki/bedrock_software#minecraft-bedrock-servers - "url": undefined // JSON Array file with versions and download url - } + ] } fs.writeFileSync(bds_config_file, JSON.stringify(bds_config, null, 4)) } @@ -284,6 +274,11 @@ module.exports.platform_version_update = function (version){ fs.writeFileSync(bds_config_file, JSON.stringify(bds_config, null, 4)) bds_config_export() } + + +/** + * Save ID Google Drive folder to Backups + */ module.exports.save_google_id = function (id){ let bds_config = JSON.parse(fs.readFileSync(bds_config_file, "utf8")) bds_config.Google_Drive_root_backup_id = id @@ -292,39 +287,12 @@ module.exports.save_google_id = function (id){ return true } module.exports.platform = bds_config.bds_platform -function update_java_memory(total){ - if (total.includes("GB")) total = (total = Math.trunc(total / 1024)) - else if (total.includes("GIB")) total = (total = Math.trunc(total / 1000)) - else if (total.includes("gb")) total = (total = Math.trunc(total / 1024)) - else if (total.includes("gib")) total = (total = Math.trunc(total / 1000)) - else if (total.includes("MB")) total = (total = Math.trunc(total)) - else if (total.includes("mb")) total = (total = Math.trunc(total)) - else if (total.includes("mib")) total = (total = Math.trunc(total)) - else if (total.includes("MIB")) total = (total = Math.trunc(total)) - else throw new Error("Please enter a valid value such as: 1GB, 1gb, 1024mb ,1024MB, 1000MIB, 10000mib ,1GIB ,1gib") - if (bds_config.bds_platform === "java"){ - bds_config.java_config.max = - fs.writeFileSync(bds_config_file, JSON.stringify(bds_config, null, 4)) - } -} - -const log_file = path.join(log_dir, `${date()}_${bds_config.bds_platform}_Bds_log.log`); -module.exports.log_file = log_file /** - * Update the value of how much java will use ram when the java platform is selected - * - * the following values ​​are: 1024mb, 1024MB, 1000MIB, 1000mib, 1GB, 1gb, 1GIB, 1gib + * Bds Maneger Latest log file. */ -module.exports.memory_for_the_java = update_java_memory - -if (process.env.AUTOUPDATE_JAVA_RAM !== undefined||undefined){ - setInterval(() => { - let ram_total = Math.trunc((require("os").freemem() / 1000 / 1000) - 212) - if (ram_total >= 1000) ram_total = ram_total - 1000 - update_java_memory(ram_total+"mb") - }, 2500); -} +const log_file = path.join(log_dir, `${date()}_${bds_config.bds_platform}_Bds_log.log`); +module.exports.log_file = log_file function bds_config_export (){ /** diff --git a/package-lock.json b/package-lock.json index 0fff4b6..2c90ae1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@the-bds-maneger/core", - "version": "1.8.6.5", + "version": "1.8.6.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@the-bds-maneger/core", - "version": "1.8.6.5", + "version": "1.8.6.6", "hasInstallScript": true, "license": "AGPL-3.0-or-later", "dependencies": { @@ -16,6 +16,7 @@ "cors": "^2.8.5", "crypto": "^1.0.1", "express": "^4.17.1", + "express-fileupload": "^1.2.1", "express-rate-limit": "^5.2.3", "get-folder-size": "^2.0.1", "googleapis": "^71.0.0", @@ -483,6 +484,17 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "node_modules/busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "dependencies": { + "dicer": "0.3.0" + }, + "engines": { + "node": ">=4.5.0" + } + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -727,6 +739,17 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "node_modules/dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dependencies": { + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=4.5.0" + } + }, "node_modules/dijkstrajs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", @@ -1072,6 +1095,17 @@ "node": ">= 0.10.0" } }, + "node_modules/express-fileupload": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz", + "integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==", + "dependencies": { + "busboy": "^0.3.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/express-rate-limit": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.2.6.tgz", @@ -2493,6 +2527,14 @@ "node": ">= 0.6" } }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -3303,6 +3345,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "requires": { + "dicer": "0.3.0" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -3491,6 +3541,14 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, "dijkstrajs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", @@ -3762,6 +3820,14 @@ "vary": "~1.1.2" } }, + "express-fileupload": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz", + "integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==", + "requires": { + "busboy": "^0.3.1" + } + }, "express-rate-limit": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.2.6.tgz", @@ -4816,6 +4882,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", diff --git a/package.json b/package.json index 2f3a667..95c6167 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.8.6.5", + "version": "1.8.6.6", "description": "scripts to manage minecraft bedrock server", "private": false, "main": "index.js", @@ -50,6 +50,7 @@ "cors": "^2.8.5", "crypto": "^1.0.1", "express": "^4.17.1", + "express-fileupload": "^1.2.1", "express-rate-limit": "^5.2.3", "get-folder-size": "^2.0.1", "googleapis": "^71.0.0", diff --git a/rest/api.js b/rest/api.js index 7e2af6c..9aec441 100644 --- a/rest/api.js +++ b/rest/api.js @@ -6,17 +6,21 @@ var cors = require("cors"); const rateLimit = require("express-rate-limit"); const token_verify = require("./token_api_check") const bodyParser = require("body-parser"); +const fileUpload = require("express-fileupload"); function api(port_api){ const app = express(); - // Enable if you're behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc) + // Enable if you"re behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc) // see https://expressjs.com/en/guide/behind-proxies.html - // app.set('trust proxy', 1); + // app.set("trust proxy", 1); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 100 // limit each IP to 100 requests per windowMs }); + app.use(fileUpload({ + limits: { fileSize: 512 * 1024 } + })); app.use(cors()); app.use(bodyParser.json()); /* https://github.com/github/fetch/issues/323#issuecomment-331477498 */ app.use(bodyParser.urlencoded({ extended: true })); @@ -24,13 +28,6 @@ function api(port_api){ // app.get("/configs", (req, res) => {return res.send(bds.get_config());}); app.get("/info", (req, res) => { const config = bds.get_config() - var java; - if (bds.platform === "bedrock") java = {} - else java = { - java: { - "max_ram_memory": bds.bds_config.java_config.max - } - } var json_http = { "server": { "bds_config_version": bds.bds_config.version, @@ -40,7 +37,6 @@ function api(port_api){ "whitelist": config.white_list, "xbox": config.online_mode, "max_players": config.max_players, - ...java }, "running": bds.detect(), "bds_platform": bds.bds_plataform, @@ -136,23 +132,20 @@ function api(port_api){ "message": EMN }) }); - app.post("/bds_command", (req, res) => { - const body = req.body - var pass = token_verify(body.token) + app.post("/upload_world", (req, res) => { + var pass = token_verify(req.headers.token) if (pass){ - const command = body.command - const teste = bds.command(command) - res.send({ - "status": 200, - "command": body.command, - "log": teste, - "message": `authorized to ${body.token}` - }) + var fileWorld; + console.log(req.files); + if (!req.files || Object.keys(req.files).length === 0) return res.status(400).send("No files were uploaded."); + let files = Object.getOwnPropertyNames(req.files) + for (let file in files){ + fileWorld = req.files[files[file]]; + // Use the mv() method to place the file somewhere on your server + console.log(fileWorld.data); + } } else { - res.send({ - "status": 401, - "message": "not authorized" - }) + return res.status(400).send("Token is not valid!"); } }); const port = (port_api||1932) -- 2.45.2 From 16033ee873e6502b4a42a54dbbb89d8f912c3f12 Mon Sep 17 00:00:00 2001 From: Matheus sampaio Queiroga Date: Sat, 10 Apr 2021 00:23:06 -0300 Subject: [PATCH 8/8] Update .dockerignore --- .dockerignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index c2dbf71..57351dc 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,5 @@ -# node_modules/ +node_modules/ Docker/ !Docker/root_path .git/ -Docker.sh \ No newline at end of file +Docker.sh -- 2.45.2