From db0bcdd8acacde470841c193a0c50a06df75641c Mon Sep 17 00:00:00 2001 From: Aidan Date: Tue, 15 Apr 2025 00:06:40 -0400 Subject: [PATCH] feat: add better env checks, use debug mode, add config script and settings to webui, ignore built css, bump --- module/customize.sh | 25 +++- module/util/config.sh | 56 +++++++++ module/webroot/.gitignore | 3 +- module/webroot/package.json | 8 +- module/webroot/src/index.html | 72 ++++++++++- module/webroot/src/js/app.js | 219 +++++++++++++++++++++++++++++++++- 6 files changed, 370 insertions(+), 13 deletions(-) create mode 100755 module/util/config.sh diff --git a/module/customize.sh b/module/customize.sh index 9207f25..c140b87 100644 --- a/module/customize.sh +++ b/module/customize.sh @@ -1,6 +1,6 @@ ui_print "" ui_print "=== BEESRV ===" -ui_print "Version: $(grep_prop version $MODPATH/module.prop)" +ui_print "Version: $(grep_prop version $MODPATH/module.prop) ($(grep_prop versionCode $MODPATH/module.prop))" ui_print "Made with ❤️ by ihatenodejs" ui_print "===========================" ui_print "" @@ -37,6 +37,8 @@ mkdir -p /data/adb/beesrv config_modified=false if [ ! -f "/data/adb/beesrv/config.txt" ]; then echo "SERVER=" >> /data/adb/beesrv/config.txt + echo "EMAIL=" >> /data/adb/beesrv/config.txt + echo "DEBUG=false" >> /data/adb/beesrv/config.txt ui_print "[✔] Config created" ui_print "" else @@ -49,6 +51,20 @@ else config_modified=true fi + # Check EMAIL var + if ! grep -q "EMAIL=" /data/adb/beesrv/config.txt; then + ui_print "[i] EMAIL variable not found, adding..." + echo "EMAIL=" >> /data/adb/beesrv/config.txt + config_modified=true + fi + + # Check DEBUG var + if ! grep -q "DEBUG=" /data/adb/beesrv/config.txt; then + ui_print "[i] DEBUG variable not found, adding..." + echo "DEBUG=false" >> /data/adb/beesrv/config.txt + config_modified=true + fi + if [ "$config_modified" = true ]; then ui_print "[✔] Config modified successfully" ui_print "" @@ -58,6 +74,13 @@ else fi fi +# Set permissions for scripts +ui_print "[i] Setting permissions for scripts..." +chmod 755 $MODPATH/util/* +sleep 0.5 +ui_print "[✔] Permissions set" +ui_print "" + ui_print "== INSTALLATION COMPLETE! ==" ui_print "" ui_print "Join our Telegram channel: t.me/pontushub" diff --git a/module/util/config.sh b/module/util/config.sh new file mode 100755 index 0000000..c40d737 --- /dev/null +++ b/module/util/config.sh @@ -0,0 +1,56 @@ +function show_usage() { + echo "Usage: $0 [-e ] [-s ]" + echo "Options:" + echo " -e Email address" + echo " -s Server URL" + exit 1 +} + +function set_email() { + if [[ "$1" == "" ]]; then + echo "[ERROR] Email address is required when using -e" + show_usage + fi + + if ! grep -q "EMAIL=" /data/adb/beesrv/config.txt; then + echo "EMAIL=$1" >> /data/adb/beesrv/config.txt + else + sed -i "s/EMAIL=.*/EMAIL=$1/" /data/adb/beesrv/config.txt + fi + + echo "Success" +} + +function set_server() { + if [[ "$1" == "" ]]; then + echo "[ERROR] Server URL is required when using -s" + show_usage + fi + + if ! grep -q "SERVER=" /data/adb/beesrv/config.txt; then + echo "SERVER=$1" >> /data/adb/beesrv/config.txt + else + sed -i "s/SERVER=.*/SERVER=$1/" /data/adb/beesrv/config.txt + fi + + echo "Success" +} + +while getopts "e:s:" opt; do + case ${opt} in + e ) + set_email "$OPTARG" + ;; + s ) + set_server "$OPTARG" + ;; + \? ) + echo "[ERROR] Invalid option -$OPTARG" + show_usage + ;; + : ) + echo "[ERROR] Option -$OPTARG requires an argument" + show_usage + ;; + esac +done \ No newline at end of file diff --git a/module/webroot/.gitignore b/module/webroot/.gitignore index 867940f..4070cc9 100644 --- a/module/webroot/.gitignore +++ b/module/webroot/.gitignore @@ -2,4 +2,5 @@ dist/ node_modules/ package-lock.json -bun.lock* \ No newline at end of file +bun.lock* +src/css/style.css \ No newline at end of file diff --git a/module/webroot/package.json b/module/webroot/package.json index cbc3762..ce37aa2 100644 --- a/module/webroot/package.json +++ b/module/webroot/package.json @@ -1,5 +1,5 @@ { - "name": "parcel-vanilla-starter", + "name": "beesrv-webui", "private": true, "version": "0.0.0", "source": "src/index.html", @@ -9,15 +9,15 @@ "build:css:watch": "bunx @tailwindcss/cli -i ./src/css/style-pre.css -o ./src/css/style.css --watch" }, "dependencies": { - "@tailwindcss/cli": "^4.1.3", + "@tailwindcss/cli": "^4.1.4", "kernelsu": "^1.0.6", - "tailwindcss": "^4.1.3" + "tailwindcss": "^4.1.4" }, "devDependencies": { "buffer": "^6.0.3", "events": "^3.3.0", "os-browserify": "^0.3.0", - "parcel": "^2.14.0", + "parcel": "^2.14.4", "process": "^0.11.10", "util": "^0.12.5", "vm-browserify": "^1.1.2" diff --git a/module/webroot/src/index.html b/module/webroot/src/index.html index bf711af..70e9949 100644 --- a/module/webroot/src/index.html +++ b/module/webroot/src/index.html @@ -65,13 +65,65 @@ + + Debug Mode + + + + Loading... + + + + + + +

