From d2498c0cf85905118075165f1bf07423ef017cba Mon Sep 17 00:00:00 2001 From: MCHost Date: Thu, 19 Jun 2025 01:39:33 -0400 Subject: [PATCH] Feat: Updating Mods button --- includes/docker.js | 15 ++++++++++++ includes/websocket.js | 4 +++- public/app.js | 56 +++++++++++++++++++++++++++++++++++++++++++ public/index.html | 15 ++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/includes/docker.js b/includes/docker.js index d33e417..403d1bc 100644 --- a/includes/docker.js +++ b/includes/docker.js @@ -185,4 +185,19 @@ export async function writeServerProperties(docker, containerName, content) { } catch (error) { return { error: `Failed to write server.properties: ${error.message}` }; } +} + +export async function updateMods(docker, containerName) { + try { + const container = docker.getContainer(containerName); + const inspect = await container.inspect(); + if (inspect.State.Status !== 'running') { + return { error: `Container ${containerName} is not running` }; + } + const { stdout, stderr } = await execPromise(`docker exec ${containerName} bash -c 'cd /home/mc/minecraft && mod-manager update'`); + if (stderr) return { output: stderr }; + return { output: stdout || 'Mod update completed successfully.' }; + } catch (error) { + return { error: `Failed to update mods: ${error.message}` }; + } } \ No newline at end of file diff --git a/includes/websocket.js b/includes/websocket.js index 3fc5099..8a01fc9 100644 --- a/includes/websocket.js +++ b/includes/websocket.js @@ -1,5 +1,5 @@ import { URLSearchParams } from 'url'; -import { getContainerStats, streamContainerLogs, readServerProperties, writeServerProperties } from './docker.js'; +import { getContainerStats, streamContainerLogs, readServerProperties, writeServerProperties, updateMods } from './docker.js'; import { checkConnectionStatus, checkGeyserStatus, checkSftpStatus } from './status.js'; import { apiRequest } from './api.js'; @@ -481,6 +481,8 @@ export function handleWebSocket(ws, req, docker) { response = client.user === 'Unknown' ? { error: 'User not identified' } : await readServerProperties(docker, client.user); } else if (endpoint === '/server-properties' && method === 'POST' && body && body.content) { response = client.user === 'Unknown' ? { error: 'User not identified' } : await writeServerProperties(docker, client.user, body.content); + } else if (endpoint === '/update-mods' && method === 'POST') { + response = client.user === 'Unknown' ? { error: 'User not identified' } : await updateMods(docker, client.user); } else { response = await apiRequest(endpoint, client.apiKey, method, body); } diff --git a/public/app.js b/public/app.js index 25d53d7..5547d5b 100644 --- a/public/app.js +++ b/public/app.js @@ -70,6 +70,10 @@ document.addEventListener('DOMContentLoaded', () => { editPropertiesModal: document.getElementById('editPropertiesModal'), propertiesFields: document.getElementById('propertiesFields'), editPropertiesForm: document.getElementById('editPropertiesForm'), + updateModsBtn: document.getElementById('updateModsBtn'), + updateModsModal: document.getElementById('updateModsModal'), + updateModsOutput: document.getElementById('updateModsOutput'), + closeUpdateModsBtn: document.getElementById('closeUpdateModsBtn'), stopBtn: document.getElementById('stopBtn'), restartBtn: document.getElementById('restartBtn'), connectionStatus: document.getElementById('connectionStatus'), @@ -371,6 +375,8 @@ document.addEventListener('DOMContentLoaded', () => { updateGeyserStatusUI(message); } else if (message.type === 'sftp-status') { updateSftpStatusUI(message); + } else if (message.type === 'update-mods') { + updateModsUI(message); } else { updateNonDockerUI(message); } @@ -412,6 +418,7 @@ document.addEventListener('DOMContentLoaded', () => { const sections = document.querySelectorAll('.bg-gray-800.p-6.rounded-lg.shadow-lg.mb-6'); const serverStatusSection = document.querySelector('.bg-gray-800.p-6.rounded-lg.shadow-lg.mb-6[data-section="server-status"]'); const editPropertiesBtn = elements.editPropertiesBtn; + const updateModsBtn = elements.updateModsBtn; const startBtn = document.getElementById('startBtn'); const stopBtn = elements.stopBtn; const restartBtn = elements.restartBtn; @@ -435,6 +442,9 @@ document.addEventListener('DOMContentLoaded', () => { if (editPropertiesBtn) { editPropertiesBtn.classList.add('hidden'); } + if (updateModsBtn) { + updateModsBtn.classList.add('hidden'); + } if (stopBtn) { stopBtn.disabled = true; stopBtn.classList.add('disabled-btn'); @@ -454,6 +464,9 @@ document.addEventListener('DOMContentLoaded', () => { if (editPropertiesBtn) { editPropertiesBtn.classList.remove('hidden'); } + if (updateModsBtn) { + updateModsBtn.classList.remove('hidden'); + } if (stopBtn) { stopBtn.disabled = false; stopBtn.classList.remove('disabled-btn'); @@ -520,6 +533,15 @@ document.addEventListener('DOMContentLoaded', () => { } } + function updateModsUI(message) { + if (message.error) { + elements.updateModsOutput.textContent = `Error: ${message.error}`; + } else if (message.output) { + elements.updateModsOutput.textContent = message.output; + } + elements.updateModsModal.classList.remove('hidden'); + } + function updateNonDockerUI(message) { if (message.error) { if (message.error.includes('Missing token') || message.error.includes('HTTP 403')) { @@ -1214,6 +1236,28 @@ document.addEventListener('DOMContentLoaded', () => { } } + async function updateMods() { + try { + const response = await wsRequest('/update-mods', 'POST'); + console.log('Raw response:', response); // Debug: Log the full response + console.log('Output content:', response.output); // Debug: Log the output string + if (response.error) { + showNotification(`Failed to update mods: ${response.error}`, 'error'); + elements.updateModsOutput.textContent = `Error: ${response.error}`; + } else { + const output = response.output || 'No output from mod update.'; + console.log('Processed output:', output); // Debug: Log the final output + elements.updateModsOutput.textContent = output; // Set textContent + } + elements.updateModsModal.classList.remove('hidden'); + } catch (error) { + console.error('Update mods error:', error); + showNotification(`Failed to update mods: ${error.message}`, 'error'); + elements.updateModsOutput.textContent = `Error: ${error.message}`; + elements.updateModsModal.classList.remove('hidden'); + } + } + elements.loginBtn.addEventListener('click', () => { apiKey = elements.loginApiKey.value.trim(); if (apiKey) { @@ -1322,6 +1366,18 @@ document.addEventListener('DOMContentLoaded', () => { } }); + elements.updateModsBtn.addEventListener('click', updateMods); + + elements.closeUpdateModsBtn.addEventListener('click', () => { + elements.updateModsModal.classList.add('hidden'); + elements.updateModsOutput.textContent = ''; + }); + + elements.updateModsModal.querySelector('.modal-close').addEventListener('click', () => { + elements.updateModsModal.classList.add('hidden'); + elements.updateModsOutput.textContent = ''; + }); + document.getElementById('searchBtn').addEventListener('click', () => { searchMods(1); }); diff --git a/public/index.html b/public/index.html index 64f7cd7..09ee036 100644 --- a/public/index.html +++ b/public/index.html @@ -85,6 +85,19 @@ + +