diff --git a/config.conf b/config.conf index 25d278e14..e1882fbff 100644 --- a/config.conf +++ b/config.conf @@ -3,7 +3,8 @@ const port = 8000; const whitelist = ['127.0.0.1']; //Example for add several IP in whitelist: ['127.0.0.1', '192.168.0.10'] const whitelistMode = false; //Disabling enabling the ip whitelist mode. true/false const autorun = true; //Autorun in the browser. true/false +const enableExtensions = true; //Enables support for TavernAI-extras project module.exports = { - port, whitelist, whitelistMode, autorun + port, whitelist, whitelistMode, autorun, enableExtensions, }; diff --git a/public/index.html b/public/index.html index 7f6368cee..8fe7e122f 100644 --- a/public/index.html +++ b/public/index.html @@ -33,7 +33,9 @@ Tavern.AI @@ -4921,6 +4954,5 @@ - diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index 7e32869cb..4a1b73c98 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -1,190 +1,205 @@ -const settings_html = ` -
-
-

Extensions

- -
- -

Auto-connect

-
-
Not connected
-
-

Active extensions

- -
-
-`; - -const settings_style = ` - -`; - -const urlKey = 'extensions_url'; -const autoConnectKey = 'extensions_autoconnect'; -const defaultUrl = "http://localhost:5100"; -let connectedToApi = false; +const extensions_urlKey = 'extensions_url'; +const extensions_autoConnectKey = 'extensions_autoconnect'; let extensions = []; -async function connectClickHandler() { - const baseUrl = $("#extensions_url").val(); - localStorage.setItem(urlKey, baseUrl); - await connectToApi(baseUrl); -} +(function () { + const settings_html = ` +
+
+

Extensions

+ +
+ + +

Auto-connect

+
+
Not connected
+
+

Active extensions

