Fiction.Live Merged-

An attempt to improve fiction.live through the addition of various features.

As of 2021-01-31. See the latest version.

// ==UserScript==
// @name         Fiction.Live Merged-
// @namespace    http://tampermonkey.net/
// @version      24
// @description  An attempt to improve fiction.live through the addition of various features.
// @author       You
// @match        https://fiction.live/*
// @grant        none
// @run-at       document-idle
// @noframes
// ==/UserScript==
//console.clear();

//(http[s]?:\/\/)?(www.)?((\w+(\.)?)+\/?)*
//Regex for links, maybe turn links into clickable crap idk
(function() {
    'use strict';

    var rolled=false;
    var lastURL = window.location.href;
    try{
        var alertBlacklist = JSON.parse(localStorage.getItem('alertBlacklist'));
        alertBlacklist = [...new Set(alertBlacklist)];
    }
    catch(error){
    };
    var settings = JSON.parse(localStorage.getItem('FL_Settings'));
    var defaultSettings = {'imageResize':true,
                           'questRemove':true,
                           'questAuthorRemove':true,
                           'anonToggle':false,
                           'removeUsernames':false,
                           'autoRoller':false,
                           'removeTopicForm':true,
                           'removeBlankTopics':true,
                           'authorHighlight':true,
                           'authorBlacklist':[],
                           'chatBlacklist':false,
                           'chatBlacklisted':[],
                           'tagBlacklist':[],
                           'alertBlacklist':[],
                           'highlightColor':'#393c59',
                           'highlightLight':'#fc8c03',
                           'highlightLightToggle':false,
                           'liveRestore':true,
                           'liveLight':false
                          };

    //Updates settings when there is a change between versions.
    if (!settings){
        console.log('Settings set to defaults.');
        settings = defaultSettings
    }
    else if (Object.keys(settings).length !== Object.keys(defaultSettings).length){
        console.log('Settings differ in length.');
        Object.keys(defaultSettings).forEach(
            function(key){
                if (!(key in settings)){
                    settings[key] = defaultSettings[key];
                    console.log('Added '+key+' to the current settings.');
                };
            }
        );
        if (Object.keys(settings).length > Object.keys(defaultSettings).length){
            Object.keys(settings).forEach(
                function(key){
                    if (!(key in defaultSettings)){
                        console.log(`Removed invalid variable and value from settings, ${key}:${settings[key]}.`);
                        delete settings[key]
                    };
                }
            );
        }
    };

    //For handling merge and deletion of alertBlacklist storage item.
    if (typeof alertBlacklist != ('undefined' || 'null')){
        if (settings.alertBlacklist.length == 0 && alertBlacklist.length > 0){
            console.log('set and remove alert bl');
            settings.alertBlacklist = alertBlacklist;
            try{
                localStorage.removeItem('alertBlacklist');
            }catch(error){console.log(error);};
        }
        else if(settings.alertBlacklist.length == 0 && alertBlacklist.length == 0){
            try{
                localStorage.removeItem('alertBlacklist');
            }catch(error){console.log(error);};
        }
    };

    localStorage.setItem('FL_Settings', JSON.stringify(settings));

    function sortQuestTags(){
        //ignore this
        var list = document.querySelector('span.tags');
        var l2 = [...list.children];
        var l3 = l2.filter(
            function(value, index, arr){
                if (value.className !== 'tag more ng-scope'){
                    return value
                };
            }
        );
        l3.sort((a,b)=>a.innerText>b.innerText?1:-1).forEach(node=>list.appendChild(node));
    };

    function blacklistRemove(item){
        if (settings.alertBlacklist.includes(item)){
            let position = settings.alertBlacklist.indexOf(item);
            settings.alertBlacklist.splice(position, 1);
            localStorage.setItem('FL_Settings', JSON.stringify(settings));
        };
    };

    function repeatChecker(){
        try{
            let thisPage = window.location.href;
            if (thisPage !== lastURL){
                try{
                    questCheck.observerQst.disconnect();
                }catch(error){
                }
                try{
                    questCheck.observerTopic.disconnect();
                }catch(error){
                }
                pageCheck();
                lastURL = window.location.href;
            };
        }catch(error){
            console.log('Error with repeatChecker',error);
        };
    };
    setInterval(repeatChecker,500);

    function chatSend(info){
        let body = info[1]
        try{
            //var encodedBody = encodeURI(body);
            fetch("https://fiction.live/api/anonkun/dice", {
                "credentials": "include",
                "headers": {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
                    "Accept": "*/*",
                    "Accept-Language": "en-GB,en;q=0.5",
                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "X-Requested-With": "XMLHttpRequest"
                },
                "referrer": window.location.href,
                "body": body,
                "method": "POST",
                "mode": "cors"
            }
                 );
        }catch(error){
            console.log('Error with chatSend',error);
        }
        try{
            let chapterID = info[0][0]
            let dataID = info[0][1]
            let roll = info[0][2]
            var cookies = document.cookie;
            cookies=cookies.split("; ")
            for (let i = 0; i < cookies.length; i++){
                var cookie = cookies[i].split("=")
                if (/.*distinct_id.*/.test(cookie)){
                    var cookieName = cookie[0].replace(/_posthog/,'')
                    cookieName = cookieName.replace('ph_','')
                }
            }
            fetch("https://fiction.live/api/node", {
                "credentials": "include",
                "headers": {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
                    "Accept": "*/*",
                    "Accept-Language": "en-GB,en;q=0.5",
                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "X-Requested-With": "XMLHttpRequest"
                },
                "referrer": `https://fiction.live/stories/${body}`,
                "body": encodeURI(`r[]=${chapterID}&r[]=${dataID}&nt=chat&b=/roll+`)+encodeURIComponent(`${roll}`)+encodeURI(`&ra[hide]=true&ra[_id]=${dataID}&ra[b]=chapter+${dataID}&token=${cookieName}`),
                "method": "POST",
                "mode": "cors"
            });
        }catch(error){
            console.log('Error with RollSend',error);}
    }

    function autoRoll(change){
        if (settings.autoRoller != true){
            return;
        };
        try{
            //console.log(change)

            var rollRegex = /[0-9]+d[0-9]+(\+[0-9]+)?( ?)(([ie]+)?([ut][0-9]+)?)+[^1d1]/
            if (rollRegex.test(change.innerText)){
                var roll = change.innerText.match(rollRegex)[0];
                var qewq = document.querySelector('div#storyPosts').firstChild.lastChild;
                if (qewq.firstChild.firstChild.classList.contains('closed')){return}
                else if(qewq.firstChild.firstChild.classList.contains('inner') && !(qewq.firstChild.firstChild.classList.contains('closed'))){
                    var dataID = qewq.getAttribute('data-id');
                    var chapterID = document.querySelector('article.threads').getAttribute('threads');
                    chapterID = chapterID.replace(/\/.*/,'');
                    var rollSend = `/roll ${roll}`;
                    var template = `sid=${chapterID}&dice=${encodeURIComponent(rollSend)}`;
                    //var template = `r[]=${chapterID}&r[]=${dataID}&nt=chat&b=${rollSend}&ra[hide]=true&ra[_id]=${dataID}&ra[b]=chapter ${dataID}&token=dat11sq-MLuO9XeGqWK6KfToFuu2YCbcfXq97iNA604`;
                    if (rolled == false){
                        chatSend([[chapterID,dataID,roll],template]);
                        rolled = true;
                        setTimeout(function (){rolled = false},5000);
                    }
                }
            }
        }catch(error){}
    }

    function authorCheck(quest){
        let author = quest.querySelector('div.authorPane');
        if (author == null){
            try{
                author = quest.parentNode.parentNode.querySelector('span.name').innerText
                quest = quest.parentNode.parentNode.parentNode
            }catch(error){
                console.log('authorCheck Null',error)
            };
        }
        else{
            author = author.innerText;
        }
        if (settings.authorBlacklist.includes(author)){
            try{
                while (true){
                    if(quest.parentNode == null){
                        break
                    }
                    if (quest.parentNode.classList.contains('ng-scope') && quest.parentNode.tagName == 'LI'){
                        quest.parentNode.remove()
                        break
                    }
                    else{
                        quest = quest.parentNode
                    }
                }
                return
            }catch(error){console.log('authorCheck remove',error)};
            return;
        };
    };

    function tagCheck(quest){
        let tags = quest.querySelector('div.tags');
        if (tags == null){
            let tag = quest.parentNode.parentNode.querySelector('div.displayedTag');
            if (tag){
                if (settings.tagBlacklist.includes(tag.innerText)){
                    try{
                        while (true){
                            if(quest.parentNode == null){
                                break
                            }
                            if (quest.parentNode.classList.contains('ng-scope') && quest.parentNode.tagName == 'LI'){
                                quest.parentNode.remove()
                                break
                            }
                            else{
                                quest = quest.parentNode
                            }
                        }
                        return
                    }catch(error){
                        console.log('tagCheck remove',error)
                    };
                };
                return

            }
            else{return}
        };
        tags = tags.children;
        for (let i = 0; i < tags.length; i++){
            let tag = tags[i]
            if (settings.tagBlacklist.includes(tag.innerText)){
                try{
                    quest.parentNode.parentNode.remove();
                }catch(error){
                    console.log('tagCheck remove',error)
                };
                return;
            };
        };
    };

    function removeBlacklisted(){
        let quests = document.querySelectorAll('div.storyListItem');
        for (let i = 0; i < quests.length; i++){
            if (settings.questRemove == true){
                tagCheck(quests[i].children[0]);
            }
            if (settings.questAuthorRemove == true){
                authorCheck(quests[i].children[0]);
            }
            //console.log(quests[i].children[0])
        };
    };

    function liveRestore() {
        if (document.querySelector('div#liveBox')) {
            return
        };
        var navBar = document.querySelector('[id="mainMenuReplacement"][class="navbar navbar-default navbar-fixed-top"]');
        var liveTimer = document.querySelectorAll('[class="next-live ng-scope"]');
        var myLive = document.createElement('div');
        myLive.setAttribute('id', 'liveBox');
        myLive.style.display = 'block';
        myLive.style.height = '100%';
        myLive.style.width = 'auto';
        myLive.style.float = 'right';
        myLive.style.paddingLeft = '1%';
        myLive.style.paddingRight = '1%';
        myLive.style.borderLeft = 'solid';
        myLive.style.borderRight = 'solid';
        myLive.style.borderColor = '#323448';
        myLive.style.boxSizing = 'border-box';
        myLive.style.fontWeight = 'bold';

        if (settings.liveLight == true){
            myLive.style.color = 'black';
            myLive.style.textShadow = '-1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff';
        } else{
            myLive.style.color = 'white';
            myLive.style.textShadow = '-1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000';
        }

        while (liveTimer[0].childNodes.length > 0) {
            myLive.appendChild(liveTimer[0].childNodes[0]);
        }
        navBar.appendChild(myLive);
        liveTimer[0].style.display = 'none';
    };

    function waitForTimer() {
        if (settings.liveRestore == false){return};
        var options = {
            childList: true,
            subtree: true
        };
        var observerTimer = new MutationObserver(awaitTimer);
        function awaitTimer(mutations) {
            for (let mutation of mutations) {
                try {
                    var canvas = document.querySelector('header[class="next-live ng-scope"]');
                } catch (error) {}
                if (canvas && (canvas !== undefined && canvas.length != 0)) {
                    observerTimer.disconnect(); // stop observing
                    liveRestore()
                    return;
                };
            };
        };
        observerTimer.observe(document, options);
        setTimeout(function(){
            try{
                observerTimer.disconnect();
            }catch(error){}
        },1000);
    };

    function questCheck(){
        if ((settings.questRemove && settings.questAuthorRemove) !== true){
            return;
        }
        try{
            var options = {
                childList: true,
                subtree: true
            };
            function qstMod(mutations) {
                for (let mutation of mutations) {
                    try{
                        let quest = mutation.addedNodes[0];
                        if (quest){
                            try{
                                if (quest.parentNode.classList.contains('storyListItem')){
                                    if (settings.questRemove == true){
                                        tagCheck(quest);
                                    }
                                    if (settings.questAuthorRemove == true){
                                        authorCheck(quest);
                                    }

                                }else if (quest.parentNode.parentNode.parentNode.parentNode.classList.contains('storyListItem') && /.*fiction.live\/$/.test(URL)){
                                    if (settings.questRemove == true){
                                        if (quest){
                                            tagCheck(quest);
                                        }
                                    }
                                    try{
                                        if (settings.questAuthorRemove == true){
                                            console.log('xxxxxx')
                                            if (quest){
                                                authorCheck(quest);
                                            }
                                        }
                                    }catch(error){console.log(error)}

                                }
                            }catch(error){
                                //console.log('If this appears more than twice, make an issue.')
                                if (error instanceof TypeError){}
                                else{
                                    console.log(error)}
                            }

                        }
                        //observerMessage.disconnect();
                    }catch(error){
                        console.log('New quest Error',error);
                    }

                };
            };
            let observerQst = new MutationObserver(qstMod);
            observerQst.observe(document, options);
            questCheck.observerQst = observerQst;
            removeBlacklisted();
        }
        catch(error){console.log('questCheck',error)};


    };

    function pageCheck() {
        try{
            let URL = window.location.href;
            if ((/.*(fiction.live\/stories\/).*/.test(URL))) {
                //console.log('quest');
                chatThings();
                waitForTimer();
                //questThings();
            } else if (/.*(fiction.live\/stories\?).*/.test(URL)) {
                //console.log('main/search page');
                //mainThings();
                questCheck();
            } else if (/.*(fiction.live\/live\?).*/.test(URL)) {
                //console.log('live page');
                //LiveThings();
                questCheck();
            } else if (/.*(fiction.live\/social).*/.test(URL)){
                //console.log('thread page');
                removeBlankTopics();
            } else if (/.*fiction.live\/$/.test(URL)){
                questCheck();
            } else {
                console.log('Page currently has no specific functions.');
            }
        }catch(error){
            console.log('Error with pageCheck',error)
        }


    };

    function removeBlankTopics(){
        if (settings.removeBlankTopics !== true){
            return;
        }
        try{
            var options = {
                childList: true,
                subtree: true
            };
            function topicWatch(mutations) {
                for (let mutation of mutations) {
                    try{
                        let topic = mutation.addedNodes[0];
                        if (topic){
                            try{
                                if (typeof(topic.classList)=='undefined'){}
                                else if (topic.classList.contains('threadList')){
                                    //observerTopic.disconnect();
                                    let topicItem = topic.querySelectorAll('li.threadListItem')
                                    for (let i = 0; i < topicItem.length; i++){
                                        if (topicItem[i].querySelector('div.row.title.header').innerText.length == 0){
                                            topicItem[i].remove();
                                        };
                                    };
                                };

                                //if (!(topic.querySelector('div.row.title.header').innerText)){console.log('empty',topic)}
                            }catch(error){
                                console.log(error)
                            }

                        }
                    }catch(error){
                        console.log('New quest Error',error);
                    }

                };
            };
            let observerTopic = new MutationObserver(topicWatch);
            observerTopic.observe(document, options);
            questCheck.observerTopic = observerTopic;
        }catch(error){
            console.log('topicCheck',error)
        };
    };

    function chatBlacklist(message){
        function delMSG(name){
                if (name == message.querySelector('span.name').innerText){
                    //message.remove();
                    message.style.display = 'none';
                    return;
                };
            }
        if (settings.chatBlacklist != true && settings.chatBlacklisted.length == 0){
            return;
        }
        else{
            settings.chatBlacklisted.forEach(name=>delMSG(name));
        };
    };

    function chatThings() {
        waitForChat();

        function removeUsernames(message){
            //return;
            //console.log('this shouldnt be seen')
            if (settings.removeUsernames == true && message.querySelector('span.name')){
                message.querySelector('span.name').style.display = 'none';
                let authorList = document.querySelectorAll('span.author.ng-scope');
                let authors=[]
                authorList.forEach(element=>authors.push(element.querySelector('span.name').innerText))

                try {
                    console.log(authors)
                    console.log(message.querySelector('span.name'))
                    if (authors.includes(message.querySelector('span.name').innerText)) {
                        message.querySelector('span.name').style.display = 'initial';
                        return;
                    }
                    else {
                        console.log('ac')
                        setTimeout(function(){
                            try{
                                message.querySelector('img.avater').remove()
                            }catch(error){
                            };
                            try{
                                message.querySelector('span.name').innerText='anon'
                                message.querySelector('span.name').style.display = 'initial';
                            }catch(error){
                                console.log('Error forcing anon',error);
                            };
                            setTimeout(function(){
                                if (message.querySelector('span.name').innerText!='anon'){
                                    message.querySelector('span.name').innerText='anon'
                                }
                            },100);
                        },100);


                    }
                } catch (error) {
                    console.log('Author highlighter failed',error);
                };
            }
            else return

        };

        function authorHighlight(message){
            if (settings.authorHighlight == true && message.querySelector('span.name')){
                var currentColor = settings.highlightColor;
                if (settings.highlightLightToggle == true){
                    currentColor = settings.highlightLight;
                }
                let authorList = document.querySelectorAll('span.author.ng-scope');
                let authors=[]
                authorList.forEach(element=>authors.push(element.querySelector('span.name').innerText))
                try {
                    if (authors.includes(message.querySelector('span.name').innerText)) {
                        if (settings.highlightColor){
                            try{
                                message.style.backgroundColor = currentColor;
                            }catch(error){
                                console.log('Failed using custom color',error);
                                message.style.backgroundColor = '#393c59';
                                settings.highlightColor = '#393c59';
                            }
                        }
                        else{
                            message.style.backgroundColor = '#393c59';
                        };
                    };
                } catch (error) {
                    console.log('Author highlighter failed',error);
                };
            }
            else return

        };

        function imageResize(message){
            if (settings.imageResize == true){
                let msgImage = message.querySelector('div.message').querySelector('img');
                if (msgImage !== null && msgImage !== undefined) {
                    let image = message.querySelector('div.message').querySelector('img');
                    image.src = image.src.replace(/(h[0-9]+\-w[0-9]+)/, 'h5600-w5600');
                    let page = image.src;
                    image.setAttribute('onclick', "window.open('" + page + "', '_blank');")
                    try {
                        image.onerror = (function () {
                            setTimeout(this.src = this.src, 100)
                        })
                    } catch (error) {
                        'img error add fail'
                    };
                };}
            else return
        };

        function whenNewMessage(chat) {
            var options = {
                childList: true
            };
            function messageMod(mutations) {
                for (let mutation of mutations) {
                    try{
                        let message = mutation.addedNodes[0];
                        chatBlacklist(message);
                        removeUsernames(message);
                        authorHighlight(message);
                        imageResize(message);
                        autoRoll(message);
                        //observerMessage.disconnect();
                    }catch(error){
                        console.log('New Message Error',error);
                    }

                };
            };
            let observerMessage = new MutationObserver(messageMod);
            observerMessage.observe(chat, options);
        };

        function withOldMessage(chat) {
            let messages = chat.childNodes;
            try {
                messages.forEach(messageMod);
            } catch (error) {
                console.log('tried running msgmod',error)
            };

            function messageMod(message) {
                try {
                    imageResize(message);
                    authorHighlight(message);
                } catch (error) {
                    console.log('messageMod', error);
                };
            };
        };

        function waitForChat() {
            //waits for chat to exist
            var options = {
                childList: true,
                subtree: true
            };
            var observerChat = new MutationObserver(awaitChat);
            observerChat.observe(document, options)

            function awaitChat(mutations) {
                for (let mutation of mutations) {
                    try {
                        var chat = document.querySelector('article.chatLog').querySelector('div.jadeRepeat');
                    } catch (TypeError) {};
                    if (chat && (chat !== (undefined || null) && chat.length != 0)) {
                        observerChat.disconnect();
                        if (/.*(fiction.live\/stories\/).*/.test(window.location.href)) {
                            whenNewMessage(chat);
                            withOldMessage(chat);
                        };
                        break;
                    };
                };
            };
        };
    };

    function deleteTopicCreate(){
        try{
            if (settings.removeTopicForm == true){
                let formItem = document.querySelector('div.formItem');
                if (formItem){
                    formItem.parentNode.remove();
                };
            };
        }catch(error){
            console.log('Error with removing topic form',error);
        };

    };

    function blacklistAdd(){
        let title = this.parentNode.querySelector('[set-text="item.value.value"]').textContent.replace(' went live', '');
        let author = this.parentNode.querySelector('span.user').innerText;
        let entry = title+'___'+author;
        settings.alertBlacklist.push(entry);
        localStorage.setItem('FL_Settings', JSON.stringify(settings));
        let dismiss = this.parentNode.querySelector('a.dismiss');
        simClick(dismiss);
        document.querySelector('div#settingsBlacklist').appendChild(elementBlacklisted(entry));
    };

    function alertBlacklistButton(alert){
        function createBlacklistButton(){
            var blacklistButton = document.createElement('a');
            blacklistButton.setAttribute('class', 'blacklist');
            blacklistButton.style.height = 'auto';
            blacklistButton.style.width = '0px';
            blacklistButton.innerText = '∅';
            blacklistButton.onclick = blacklistAdd;
            return blacklistButton
        }
        alert.childNodes[0].after(createBlacklistButton());
    };

    function blacklistCheck(alert){
        try{
            var title = alert.querySelector('[set-text="item.value.value"]').textContent.replace(' went live', '');
            var author = alert.querySelector('span.user').innerText;
            var dismiss = alert.querySelector('a.dismiss');
            if (settings.alertBlacklist.includes(title+'___'+author)){
                simClick(dismiss);
            }
            else{
                alertBlacklistButton(alert);
            };}
        catch(error){
            console.log('blacklist checker error',error)
        };
    };

    function simClick(elem) {
        var evt = new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window
        });
        var canceled = !elem.dispatchEvent(evt);
    };

    function monitorAlerts() {
        try {
            let alertContainer = document.getElementsByClassName('feedType')[0];
            alertContainer.querySelectorAll('li').forEach(alert => blacklistCheck(alert))
            var observer = new MutationObserver(function (mutations, me) {
                try {
                    for (let mutation of mutations) {
                        if (mutation.addedNodes[0] !== undefined) {
                            if (mutation.addedNodes[0].className == ('feedItem ng-scope ng-animate')) {
                                blacklistCheck(mutation.addedNodes[0]);
                            };
                        };

                    };
                } catch (error) {
                    console.log('Alert monitor error',error)
                };
            });
            observer.observe(alertContainer, {
                childList: true
            });
        } catch (error) {
            console.log('watcher ded',error)
        };
    };

    function awaitMainMenu(){
        try{
            var options = {
                childList: true,
                subtree: true
            };

            let observerMenu = new MutationObserver(awaitMenu);
            observerMenu.observe(document, options);
            function awaitMenu(mutations){
                for (let mutation of mutations) {
                    try {
                        var mainMenu = document.querySelector('nav#mainMenu');
                    } catch (error) {};
                    if (mainMenu){
                        observerMenu.disconnect();
                        settingsContainer();
                        deleteTopicCreate();
                    };
                };
            };
        }catch (error){console.log('Error awaiting main menu',error)};

    };

    function elementBlacklisted(element){
        var settingsBlacklisted = document.createElement('div');
        settingsBlacklisted.innerText = element
        settingsBlacklisted.innerText = settingsBlacklisted.innerText.replace('___','     Author: ')
        settingsBlacklisted.style.fontSize = '20px'
        settingsBlacklisted.style.float = 'left'
        settingsBlacklisted.style.minWidth = '50%'
        settingsBlacklisted.style.color = 'white'
        settingsBlacklisted.style.display = 'inline-block'
        settingsBlacklisted.style.border = 'thin solid silver'
        settingsBlacklisted.style.padding = '5px'


        var settingsBlacklistRemove = document.createElement('a');
        settingsBlacklisted.setAttribute('class','script')
        settingsBlacklistRemove.innerText = 'Remove'
        settingsBlacklistRemove.style.color = 'white'
        settingsBlacklistRemove.style.fontSize = '20px'
        settingsBlacklistRemove.style.display = 'inline-block'
        settingsBlacklistRemove.style.border = '3px solid red'
        settingsBlacklistRemove.style.backgroundColor = 'red'
        settingsBlacklistRemove.style.float = 'right'
        settingsBlacklistRemove.style.paddingLeft = '5px'
        settingsBlacklistRemove.style.paddingRight = '5px'
        settingsBlacklistRemove.onclick = function(){
            blacklistRemove(element);
            this.parentNode.remove();
        }

        settingsBlacklisted.appendChild(settingsBlacklistRemove)
        return settingsBlacklisted
    };

    function settingsContainer(){
        function settingsDisplay(){
            try{
                if (!document.querySelector('#confDisp')){
                    function configDisplay(){
                        var confDisp = document.createElement('div');
                        confDisp.setAttribute('id', 'confDisp');
                        confDisp.style.height = '100%';
                        confDisp.style.position = 'fixed';
                        confDisp.style.top = '0';
                        confDisp.style.bottom = '0';
                        confDisp.style.left = '0';
                        confDisp.style.right = '0';
                        confDisp.style.zIndex = '9999';
                        confDisp.style.display = 'none';
                        confDisp.style.overflowY = 'auto';
                        confDisp.style.pointerEvents = 'auto';
                        return confDisp
                    };
                    function configBox(){
                        var confBox = document.createElement('div');
                        confBox.setAttribute('id', 'confBox');
                        confBox.style.height = 'auto';
                        confBox.style.minHeight = '60%';
                        confBox.style.width = 'auto';
                        confBox.style.minWidth = '60%';
                        confBox.style.position = 'relative';
                        confBox.style.top = '10px';
                        confBox.style.margin = '10%';
                        confBox.style.padding = '1%';
                        confBox.style.display = 'flex';
                        confBox.style.flexFlow = 'column';
                        confBox.style.background = '#2a2c3b';
                        confBox.style.boxShadow = '0 0 10px #000000';
                        confBox.style.pointerEvents = 'auto';
                        return confBox
                    };

                    //Toggles features here

                    function settingsImageResize(){
                        var settingsImageResize = document.createElement('div');
                        settingsImageResize.innerText = 'Resize images in chat.';
                        settingsImageResize.style.minWidth = '25%';
                        settingsImageResize.style.fontSize = '20px';
                        settingsImageResize.style.color = 'white';
                        settingsImageResize.style.border = 'thin solid silver';
                        settingsImageResize.style.padding = '5px';
                        settingsImageResize.style.maxWidth = '25%';
                        settingsImageResize.style.float = 'left';

                        var settingsImageResizeCheckbox = document.createElement('input');
                        settingsImageResizeCheckbox.setAttribute("type", "checkbox");
                        if (settings.imageResize == true){
                            settingsImageResizeCheckbox.checked = true;
                        };
                        settingsImageResizeCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.imageResize = true;
                            } else {
                                settings.imageResize = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsImageResize.appendChild(settingsImageResizeCheckbox);
                        return settingsImageResize
                    };

                    function settingsRemoveBlankTopics(){
                        var settingsRemoveBlankTopics = document.createElement('div');
                        settingsRemoveBlankTopics.innerText = 'Remove blank topics.';
                        settingsRemoveBlankTopics.style.minWidth = '25%';
                        settingsRemoveBlankTopics.style.fontSize = '20px';
                        settingsRemoveBlankTopics.style.color = 'white';
                        settingsRemoveBlankTopics.style.border = 'thin solid silver';
                        settingsRemoveBlankTopics.style.padding = '5px';
                        settingsRemoveBlankTopics.style.maxWidth = '25%';
                        settingsRemoveBlankTopics.style.float = 'left';

                        var settingsRemoveBlankTopicsCheckbox = document.createElement('input');
                        settingsRemoveBlankTopicsCheckbox.setAttribute("type", "checkbox");
                        if (settings.removeBlankTopics == true){
                            settingsRemoveBlankTopicsCheckbox.checked = true;
                        };

                        settingsRemoveBlankTopicsCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.removeBlankTopics = true;
                            } else {
                                settings.removeBlankTopics = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsRemoveBlankTopics.appendChild(settingsRemoveBlankTopicsCheckbox);
                        return settingsRemoveBlankTopics
                    };

                    function settingsFormRemove(){
                        var settingsFormRemove = document.createElement('div');
                        settingsFormRemove.innerText = 'Remove topic submission form.';
                        settingsFormRemove.style.minWidth = '25%';
                        settingsFormRemove.style.fontSize = '20px';
                        settingsFormRemove.style.color = 'white';
                        settingsFormRemove.style.border = 'thin solid silver';
                        settingsFormRemove.style.padding = '5px';
                        settingsFormRemove.style.maxWidth = '25%';
                        settingsFormRemove.style.float = 'left';

                        var settingsFormRemoveCheckbox = document.createElement('input');
                        settingsFormRemoveCheckbox.setAttribute("type", "checkbox");
                        if (settings.removeTopicForm == true){
                            settingsFormRemoveCheckbox.checked = true;
                        };
                        settingsFormRemoveCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.removeTopicForm = true;
                            } else {
                                settings.removeTopicForm = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsFormRemove.appendChild(settingsFormRemoveCheckbox);
                        return settingsFormRemove
                    };

                    function settingsChatBlacklist(){
                        var settingsChatBlacklist = document.createElement('div');
                        settingsChatBlacklist.innerText = 'Hide blacklisted users in chat. ';
                        settingsChatBlacklist.style.minWidth = '25%';
                        settingsChatBlacklist.style.fontSize = '20px';
                        settingsChatBlacklist.style.color = 'white';
                        settingsChatBlacklist.style.border = 'thin solid silver';
                        settingsChatBlacklist.style.padding = '5px';
                        settingsChatBlacklist.style.maxWidth = '25%';
                        settingsChatBlacklist.style.float = 'left';

                        var settingsChatBlacklistCheckbox = document.createElement('input');
                        settingsChatBlacklistCheckbox.setAttribute("type", "checkbox");
                        if (settings.chatBlacklist == true){
                            settingsChatBlacklistCheckbox.checked = true;
                        };
                        settingsChatBlacklistCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.chatBlacklist = true;
                            } else {
                                settings.chatBlacklist = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsChatBlacklist.appendChild(settingsChatBlacklistCheckbox);
                        return settingsChatBlacklist
                    };

                    function settingsUserBlacklist() {
                        function chatBlacklistRemove(item) {
                            if (settings.chatBlacklisted.includes(item)) {
                                let position = settings.chatBlacklisted.indexOf(item);
                                settings.chatBlacklisted.splice(position, 1);
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                            };
                        };

                        function chatBlacklisted(element) {
                            try {
                                var chatBlacklisted = document.createElement('div');
                                chatBlacklisted.innerText = element;
                                chatBlacklisted.style.fontSize = '20px';
                                chatBlacklisted.style.float = 'left';
                                chatBlacklisted.style.minWidth = '50%';
                                chatBlacklisted.style.color = 'white';
                                chatBlacklisted.style.display = 'inline-block';
                                chatBlacklisted.style.border = 'thin solid silver';
                                chatBlacklisted.style.padding = '5px';

                                var settingsUserRemove = document.createElement('a');
                                settingsUserRemove.setAttribute('class', 'script');
                                settingsUserRemove.innerText = 'Remove';
                                settingsUserRemove.style.color = 'white';
                                settingsUserRemove.style.fontSize = '20px';
                                settingsUserRemove.style.display = 'inline-block';
                                settingsUserRemove.style.border = '3px solid red';
                                settingsUserRemove.style.backgroundColor = 'red';
                                settingsUserRemove.style.float = 'right';
                                settingsUserRemove.style.paddingLeft = '5px';
                                settingsUserRemove.style.paddingRight = '5px';
                                settingsUserRemove.onclick = function () {
                                    try {
                                        chatBlacklistRemove(element);
                                        this.parentNode.remove();
                                    } catch (error) {
                                        console.log('Error removing user', error)
                                    }
                                };
                                chatBlacklisted.appendChild(settingsUserRemove);
                                return chatBlacklisted;
                            } catch (error) {
                                console.log('', error)
                            }
                        };

                        function userAddBlacklist() {
                            var settingsUserBox = document.createElement('div');
                            settingsUserBox.setAttribute('id', 'settingsUserBox');
                            settingsUserBox.style.marginBottom = '5px';

                            var settingsUserInput = document.createElement('input');
                            settingsUserInput.setAttribute("type", "text");
                            settingsUserInput.setAttribute("class", "settingsUserInput");
                            settingsUserInput.setAttribute("placeholder", "Input username here.");
                            settingsUserInput.style.color = 'white';
                            settingsUserInput.style.maxWidth = '40%';
                            settingsUserInput.style.height = '30px';
                            settingsUserInput.style.marginBottom = '0';

                            var settingsUserAdd = document.createElement('input');
                            settingsUserAdd.setAttribute("type", "button");
                            settingsUserAdd.style.height = '30px';
                            settingsUserAdd.value = 'Add User';
                            settingsUserAdd.onclick = function () {
                                settings.chatBlacklisted.push(this.parentNode.childNodes[0].value);
                                this.parentNode.parentNode.appendChild(chatBlacklisted(this.parentNode.childNodes[0].value));
                                this.parentNode.childNodes[0].value = "";
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                                removeBlacklisted();
                            };

                            settingsUserBox.appendChild(settingsUserInput);
                            settingsUserBox.appendChild(settingsUserAdd);

                            return settingsUserBox
                        };

                        var settingsUserBlacklist = document.createElement('div');
                        settingsUserBlacklist.setAttribute('id', 'settingsUserBlacklist');
                        settingsUserBlacklist.style.borderBottom = 'thin solid white';
                        settingsUserBlacklist.style.padding = '5px';
                        settings.chatBlacklisted.forEach(element => settingsUserBlacklist.appendChild(chatBlacklisted(element)));

                        var settingsUserBlacklistText = document.createElement('div');
                        settingsUserBlacklistText.innerText = 'Chat User Blacklist';
                        settingsUserBlacklistText.style.minWidth = '100%';
                        settingsUserBlacklistText.style.fontSize = '20px';
                        settingsUserBlacklistText.style.color = 'white';
                        settingsUserBlacklist.prepend(userAddBlacklist());
                        settingsUserBlacklist.prepend(settingsUserBlacklistText);
                        return settingsUserBlacklist;
                    };

                    function settingsAuthorBlacklist(){
                        var settingsAuthorBlacklist = document.createElement('div');
                        settingsAuthorBlacklist.innerText = 'Hide quests with blacklisted authors. ';
                        settingsAuthorBlacklist.style.minWidth = '25%';
                        settingsAuthorBlacklist.style.fontSize = '20px';
                        settingsAuthorBlacklist.style.color = 'white';
                        settingsAuthorBlacklist.style.border = 'thin solid silver';
                        settingsAuthorBlacklist.style.padding = '5px';
                        settingsAuthorBlacklist.style.maxWidth = '25%';
                        settingsAuthorBlacklist.style.float = 'left';

                        var settingsAuthorBlacklistCheckbox = document.createElement('input');
                        settingsAuthorBlacklistCheckbox.setAttribute("type", "checkbox");
                        if (settings.questAuthorRemove == true){
                            settingsAuthorBlacklistCheckbox.checked = true;
                        };
                        settingsAuthorBlacklistCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.questAuthorRemove = true;
                            } else {
                                settings.questAuthorRemove = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsAuthorBlacklist.appendChild(settingsAuthorBlacklistCheckbox);
                        return settingsAuthorBlacklist
                    };

                    function settingsAuthorsBlacklist() {
                        function authorBlacklistRemove(item) {
                            if (settings.authorBlacklist.includes(item)) {
                                let position = settings.authorBlacklist.indexOf(item);
                                settings.authorBlacklist.splice(position, 1);
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                            };
                        };
                        function authorBlacklisted(element) {
                            try {
                                var authorBlacklisted = document.createElement('div');
                                authorBlacklisted.innerText = element;
                                authorBlacklisted.style.fontSize = '20px';
                                authorBlacklisted.style.float = 'left';
                                authorBlacklisted.style.minWidth = '50%';
                                authorBlacklisted.style.color = 'white';
                                authorBlacklisted.style.display = 'inline-block';
                                authorBlacklisted.style.border = 'thin solid silver';
                                authorBlacklisted.style.padding = '5px';

                                var settingsAuthorRemove = document.createElement('a');
                                settingsAuthorRemove.setAttribute('class', 'script');
                                settingsAuthorRemove.innerText = 'Remove';
                                settingsAuthorRemove.style.color = 'white';
                                settingsAuthorRemove.style.fontSize = '20px';
                                settingsAuthorRemove.style.display = 'inline-block';
                                settingsAuthorRemove.style.border = '3px solid red';
                                settingsAuthorRemove.style.backgroundColor = 'red';
                                settingsAuthorRemove.style.float = 'right';
                                settingsAuthorRemove.style.paddingLeft = '5px';
                                settingsAuthorRemove.style.paddingRight = '5px';
                                settingsAuthorRemove.onclick = function () {
                                    try {
                                        authorBlacklistRemove(element);
                                        this.parentNode.remove();
                                    } catch (error) {
                                        console.log('Error removing author', error)
                                    }
                                };
                                authorBlacklisted.appendChild(settingsAuthorRemove);
                                return authorBlacklisted;
                            } catch (error) {
                                console.log('', error)
                            }
                        };

                        function authorAddBlacklist() {
                            var settingsAuthorBox = document.createElement('div');
                            settingsAuthorBox.setAttribute('id', 'settingsAuthorBox');
                            settingsAuthorBox.style.marginBottom = '5px';

                            var settingsAuthorsInput = document.createElement('input');
                            settingsAuthorsInput.setAttribute("type", "text");
                            settingsAuthorsInput.setAttribute("class", "settingsAuthorsInput");
                            settingsAuthorsInput.setAttribute("placeholder", "Input author here.");
                            settingsAuthorsInput.style.color = 'white';
                            settingsAuthorsInput.style.maxWidth = '40%';
                            settingsAuthorsInput.style.height = '30px';
                            settingsAuthorsInput.style.marginBottom = '0';

                            var settingsAuthorsAdd = document.createElement('input');
                            settingsAuthorsAdd.setAttribute("type", "button");
                            settingsAuthorsAdd.style.height = '30px';
                            settingsAuthorsAdd.value = 'Add Author';
                            settingsAuthorsAdd.onclick = function () {
                                settings.authorBlacklist.push(this.parentNode.childNodes[0].value);
                                this.parentNode.parentNode.appendChild(authorBlacklisted(this.parentNode.childNodes[0].value));
                                this.parentNode.childNodes[0].value = "";
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                                removeBlacklisted();
                            };

                            settingsAuthorBox.appendChild(settingsAuthorsInput);
                            settingsAuthorBox.appendChild(settingsAuthorsAdd);

                            return settingsAuthorBox
                        };

                        var settingsAuthorsBlacklist = document.createElement('div');
                        settingsAuthorsBlacklist.setAttribute('id', 'settingsAuthorsBlacklist');
                        settingsAuthorsBlacklist.style.borderBottom = 'thin solid white';
                        settingsAuthorsBlacklist.style.padding = '5px';
                        settings.authorBlacklist.forEach(element => settingsAuthorsBlacklist.appendChild(authorBlacklisted(element)));

                        var settingsAuthorsBlacklistText = document.createElement('div');
                        settingsAuthorsBlacklistText.innerText = 'Authors Blacklist';
                        settingsAuthorsBlacklistText.style.minWidth = '100%';
                        settingsAuthorsBlacklistText.style.fontSize = '20px';
                        settingsAuthorsBlacklistText.style.color = 'white';
                        settingsAuthorsBlacklist.prepend(authorAddBlacklist());
                        settingsAuthorsBlacklist.prepend(settingsAuthorsBlacklistText);
                        return settingsAuthorsBlacklist;
                    };

                    function settingsTagBlacklist(){
                        var settingsTagBlacklist = document.createElement('div');
                        settingsTagBlacklist.innerText = 'Hide quests with blacklisted tags. ';
                        settingsTagBlacklist.style.minWidth = '25%';
                        settingsTagBlacklist.style.fontSize = '20px';
                        settingsTagBlacklist.style.color = 'white';
                        settingsTagBlacklist.style.border = 'thin solid silver';
                        settingsTagBlacklist.style.padding = '5px';
                        settingsTagBlacklist.style.maxWidth = '25%';
                        settingsTagBlacklist.style.float = 'left';

                        var settingsTagBlacklistCheckbox = document.createElement('input');
                        settingsTagBlacklistCheckbox.setAttribute("type", "checkbox");
                        if (settings.questRemove == true){
                            settingsTagBlacklistCheckbox.checked = true;
                        };
                        settingsTagBlacklistCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.questRemove = true;
                            } else {
                                settings.questRemove = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsTagBlacklist.appendChild(settingsTagBlacklistCheckbox);
                        return settingsTagBlacklist
                    };

                    function settingsTagsBlacklist(){
                        function tagBlacklistRemove(item){
                            if (settings.tagBlacklist.includes(item)){
                                let position = settings.tagBlacklist.indexOf(item);
                                settings.tagBlacklist.splice(position, 1);
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                            };
                        };
                        function tagBlacklisted(element){
                            try{
                                var tagBlacklisted = document.createElement('div');
                                tagBlacklisted.innerText = element;
                                tagBlacklisted.style.fontSize = '20px';
                                tagBlacklisted.style.float = 'left';
                                tagBlacklisted.style.minWidth = '50%';
                                tagBlacklisted.style.color = 'white';
                                tagBlacklisted.style.display = 'inline-block';
                                tagBlacklisted.style.border = 'thin solid silver';
                                tagBlacklisted.style.padding = '5px';

                                var settingsTagRemove = document.createElement('a');
                                settingsTagRemove.setAttribute('class','script');
                                settingsTagRemove.innerText = 'Remove';
                                settingsTagRemove.style.color = 'white';
                                settingsTagRemove.style.fontSize = '20px';
                                settingsTagRemove.style.display = 'inline-block';
                                settingsTagRemove.style.border = '3px solid red';
                                settingsTagRemove.style.backgroundColor = 'red';
                                settingsTagRemove.style.float = 'right';
                                settingsTagRemove.style.paddingLeft = '5px';
                                settingsTagRemove.style.paddingRight = '5px';
                                settingsTagRemove.onclick = function(){
                                    try{
                                        tagBlacklistRemove(element);
                                        this.parentNode.remove();
                                    }catch(error){
                                        console.log('Error removing tag',error)}
                                };
                                tagBlacklisted.appendChild(settingsTagRemove);
                                return tagBlacklisted;
                            }catch(error){console.log('',error)}
                        };

                        function tagAddBlacklist(){
                            var settingsTagBox = document.createElement('div');
                            settingsTagBox.setAttribute('id', 'settingsTagBox');
                            settingsTagBox.style.marginBottom = '5px';

                            var settingsTagsInput = document.createElement('input');
                            settingsTagsInput.setAttribute("type", "text");
                            settingsTagsInput.setAttribute("class", "settingsTagsInput");
                            settingsTagsInput.setAttribute("placeholder", "Input tag here.");
                            settingsTagsInput.style.color = 'white';
                            settingsTagsInput.style.maxWidth = '40%';
                            settingsTagsInput.style.height = '30px';
                            settingsTagsInput.style.marginBottom = '0';

                            var settingsTagsAdd = document.createElement('input');
                            settingsTagsAdd.setAttribute("type", "button");
                            settingsTagsAdd.style.height = '30px';
                            settingsTagsAdd.value = 'Add Tag';
                            settingsTagsAdd.onclick = function (){
                                settings.tagBlacklist.push(this.parentNode.childNodes[0].value);
                                this.parentNode.parentNode.appendChild(tagBlacklisted(this.parentNode.childNodes[0].value));
                                this.parentNode.childNodes[0].value = "";
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                                removeBlacklisted();
                            };

                            settingsTagBox.appendChild(settingsTagsInput);
                            settingsTagBox.appendChild(settingsTagsAdd);

                            return settingsTagBox
                        };

                        var settingsTagsBlacklist = document.createElement('div');
                        settingsTagsBlacklist.setAttribute('id', 'settingsTagsBlacklist');
                        settingsTagsBlacklist.style.borderBottom = 'thin solid white';
                        settingsTagsBlacklist.style.padding = '5px';
                        settings.tagBlacklist.forEach(element => settingsTagsBlacklist.appendChild(tagBlacklisted(element)));

                        var settingsTagsBlacklistText = document.createElement('div');
                        settingsTagsBlacklistText.innerText = 'Tags Blacklist';
                        settingsTagsBlacklistText.style.minWidth = '100%';
                        settingsTagsBlacklistText.style.fontSize = '20px';
                        settingsTagsBlacklistText.style.color = 'white';
                        settingsTagsBlacklist.prepend(tagAddBlacklist());
                        settingsTagsBlacklist.prepend(settingsTagsBlacklistText);
                        return settingsTagsBlacklist;
                    };

                    //Toggles for features start here

                    function settingsNamefagToggle(){

                        var settingsNamefagToggle = document.createElement('div');
                        settingsNamefagToggle.innerText = 'Make everyone Anon    ';
                        settingsNamefagToggle.style.minWidth = '25%';
                        settingsNamefagToggle.style.fontSize = '20px';
                        settingsNamefagToggle.style.color = 'white';
                        settingsNamefagToggle.style.border = 'thin solid silver';
                        settingsNamefagToggle.style.padding = '5px';
                        settingsNamefagToggle.style.maxWidth = '25%';
                        settingsNamefagToggle.style.float = 'left';

                        var settingsNamefagToggleCheckbox = document.createElement('input');
                        settingsNamefagToggleCheckbox.setAttribute("type", "checkbox");
                        if (settings.removeUsernames == true){
                            settingsNamefagToggleCheckbox.checked = true;
                        };
                        settingsNamefagToggle.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.removeUsernames = true;
                            } else {
                                settings.removeUsernames = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsNamefagToggle.appendChild(settingsNamefagToggleCheckbox);
                        return settingsNamefagToggle
                    };

                    function settingsRollerToggle(){

                        var settingsRollerToggle = document.createElement('div');
                        settingsRollerToggle.innerText = 'Toggle Auto Roller    ';
                        settingsRollerToggle.style.minWidth = '25%';
                        settingsRollerToggle.style.fontSize = '20px';
                        settingsRollerToggle.style.color = 'white';
                        settingsRollerToggle.style.border = 'thin solid silver';
                        settingsRollerToggle.style.padding = '5px';
                        settingsRollerToggle.style.maxWidth = '25%';
                        settingsRollerToggle.style.float = 'left';

                        var settingsRollerToggleCheckbox = document.createElement('input');
                        settingsRollerToggleCheckbox.setAttribute("type", "checkbox");
                        if (settings.autoRoller == true){
                            settingsRollerToggleCheckbox.checked = true;
                        };
                        settingsRollerToggle.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.autoRoller = true;
                            } else {
                                settings.autoRoller = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsRollerToggle.appendChild(settingsRollerToggleCheckbox);
                        return settingsRollerToggle
                    };

                    function settingsAnonToggle(){

                        function toggleAnonStatus(){
                            var x=1
                            try{
                                try{
                                    var username = localStorage.getItem('username');
                                    var refURL = "https://fiction.live/user/"+username;
                                    var profile = window.ty.currentUser.profile;
                                    profile.asAnon = settings.anonToggle;
                                    //console.log(refURL,JSON.stringify(profile));
                                }catch(error){
                                    console.log('Toggle Anon Prep',error);x=2;
                                };
                                if (x=1){
                                    fetch("https://fiction.live/api/user", {
                                        "credentials": "include",
                                        "headers": {
                                            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
                                            "Accept": "application/json, text/javascript, */*; q=0.01",
                                            "Accept-Language": "en-GB,en;q=0.5",
                                            "Content-Type": "application/json",
                                            "X-Requested-With": "XMLHttpRequest"
                                        },
                                        "referrer": refURL,
                                        "body": JSON.stringify(profile),
                                        "method": "PUT",
                                        "mode": "cors"
                                    });};
                            }catch(error){
                                console.log('Toggle Anon Set',error);
                            };
                        };

                        var settingsAnonToggle = document.createElement('div');
                        settingsAnonToggle.innerText = 'Toggle Anon status ';
                        settingsAnonToggle.style.minWidth = '25%';
                        settingsAnonToggle.style.fontSize = '20px';
                        settingsAnonToggle.style.color = 'white';
                        settingsAnonToggle.style.border = 'thin solid silver';
                        settingsAnonToggle.style.padding = '5px';
                        settingsAnonToggle.style.maxWidth = '25%';
                        settingsAnonToggle.style.float = 'left';

                        var settingsAnonToggleCheckbox = document.createElement('input');
                        settingsAnonToggleCheckbox.setAttribute("type", "checkbox");
                        if (settings.anonToggle == true){
                            settingsAnonToggleCheckbox.checked = true;
                        };
                        settingsAnonToggleCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.anonToggle = true;
                                toggleAnonStatus();
                            } else {
                                settings.anonToggle = false;
                                toggleAnonStatus();
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsAnonToggle.appendChild(settingsAnonToggleCheckbox);
                        return settingsAnonToggle
                    };

                    function settingsLiveRestore(){
                        var settingsLiveRestore = document.createElement('div');
                        settingsLiveRestore.innerText = 'Restore live timer to nav bar. ';
                        settingsLiveRestore.style.minWidth = '25%';
                        settingsLiveRestore.style.fontSize = '20px';
                        settingsLiveRestore.style.color = 'white';
                        settingsLiveRestore.style.border = 'thin solid silver';
                        settingsLiveRestore.style.padding = '5px';
                        settingsLiveRestore.style.maxWidth = '25%';
                        settingsLiveRestore.style.float = 'left';

                        var settingsLiveRestoreCheckbox = document.createElement('input');
                        settingsLiveRestoreCheckbox.setAttribute("type", "checkbox");
                        if (settings.liveRestore == true){
                            settingsLiveRestoreCheckbox.checked = true;
                        };
                        settingsLiveRestoreCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.liveRestore = true;
                            } else {
                                settings.liveRestore = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsLiveRestore.appendChild(settingsLiveRestoreCheckbox);
                        return settingsLiveRestore
                    };

                    function settingsLiveLight(){
                        var settingsLiveLight = document.createElement('div');
                        settingsLiveLight.innerText = 'Light mode live timer. ';
                        settingsLiveLight.style.minWidth = '25%';
                        settingsLiveLight.style.fontSize = '20px';
                        settingsLiveLight.style.color = 'white';
                        settingsLiveLight.style.border = 'thin solid silver';
                        settingsLiveLight.style.padding = '5px';
                        settingsLiveLight.style.maxWidth = '25%';
                        settingsLiveLight.style.float = 'left';

                        var settingsLiveLightCheckbox = document.createElement('input');
                        settingsLiveLightCheckbox.setAttribute("type", "checkbox");
                        if (settings.liveLight == true){
                            settingsLiveLightCheckbox.checked = true;
                        };
                        settingsLiveLightCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.liveLight = true;
                            } else {
                                settings.liveLight = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsLiveLight.appendChild(settingsLiveLightCheckbox);
                        return settingsLiveLight
                    };

                    function settingsAuthorHighlight(){
                        var settingsAuthorHighlight = document.createElement('div');
                        settingsAuthorHighlight.innerText = 'Highlight author(s) in chat. ';
                        settingsAuthorHighlight.style.minWidth = '25%';
                        settingsAuthorHighlight.style.fontSize = '20px';
                        settingsAuthorHighlight.style.color = 'white';
                        settingsAuthorHighlight.style.border = 'thin solid silver';
                        settingsAuthorHighlight.style.padding = '5px';
                        settingsAuthorHighlight.style.maxWidth = '25%';
                        settingsAuthorHighlight.style.float = 'left';

                        var settingsAuthorHighlightCheckbox = document.createElement('input');
                        settingsAuthorHighlightCheckbox.setAttribute("type", "checkbox");
                        if (settings.authorHighlight == true){
                            settingsAuthorHighlightCheckbox.checked = true;
                        };
                        settingsAuthorHighlightCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.authorHighlight = true;
                            } else {
                                settings.authorHighlight = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsAuthorHighlight.appendChild(settingsAuthorHighlightCheckbox);
                        return settingsAuthorHighlight
                    };

                    function settingsLightHighlight(){
                        var settingsLightHighlight = document.createElement('div');
                        settingsLightHighlight.innerText = 'Light mode highlighting. ';
                        settingsLightHighlight.style.minWidth = '25%';
                        settingsLightHighlight.style.fontSize = '20px';
                        settingsLightHighlight.style.color = 'white';
                        settingsLightHighlight.style.border = 'thin solid silver';
                        settingsLightHighlight.style.padding = '5px';
                        settingsLightHighlight.style.maxWidth = '25%';
                        settingsLightHighlight.style.float = 'left';

                        var settingsLightHighlightCheckbox = document.createElement('input');
                        settingsLightHighlightCheckbox.setAttribute("type", "checkbox");
                        if (settings.highlightLightToggle == true){
                            settingsLightHighlightCheckbox.checked = true;
                        };
                        settingsLightHighlightCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.highlightLightToggle = true;
                            } else {
                                settings.highlightLightToggle = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsLightHighlight.appendChild(settingsLightHighlightCheckbox);
                        return settingsLightHighlight
                    };

                    var settingsActual = document.createElement('div');
                    settingsActual.style.borderBottom = 'thin solid white';
                    settingsActual.style.padding = '5px';

                    var settingsActualText = document.createElement('div');
                    settingsActualText.innerText = 'Script Settings';
                    settingsActualText.style.minWidth = '100%';
                    settingsActualText.style.fontSize = '20px';
                    settingsActualText.style.color = 'white';

                    //Settings Checkboxes
                    settingsActual.appendChild(settingsAnonToggle());
                    settingsActual.appendChild(settingsRollerToggle());
                    settingsActual.appendChild(settingsNamefagToggle());
                    settingsActual.appendChild(settingsImageResize());
                    settingsActual.appendChild(settingsLiveRestore());
                    settingsActual.appendChild(settingsLiveLight());
                    settingsActual.appendChild(settingsAuthorHighlight());
                    settingsActual.appendChild(settingsLightHighlight());
                    settingsActual.appendChild(settingsRemoveBlankTopics());
                    settingsActual.appendChild(settingsFormRemove());
                    settingsActual.appendChild(settingsTagBlacklist());
                    settingsActual.appendChild(settingsChatBlacklist());
                    settingsActual.appendChild(settingsAuthorBlacklist());
                    settingsActual.prepend(settingsActualText);

                    var settingsTop = document.createElement('div');
                    settingsTop.innerText = 'Script Config';
                    settingsTop.style.fontSize = '30px';
                    settingsTop.style.color = 'white';
                    settingsTop.style.borderBottom = 'thin solid white';
                    settingsTop.style.padding = '5px';

                    function settingsBlacklist(){
                        var settingsAlertBox = document.createElement('div');
                        settingsAlertBox.setAttribute('id', 'settingsAlertBox');
                        settingsAlertBox.style.marginBottom = '5px';

                        var settingsAlertAdd = document.createElement('input');
                        settingsAlertAdd.setAttribute("type", "button");
                        settingsAlertAdd.style.height = '30px';
                        settingsAlertAdd.value = 'Blacklist Current Quest';
                        settingsAlertAdd.onclick = function (){
                            try{
                                let author = document.querySelector('span.author span.name').innerText;
                                let title = document.querySelector('header.page-title').innerText;
                                let entry = title + '___' + author;
                                settings.alertBlacklist.push(entry);
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settingsBlacklist.appendChild(elementBlacklisted(entry));

                            }catch(error){
                                console.log('Something went wrong when trying to blacklist this quest. You did try it on a quest, RIGHT?',error);
                            }
                        };

                        var settingsBlacklist = document.createElement('div');
                        settingsBlacklist.setAttribute('id', 'settingsBlacklist');
                        settingsBlacklist.style.borderBottom = 'thin solid white';
                        settingsBlacklist.style.padding = '5px';
                        settings.alertBlacklist.forEach(element => settingsBlacklist.appendChild(elementBlacklisted(element)));

                        var settingsBlacklistText = document.createElement('div');
                        settingsBlacklistText.innerText = 'Alert Blacklist';
                        settingsBlacklistText.style.marginBottom = '5px';
                        settingsBlacklistText.style.minWidth = '100%';
                        settingsBlacklistText.style.fontSize = '20px';
                        settingsBlacklistText.style.color = 'white';

                        settingsAlertBox.prepend(settingsAlertAdd);
                        settingsBlacklist.prepend(settingsAlertBox);
                        settingsBlacklist.prepend(settingsBlacklistText);
                        return settingsBlacklist;
                    };

                    var settingsExit = document.createElement('a');
                    settingsExit.innerText = 'Exit'
                    settingsExit.style.color = 'white'
                    settingsExit.style.fontSize = '30px'
                    settingsExit.style.border = '3px solid red'
                    settingsExit.style.backgroundColor = 'red'
                    settingsExit.style.float = 'right'
                    settingsExit.style.paddingLeft = '5px'
                    settingsExit.style.paddingRight = '5px'
                    settingsExit.onclick = function(){document.querySelector('#confDisp').style.display = 'none'};


                    settingsTop.appendChild(settingsExit)
                    var confDisp = configDisplay();
                    var confBox = configBox();
                    confBox.appendChild(settingsTop);
                    confBox.appendChild(settingsActual);
                    confBox.appendChild(settingsTagsBlacklist());
                    confBox.appendChild(settingsUserBlacklist());
                    confBox.appendChild(settingsAuthorsBlacklist());
                    confBox.appendChild(settingsBlacklist());
                    confDisp.appendChild(confBox);
                    document.querySelector('body').prepend(confDisp);
                }
            }catch (error){
                console.log('Settings Display Error',error);
            };
        };

        function settingsOpen(){
            var myLive = document.createElement('li');
            myLive.setAttribute('id', 'confScript');
            myLive.style.textShadow = '-1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000';
            myLive.style.fontWeight = 'bold';

            var configOpen = document.createElement('a');
            configOpen.innerText = 'Config';
            configOpen.onclick = function(){document.querySelector('#confDisp').style.display = 'block'};
            myLive.appendChild(configOpen);
            return myLive
        };

        function settingsInsert(){
            try{
                let mainMenu = document.querySelector('nav#mainMenu');
                settingsDisplay()
                if (!(mainMenu.querySelector('#confScript'))){
                    mainMenu.childNodes[2].appendChild(settingsOpen());
                }
            }catch (error){console.log('Errors inserting Settings',error)};
        };

        settingsInsert()
    };


    pageCheck();
    monitorAlerts();
    awaitMainMenu();
    // Your code here...
})();