diff --git a/src/server/mind_server.js b/src/server/mind_server.js index f18299f..165cb01 100644 --- a/src/server/mind_server.js +++ b/src/server/mind_server.js @@ -4,6 +4,7 @@ import http from 'http'; import path from 'path'; import { fileURLToPath } from 'url'; import settings, { updateSettings } from '../../settings.js'; +import fs from 'fs'; // Module-level variables let io; @@ -132,11 +133,24 @@ export function createMindServer(port = 8080) { socket.on('get-settings', (callback) => { callback(settings); - }) + }); socket.on('update-settings', (newSettings) => { updateSettings(newSettings); - }) + }); + + socket.on('get-profile-dir', (callback) => { + const profileDir = path.join(__dirname, '../../profiles/'); + fs.readdir(profileDir, (err, files) => { + if (err) { + console.error("Could not list the profiles.", err); + callback([]); + } + + const fileNames = files.filter(file => file.endsWith('.json')).map(file => './profiles/' + file); + callback(fileNames); + }); + }); }); server.listen(port, 'localhost', () => { diff --git a/src/server/public/index.html b/src/server/public/index.html index 090a5c7..4343abf 100644 --- a/src/server/public/index.html +++ b/src/server/public/index.html @@ -1,9 +1,11 @@ - + Mindcraft + +

Mindcraft

@@ -181,6 +183,14 @@ socket.emit('send-message', agentName, message) } + let pathProfiles; + function getProfilesFromPath() { + socket.emit('get-profile-dir', (response) => { + pathProfiles = response; + console.log(response); + }) + } + function toggleSettings() { document.getElementById("settingsContainer").style.display = document.getElementById("settingsContainer").style.display === "none" ? "block" : "none"; document.getElementById("settingsToggler").innerText = document.getElementById("settingsToggler").innerText === "Show Settings" ? "Hide Settings" : "Show Settings"; @@ -200,11 +210,37 @@ socket.emit('update-settings', newSettings); } - function updateListItem(listId, listContent) { - document.getElementById(listId).innerHTML = ""; - listContent.forEach(element => { - addProfileItem(listId, element); - }); + function updateListItem(listId, listContent, enabled = true, clear = true) { + if (clear) { + document.getElementById(listId).innerHTML = ""; + listContent.forEach(element => { + addProfileItem(listId, element, enabled); + }); + } else { + const list = document.getElementById(listId); + const existingItemsDivs = document.querySelectorAll(`#${listId} .list-item`); + let existingItems = Array.from(existingItemsDivs) + .map(item => item.querySelector('input[type="text"]').value); + listContent.forEach(element => { + if (existingItems.includes(element)) { + const item = Array.from(list.querySelectorAll('.list-item')) + .find(item => item.querySelector('input[type="text"]').value === element); + if (item) { + console.log(`Setting this to ${enabled}: `) + const checkbox = item.querySelector('input[type="checkbox"]'); + console.log(checkbox) + console.log(checkbox.checked) + checkbox.checked = enabled; + console.log("After: ") + console.log(checkbox.checked) + } else { + addProfileItem(listId, element, enabled); + } + } else { + addProfileItem(listId, element, enabled); + } + }) + } } function updateBooleanRadio(radioName, value) { @@ -240,9 +276,21 @@ updateBooleanRadio("mcChatBotMessages", settings["chat_bot_messages"]); // array/list fields - updateListItem("mcProfileList", settings["profiles"]); updateListItem("mcBlockedActions", settings["blocked_actions"]); updateListItem("mcOnlyChatWith", settings["only_chat_with"]); + + // handling profiles is special + updateListItem("mcProfileList", settings["profiles"]); + pathProfiles = undefined; + getProfilesFromPath(); + const intervalId = setInterval(() => { + if (pathProfiles !== undefined) { + clearInterval(intervalId); + updateListItem("mcProfileList", pathProfiles, enabled=false); + } + }, 50); + updateListItem("mcProfileList", settings["profiles"], enabled=true, clear = false); + console.log(`updated with ${settings["profiles"]}`); } function getNewSettings() { @@ -276,7 +324,7 @@ return settings; } - function addProfileItem(listName, itemNameArg) { + function addProfileItem(listName, itemNameArg, enabled) { const itemDiv = document.createElement('div'); itemDiv.className = 'list-item'; @@ -287,7 +335,12 @@ const itemCheckbox = document.createElement('input'); itemCheckbox.type = 'checkbox'; - itemCheckbox.checked = true; + itemCheckbox.checked = enabled; + if (itemCheckbox.checked) { + itemName.classList.remove('not-selected'); + } else { + itemName.classList.add('not-selected'); + } itemCheckbox.onchange = function() { if (itemCheckbox.checked) { itemName.classList.remove('not-selected');