(async function() { //todo: verify if specific cid is active, and remove iteration async function fetchCids() { const response = await fetch(`https://ava.sectorsixstudios.com/api/get_cids`); const cids = await response.json(); return cids; } let clientArr = await fetchCids(); let assistantHostUrl, targetElement, assistantHost; var scripts = document.getElementsByTagName("script"); for(var x = 0; x < clientArr.length; ++x) { for (var i = 0; i < scripts.length; ++i) { var script = scripts[i].getAttribute('data-name'); if(script === clientArr[x]) { // Store localStorage.setItem("clientId", script); assistantHostUrl = document.scripts[i].src; targetElement = scripts[i].getAttribute('data-target-elem-id') || 'body'; assistantHost = assistantHostUrl.replace(/(\/\/.*?\/).*/g, '$1').slice(0, -1); // Report await fetch(`https://ava.sectorsixstudios.com/api/report_origin`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ clientId: script, baseUrl: window.location.origin, }), }); break; } } } const elemList = [ { name: 'bundleScript', type: 'script', attrs: [ {name: 'src', val: assistantHost + '/dist/bundle.js'} ] },{ name: 'chatWrap', type: 'div', attrs: [ {name: 'id', val: 'chat_bot_wrapper'}, ] },{ name: 'styleSheetLink', type: 'link', attrs: [ {name: 'rel', val: 'stylesheet'}, {name: 'type', val: 'text/css'}, {name: 'href', val: assistantHost + '/dist/styles.css'} ] } ]; // Dictionary for storing newly created DOM elements let elemDictionary = { bundleScript: null, chatWrap: null, styleSheetLink: null }; // Element builder function const createElem = (elemObj, document, elemDictionary) => { let currElem = document.createElement(elemObj.type); // Checks if element has attributes to be added if(!!elemObj.attrs && elemObj.attrs.length > 0) { elemObj.attrs.forEach(function(attr) { if(Array.isArray(attr.val)) { let completeVal = attr.val.join(' '); currElem.setAttribute(attr.name, completeVal); } else if(typeof attr.val === 'string') { currElem.setAttribute(attr.name, attr.val) } }); } // Sets element equal to it's counterpart in the elemDictionary object if(!!elemDictionary && !elemDictionary[elemObj.name]) { elemDictionary[elemObj.name] = currElem; } } var DOMReady = function(callback) { if (document.readyState === "interactive" || document.readyState === "complete") { callback(); } else if (document.addEventListener) { document.addEventListener("DOMContentLoaded", callback); } else if (document.attachEvent) { document.attachEvent("onreadystatechange", function() { if (document.readyState != "loading") { callback(); } }); } }; DOMReady(function() { // Builds DOM elements elemList.forEach(function(elem) { createElem(elem, document, elemDictionary); }); // Appends new elements to DOM document.body.appendChild(elemDictionary.bundleScript.cloneNode(true)); if(targetElement === 'body') { document.body.appendChild(elemDictionary.chatWrap.cloneNode(true)); } else { document.getElementById(targetElement).appendChild(elemDictionary.chatWrap.cloneNode(true)); } document.head.appendChild(elemDictionary.styleSheetLink.cloneNode(true)); }); })();