const extensions_urlKey = 'extensions_url'; const extensions_autoConnectKey = 'extensions_autoconnect'; let extensions = []; (function () { const settings_html = `

Extensions: TavernAI-extras

Not connected

Active extensions

Extension settings

`; const settings_style = ` `; const defaultUrl = "http://localhost:5100"; let connectedToApi = false; async function connectClickHandler() { const baseUrl = $("#extensions_url").val(); localStorage.setItem(extensions_urlKey, baseUrl); await connectToApi(baseUrl); } function autoConnectInputHandler() { const value = $(this).prop('checked'); localStorage.setItem(extensions_autoConnectKey, value.toString()); if (value && !connectedToApi) { $("#extensions_connect").trigger('click'); } } async function connectToApi(baseUrl) { const url = new URL(baseUrl); url.pathname = '/api/extensions'; try { const getExtensionsResult = await fetch(url, { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } }); 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); if (success && extensions.length) { $('#extensions_loaded').show(200); $('#extensions_settings').show(200); $('#extensions_list').empty(); for (let extension of extensions) { $('#extensions_list').append(`
  • ${extension.metadata.display_name}
  • `); } } else { $('#extensions_loaded').hide(200); $('#extensions_settings').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) { addExtensionStyle(extension); addExtensionScript(extension); } async function addExtensionStyle(extension) { if (extension.metadata.css) { try { url.pathname = `/api/style/${extension.name}`; const link = url.toString(); const result = await fetch(link, { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } }); const text = await result.text(); if ($(`style[id="${link}"]`).length === 0) { const style = document.createElement('style'); style.id = link; style.innerHTML = text; $('head').append(style); } } catch (error) { console.log(error); } } } async function addExtensionScript(extension) { if (extension.metadata.js) { try { url.pathname = `/api/script/${extension.name}`; const link = url.toString(); const result = await fetch(link, { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } }); const text = await result.text(); if ($(`script[id="${link}"]`).length === 0) { const script = document.createElement('script'); script.id = link; script.type = 'module'; script.innerHTML = text; $('body').append(script); } } catch (error) { console.log(error); } } } } $(document).ready(async function () { const url = localStorage.getItem(extensions_urlKey) ?? defaultUrl; const autoConnect = localStorage.getItem(extensions_autoConnectKey) == 'true'; $('#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'); }); })();