Feat: Updating Mods button
This commit is contained in:
@ -186,3 +186,18 @@ export async function writeServerProperties(docker, containerName, content) {
|
|||||||
return { error: `Failed to write server.properties: ${error.message}` };
|
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}` };
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
import { URLSearchParams } from 'url';
|
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 { checkConnectionStatus, checkGeyserStatus, checkSftpStatus } from './status.js';
|
||||||
import { apiRequest } from './api.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);
|
response = client.user === 'Unknown' ? { error: 'User not identified' } : await readServerProperties(docker, client.user);
|
||||||
} else if (endpoint === '/server-properties' && method === 'POST' && body && body.content) {
|
} 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);
|
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 {
|
} else {
|
||||||
response = await apiRequest(endpoint, client.apiKey, method, body);
|
response = await apiRequest(endpoint, client.apiKey, method, body);
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,10 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
editPropertiesModal: document.getElementById('editPropertiesModal'),
|
editPropertiesModal: document.getElementById('editPropertiesModal'),
|
||||||
propertiesFields: document.getElementById('propertiesFields'),
|
propertiesFields: document.getElementById('propertiesFields'),
|
||||||
editPropertiesForm: document.getElementById('editPropertiesForm'),
|
editPropertiesForm: document.getElementById('editPropertiesForm'),
|
||||||
|
updateModsBtn: document.getElementById('updateModsBtn'),
|
||||||
|
updateModsModal: document.getElementById('updateModsModal'),
|
||||||
|
updateModsOutput: document.getElementById('updateModsOutput'),
|
||||||
|
closeUpdateModsBtn: document.getElementById('closeUpdateModsBtn'),
|
||||||
stopBtn: document.getElementById('stopBtn'),
|
stopBtn: document.getElementById('stopBtn'),
|
||||||
restartBtn: document.getElementById('restartBtn'),
|
restartBtn: document.getElementById('restartBtn'),
|
||||||
connectionStatus: document.getElementById('connectionStatus'),
|
connectionStatus: document.getElementById('connectionStatus'),
|
||||||
@ -371,6 +375,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
updateGeyserStatusUI(message);
|
updateGeyserStatusUI(message);
|
||||||
} else if (message.type === 'sftp-status') {
|
} else if (message.type === 'sftp-status') {
|
||||||
updateSftpStatusUI(message);
|
updateSftpStatusUI(message);
|
||||||
|
} else if (message.type === 'update-mods') {
|
||||||
|
updateModsUI(message);
|
||||||
} else {
|
} else {
|
||||||
updateNonDockerUI(message);
|
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 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 serverStatusSection = document.querySelector('.bg-gray-800.p-6.rounded-lg.shadow-lg.mb-6[data-section="server-status"]');
|
||||||
const editPropertiesBtn = elements.editPropertiesBtn;
|
const editPropertiesBtn = elements.editPropertiesBtn;
|
||||||
|
const updateModsBtn = elements.updateModsBtn;
|
||||||
const startBtn = document.getElementById('startBtn');
|
const startBtn = document.getElementById('startBtn');
|
||||||
const stopBtn = elements.stopBtn;
|
const stopBtn = elements.stopBtn;
|
||||||
const restartBtn = elements.restartBtn;
|
const restartBtn = elements.restartBtn;
|
||||||
@ -435,6 +442,9 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
if (editPropertiesBtn) {
|
if (editPropertiesBtn) {
|
||||||
editPropertiesBtn.classList.add('hidden');
|
editPropertiesBtn.classList.add('hidden');
|
||||||
}
|
}
|
||||||
|
if (updateModsBtn) {
|
||||||
|
updateModsBtn.classList.add('hidden');
|
||||||
|
}
|
||||||
if (stopBtn) {
|
if (stopBtn) {
|
||||||
stopBtn.disabled = true;
|
stopBtn.disabled = true;
|
||||||
stopBtn.classList.add('disabled-btn');
|
stopBtn.classList.add('disabled-btn');
|
||||||
@ -454,6 +464,9 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
if (editPropertiesBtn) {
|
if (editPropertiesBtn) {
|
||||||
editPropertiesBtn.classList.remove('hidden');
|
editPropertiesBtn.classList.remove('hidden');
|
||||||
}
|
}
|
||||||
|
if (updateModsBtn) {
|
||||||
|
updateModsBtn.classList.remove('hidden');
|
||||||
|
}
|
||||||
if (stopBtn) {
|
if (stopBtn) {
|
||||||
stopBtn.disabled = false;
|
stopBtn.disabled = false;
|
||||||
stopBtn.classList.remove('disabled-btn');
|
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) {
|
function updateNonDockerUI(message) {
|
||||||
if (message.error) {
|
if (message.error) {
|
||||||
if (message.error.includes('Missing token') || message.error.includes('HTTP 403')) {
|
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', () => {
|
elements.loginBtn.addEventListener('click', () => {
|
||||||
apiKey = elements.loginApiKey.value.trim();
|
apiKey = elements.loginApiKey.value.trim();
|
||||||
if (apiKey) {
|
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', () => {
|
document.getElementById('searchBtn').addEventListener('click', () => {
|
||||||
searchMods(1);
|
searchMods(1);
|
||||||
});
|
});
|
||||||
|
@ -86,6 +86,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="updateModsModal" class="modal hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-2 sm:p-4">
|
||||||
|
<div class="modal-content bg-gray-900 rounded-lg max-w-[95%] w-full sm:w-[90%] md:w-[85%] lg:w-[80%] mx-auto flex flex-col max-h-[95vh]">
|
||||||
|
<div class="flex justify-between items-center p-4 border-b">
|
||||||
|
<h2 class="text-xl font-semibold text-white">Mod Update Output</h2>
|
||||||
|
<button class="modal-close text-2xl font-bold text-white">×</button>
|
||||||
|
</div>
|
||||||
|
<pre id="updateModsOutput" class="flex-1 p-4 text-white text-sm max-h-[calc(95vh-10rem)] overflow-y-auto overflow-x-auto whitespace-pre-wrap break-words leading-relaxed"></pre>
|
||||||
|
<div class="p-4 border-t">
|
||||||
|
<button id="closeUpdateModsBtn" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded w-full">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<nav class="bg-gray-800 p-4 shadow-lg">
|
<nav class="bg-gray-800 p-4 shadow-lg">
|
||||||
<div class="container mx-auto flex justify-between items-center">
|
<div class="container mx-auto flex justify-between items-center">
|
||||||
<h1 class="text-2xl font-bold">My-MC Server Panel</h1>
|
<h1 class="text-2xl font-bold">My-MC Server Panel</h1>
|
||||||
@ -130,6 +143,8 @@
|
|||||||
<button id="editPropertiesBtn"
|
<button id="editPropertiesBtn"
|
||||||
class="bg-purple-600 hover:bg-purple-700 px-4 py-2 rounded control-btn w-full mt-2">Edit Server
|
class="bg-purple-600 hover:bg-purple-700 px-4 py-2 rounded control-btn w-full mt-2">Edit Server
|
||||||
Properties</button>
|
Properties</button>
|
||||||
|
<button id="updateModsBtn"
|
||||||
|
class="bg-purple-600 hover:bg-purple-700 px-4 py-2 rounded control-btn w-full mt-2">Update Mods</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user