+ +
+
+ `; -function autoConnectInputHandler() { - const value = $(this).prop('checked'); - localStorage.setItem(autoConnectKey, value.toString()); - - if (value && !connectedToApi) { - $("#extensions_connect").trigger('click'); + const settings_style = ` + + `; -async function connectToApi(baseUrl) { - const url = new URL(baseUrl); - url.pathname = '/api/extensions'; + const defaultUrl = "http://localhost:5100"; + let connectedToApi = false; - try { - const getExtensionsResult = await fetch(url, { method: 'GET' }); + async function connectClickHandler() { + const baseUrl = $("#extensions_url").val(); + localStorage.setItem(extensions_urlKey, baseUrl); + await connectToApi(baseUrl); + } - if (getExtensionsResult.ok) { - const data = await getExtensionsResult.json(); - extensions = data.extensions; - applyExtensions(baseUrl); + function autoConnectInputHandler() { + const value = $(this).prop('checked'); + localStorage.setItem(extensions_autoConnectKey, value.toString()); + + if (value && !connectedToApi) { + $("#extensions_connect").trigger('click'); } - - updateStatus(getExtensionsResult.ok); } - catch { - updateStatus(false); + + async function connectToApi(baseUrl) { + const url = new URL(baseUrl); + url.pathname = '/api/extensions'; + + try { + const getExtensionsResult = await fetch(url, { method: 'GET' }); + + if (getExtensionsResult.ok) { + const data = await getExtensionsResult.json(); + extensions = data.extensions; + applyExtensions(baseUrl); + } + + updateStatus(getExtensionsResult.ok); + } + catch { + updateStatus(false); + } } -} -function updateStatus(success) { - connectedToApi = success; - const _text = success ? 'Connected to API' : 'Could not connect to API'; - const _class = success ? 'success' : 'failure'; - $('#extensions_status').text(_text); - $('#extensions_status').attr('class', _class); + function updateStatus(success) { + connectedToApi = success; + const _text = success ? 'Connected to API' : 'Could not connect to API'; + const _class = success ? 'success' : 'failure'; + $('#extensions_status').text(_text); + $('#extensions_status').attr('class', _class); - if (success && extensions.length) { - $('#extensions_loaded').show(200); - $('#extensions_list').empty(); + if (success && extensions.length) { + $('#extensions_loaded').show(200); + $('#extensions_list').empty(); + + for (let extension of extensions) { + $('#extensions_list').append(`
  • ${extension.metadata.display_name}
  • `); + } + } + else { + $('#extensions_loaded').hide(200); + $('#extensions_list').empty(); + } + } + + function applyExtensions(baseUrl) { + const url = new URL(baseUrl); + + if (!Array.isArray(extensions) || extensions.length === 0) { + return; + } for (let extension of extensions) { - $('#extensions_list').append(`
  • ${extension.metadata.display_name}
  • `); + addExtensionStyle(extension); + addExtensionScript(extension); } - } - else { - $('#extensions_loaded').hide(200); - $('#extensions_list').empty(); - } -} -function applyExtensions(baseUrl) { - const url = new URL(baseUrl); + function addExtensionStyle(extension) { + if (extension.metadata.css) { + url.pathname = `/api/style/${extension.name}`; + const href = url.toString(); - if (!Array.isArray(extensions) || extensions.length === 0) { - return; - } - - for (let extension of extensions) { - if (extension.metadata.js) { - url.pathname = `/api/script/${extension.name}`; - const src = url.toString(); - - if ($(`script[src="${src}"]`).length === 0) { - const script = document.createElement('script'); - script.type = 'module'; - script.src = src; - $('body').append(script); + if ($(`link[href="${href}"]`).length === 0) { + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = href; + $('head').append(link); + } } - } - if (extension.metadata.css) { - url.pathname = `/api/style/${extension.name}`; - const href = url.toString(); + function addExtensionScript(extension) { + if (extension.metadata.js) { + url.pathname = `/api/script/${extension.name}`; + const src = url.toString(); - if ($(`link[href="${href}"]`).length === 0) { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.type = 'text/css'; - link.href = href; - $('head').append(link); + if ($(`script[src="${src}"]`).length === 0) { + const script = document.createElement('script'); + script.type = 'module'; + script.src = src; + $('body').append(script); + } } } } -} -$(document).ready(async function () { - const url = localStorage.getItem(urlKey) ?? defaultUrl; - const autoConnect = Boolean(localStorage.getItem(autoConnectKey)) ?? false; - $('#rm_api_block').append(settings_html); - $('head').append(settings_style); - $("#extensions_url").val(url); - $("#extensions_connect").on('click', connectClickHandler); - $("#extensions_autoconnect").on('input', autoConnectInputHandler); - $("#extensions_autoconnect").prop('checked', autoConnect).trigger('input'); -}); \ No newline at end of file + $(document).ready(async function () { + const url = localStorage.getItem(extensions_urlKey) ?? defaultUrl; + const autoConnect = Boolean(localStorage.getItem(extensions_autoConnectKey)) ?? false; + $('#rm_api_block').append(settings_html); + $('head').append(settings_style); + $("#extensions_url").val(url); + $("#extensions_connect").on('click', connectClickHandler); + $("#extensions_autoconnect").on('input', autoConnectInputHandler); + $("#extensions_autoconnect").prop('checked', autoConnect).trigger('input'); + }); +})(); \ No newline at end of file diff --git a/server.js b/server.js index d13fe5fd9..8e89f6e69 100644 --- a/server.js +++ b/server.js @@ -25,7 +25,7 @@ const server_port = config.port; const whitelist = config.whitelist; const whitelistMode = config.whitelistMode; const autorun = config.autorun; - +const enableExtensions = config.enableExtensions; var Client = require('node-rest-client').Client; @@ -804,7 +804,8 @@ app.post('/getsettings', jsonParser, (request, response) => { //Wintermute's cod koboldai_setting_names, world_names, novelai_settings, - novelai_setting_names + novelai_setting_names, + enable_extensions: enableExtensions, }); });