Configuration

+ + + + + + @@ -100,5 +152,17 @@

Made with ❤️ by ihatenodejs

+ + + diff --git a/module/webroot/src/js/app.js b/module/webroot/src/js/app.js index 2941a66..b442fb3 100644 --- a/module/webroot/src/js/app.js +++ b/module/webroot/src/js/app.js @@ -15,11 +15,51 @@ function hideError() { errorBox.classList.add("hidden") } +async function getDebugMode() { + const { errno, stdout } = await exec(`cat ${persist_dir}/config.txt`) + if (errno !== 0) { + showError("Failed to read debug mode") + return false + } + const debug = stdout.split("\n").find(line => line.startsWith("DEBUG=")) + if (!debug) { + return false + } + return debug.split("=")[1] === "true" +} + +async function getEmail() { + try { + const { errno, stdout, stderr } = await exec(`cat ${persist_dir}/config.txt`) + if (errno !== 0) { + if (await getDebugMode() !== true) { + showError("Failed to read email configuration") + } else { + showError(stderr) + } + return "Unknown" + } + const email = stdout.split("\n").find(line => line.startsWith("EMAIL=")) + if (!email) { + return "Not set" + } + return email.split("=")[1] + } catch (error) { + showError("Error reading email configuration") + return "Unknown" + } +} + + async function getVersion() { try { const { errno, stdout, stderr } = await exec(`cat ${modules_dir}/module.prop`) if (errno !== 0) { - showError("Failed to read module version") + if (await getDebugMode() !== true) { + showError("Failed to read module version") + } else { + showError(stderr) + } return "Unknown" } const version = stdout.split("\n").find(line => line.startsWith("version=")) @@ -38,7 +78,11 @@ async function getServer() { try { const { errno, stdout, stderr } = await exec(`cat ${persist_dir}/config.txt`) if (errno !== 0) { - showError("Failed to read server configuration") + if (await getDebugMode() !== true) { + showError("Failed to read server configuration") + } else { + showError(stderr) + } return "Unknown" } const server = stdout.split("\n").find(line => line.startsWith("SERVER=")) @@ -72,25 +116,194 @@ async function checkConnection() { } } +async function setEmail(email) { + try { + const { errno, stderr } = await exec(`${modules_dir}/util/config.sh -e "${email.replace(/['"]/g, '')}"`) + if (errno !== 0) { + if (await getDebugMode() !== true) { + showError("Failed to update email configuration") + } else { + showError(stderr) + } + return false + } + return true + } catch (error) { + if (await getDebugMode() !== true) { + showError("Error updating email configuration") + } else { + showError(error) + } + return false + } +} + +async function setServer(server) { + try { + const { errno, stderr } = await exec(`${modules_dir}/util/config.sh -s "${server.replace(/['"]/g, '')}"`) + if (errno !== 0) { + if (await getDebugMode() !== true) { + showError("Failed to update server configuration") + } else { + showError(stderr) + } + return false + } + return true + } catch (error) { + if (await getDebugMode() !== true) { + showError("Error updating server configuration") + } else { + showError(error) + } + return false + } +} + document.addEventListener("DOMContentLoaded", async () => { const versionText = document.getElementById("versionText") const serverText = document.getElementById("serverText") + const emailText = document.getElementById("emailText") + const debugText = document.getElementById("debugText") const versionLoader = document.getElementById("versionLoader") const serverLoader = document.getElementById("serverLoader") + const emailLoader = document.getElementById("emailLoader") + const debugLoader = document.getElementById("debugLoader") + const emailInput = document.getElementById("emailInput") + const serverInput = document.getElementById("serverInput") + const editEmailBtn = document.getElementById("editEmailBtn") + const editServerBtn = document.getElementById("editServerBtn") + const saveEmailBtn = document.getElementById("saveEmailBtn") + const saveServerBtn = document.getElementById("saveServerBtn") + const cancelEmailBtn = document.getElementById("cancelEmailBtn") + const cancelServerBtn = document.getElementById("cancelServerBtn") + + // Server editing + function startServerEditing() { + serverText.classList.add("hidden") + serverInput.classList.remove("hidden") + editServerBtn.classList.add("hidden") + saveServerBtn.classList.remove("hidden") + cancelServerBtn.classList.remove("hidden") + serverInput.value = serverText.textContent + serverInput.focus() + } + + function stopServerEditing() { + serverText.classList.remove("hidden") + serverInput.classList.add("hidden") + editServerBtn.classList.remove("hidden") + saveServerBtn.classList.add("hidden") + cancelServerBtn.classList.add("hidden") + } + + editServerBtn.addEventListener("click", startServerEditing) + + cancelServerBtn.addEventListener("click", stopServerEditing) + + saveServerBtn.addEventListener("click", async () => { + const newServer = serverInput.value.trim() + if (!newServer) { + showError("Server URL cannot be empty") + return + } + + serverLoader.classList.remove("hidden") + serverText.textContent = "Saving..." + stopServerEditing() + + const success = await setServer(newServer) + if (success) { + serverText.textContent = newServer + } else { + serverText.textContent = "Error" + } + serverLoader.classList.add("hidden") + }) + + // Handle enter button for server input + serverInput.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + saveServerBtn.click() + } else if (event.key === "Escape") { + cancelServerBtn.click() + } + }) + + // Email editing + function startEditing() { + emailText.classList.add("hidden") + emailInput.classList.remove("hidden") + editEmailBtn.classList.add("hidden") + saveEmailBtn.classList.remove("hidden") + cancelEmailBtn.classList.remove("hidden") + emailInput.value = emailText.textContent + emailInput.focus() + } + + function stopEditing() { + emailText.classList.remove("hidden") + emailInput.classList.add("hidden") + editEmailBtn.classList.remove("hidden") + saveEmailBtn.classList.add("hidden") + cancelEmailBtn.classList.add("hidden") + } + + editEmailBtn.addEventListener("click", startEditing) + + cancelEmailBtn.addEventListener("click", stopEditing) + + saveEmailBtn.addEventListener("click", async () => { + const newEmail = emailInput.value.trim() + if (!newEmail) { + showError("Email cannot be empty") + return + } + + emailLoader.classList.remove("hidden") + emailText.textContent = "Saving..." + stopEditing() + + const success = await setEmail(newEmail) + if (success) { + emailText.textContent = newEmail + } else { + emailText.textContent = "Error" + } + emailLoader.classList.add("hidden") + }) + + // Handle enter button for email input + emailInput.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + saveEmailBtn.click() + } else if (event.key === "Escape") { + cancelEmailBtn.click() + } + }) try { const version = await getVersion() const server = await getServer() - + const email = await getEmail() + const debug = await getDebugMode() versionLoader.classList.add("hidden") serverLoader.classList.add("hidden") + emailLoader.classList.add("hidden") + debugLoader.classList.add("hidden") versionText.textContent = version serverText.textContent = server + emailText.textContent = email + debugText.textContent = debug ? "Enabled" : "Disabled" } catch (error) { versionLoader.classList.add("hidden") serverLoader.classList.add("hidden") + emailLoader.classList.add("hidden") + debugLoader.classList.add("hidden") versionText.textContent = "Error" serverText.textContent = "Error" + emailText.textContent = "Error" + debugText.textContent = "Error" } const checkConnectionBtn = document.getElementById("checkConnection")
Server - - - Loading... - +
+ + + Loading... + +
+ + + + +
+
+
Email +
+ + + Loading... + +
+ + + + +
+