Fiction.Live Merged

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

As of 2021-02-19. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Fiction.Live Merged
// @namespace    http://tampermonkey.net/
// @version      43.7
// @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==
(function () {
    'use strict';
    function insertCSS() {
        var css = `
    	#loginMenu .dropdown-menu{right:-6.2em;}
    	#confBox,
    	#scriptTitle,
    	#scriptTitle h1,
    	#reportDiv,
    	#reportDiv *,
    	#settingsAlertBox,
    	#settingsAlertBox *,
    	#styleEntries,
    	#styleEntries *,
    	#settingsBlacklist,
    	#settingsBox,
    	#settingsBox *,
    	#styleInput,
    	.toggleBtn,
    	.cssBtn,
    	.settingsToggle,
    	.settingsToggle div,
    	.settingsTab,
    	.settingsTab .entryTitle,
    	.settingsSelect,
    	.blacklistEntry {
    		background: #2a2c3b !important;
    		color:white !important;
    	}
    	#confDisp {
    		height: 100%;
    		position: fixed;
    		top: 0;
    		bottom: 0;
    		left: 0;
    		right: 0;
    		z-index: 9999;
    		display: none;
    		overflow-y: auto;
    		pointer-events: auto;
    	}
    	#confBox * {
    		background: #2a2c3b;
    	}
    	#confBox {
    		height: auto;
    		min-height: 60%;
    		background: #2a2c3b;
    		width: auto;
    		min-width: 60%;
    		position: relative;
    		top: 10px;
    		margin: 10%;
    		padding: 1%;
    		display: flex;
    		flex-flow: column;
    		background: #2a2c3b;
    		box-shadow: 0 0 10px #000000;
    		pointer-events: auto;
    	}
    	#scriptTitle * {
    		margin: 0;
    		display: inline;
    	}
    	#scriptTitle{
    	}
    	.settingsSelect {
    		max-height: 80px;
    		padding-top: 5px;
    	}
    	.settingsSelectDiv {
    		display: inline-block;
    		background: #4b4f6b;
    		box-sizing:border-box;
    		height: 2em;
    	}
    	.settingsSelectBTN {
    		width: 100% !important;
    		height: 100%;
    		font-size: 20px;
    		color: white !important;
    		text-decoration: none;
    		background: #373952 !important;
    		box-sizing: border-box;
    		border: 1px #21222b solid;
    	}
    	.settingsSelectBTN:disabled {
    		background: #4b4f6b !important;
    	}
    	.settingsTab {
    		padding: 5px;
    		display: none;
    	}
    	.entryTitle {
    		min-width: 100%;
    		font-Size: 20px;
    		color:white !important;
    	}
    	.settingsToggle {
    		min-height: 37px;
    		max-height: 37px;
    		min-width: 25%;
    		max-width: 25%;
    		color: white;
    		border: thin solid silver;
    		padding: 5px;
    		float: left;
    	}
    	.toggleCheck {
    		-webkit-appearance: none;
    		background: white !important;
    		color:black !important;
    		padding: 9px;
    		display: inline-block;
    		position: relative;
    		height: 100% !important;
    		max-height: 100% !important;
    		margin-top: 0 !important;
    		margin-bottom: 0 !important;
    		margin-left: 5px !important;
    		margin-right: 0 !important;
    		color: black;
    		font-size: 20px;
    	}
    	.toggleCheck:active,
    	.toggleCheck:checked:active {
    	}
    	.toggleCheck:checked {
    	}
    	.toggleCheck:checked:after {
    		content: '\\2714';
    	}
    	.toggleCheck:after {
    		content: '\\2716';
    		position: absolute;
    		top: -5px;
    		left: 1px;
    	}
    	#settingsBlacklist {
    		padding: 5px;
    	}
    	#settingsBox {
    		margin-bottom: 5px;
    	}
    	.settingsInput {
    		color: white;
    		max-width: 40%;
    		height: 30px;
    		margin: 0 !important;
    	}
    	.blacklistEntry {
    		font-size: 20px;
    		float: left;
    		min-width: 50%;
    		color: white;
    		display: inline-block;
    		border: thin solid silver;
    		padding: 5px;
    	}
    	.blacklistEntry p {
    		margin:0;
    		display:inline;
    		font-size:20px !important;
    	}
    	.blacklistRemove {
    		color: white !important;
    		font-size: 20px;
    		display: inline-block;
    		border: 3px solid red;
    		background: red !important;
    		float: right;
    		padding-left: 5px;
    		padding-right: 5px;
    		-webkit-touch-callout: none;
    		-webkit-user-select: none;
    		-khtml-user-select: none;
    		-moz-user-select: none;
    		-ms-user-select: none;
    		user-select: none;
    	}
    	.blacklistRemove:hover {
    		color: white;
    	}
    	#settingsAlertBox {

    	}
    	#styleEntries {

    	}
    	.styleEntry * {
    		display: inline-block;
    		vertical-align: unset;
    	}
    	.styleEntry {
    		display: inline-block;
    		border: thin solid black;
    		padding: 2px 4px 0 4px;
    		margin: 0 5px 5px 5px;
    		background: #373952;
    	}
    	.styleTitle {
    		margin: 0;
    		height: 100%;
    	}
    	.colorSet {
    		width: 7em;
    		margin: 0 1em 0.25em 1em !important;
    		color: white;
    		max-width: 40%;
    		height: 30px;
    	}
    	.colorPick * {
    		all: unset;
    	}
    	.colorPick {
    		width: 25px !important;
    		height: 1.5em !important;
    		border: none !important;
    		padding: 0 !important;
    		margin: 0 0 0.25em 0 !important;
    	}
    	#styleInput {
    		height: 500px;
    		resize: none;
    	}

    	#liveBox {
    		display: block;
    		height: 100%;
    		width: auto;
    		float: right;
    		padding-left: 1%;
    		padding-right: 1%;
    		border-left: solid;
    		border-Right: solid;
    		border-color: #323448;
    		box-sizing: border-box;
    		font-weight: bold;
    		color: white;
    		text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
    	}
    	.blacklist {
    		height: auto;
    		width: 0px;
    	}
    	.linkDiv {
    		width: 100%;
    		overflow: auto;
    	}

    	.linkDiv img {
    		width: 100%;
    		display: block;
    	}
    	.functionalLink {
    		padding: 0.5em;
    	}
    	.functionalContainer {
    		position: relative;
    		width: 100%;
    		padding-bottom: 100%;
    	}
    	.functionalVideo {
    		position: absolute;
    		width: 100%;
    		height: 100%;
    	}
    	.toggleBtn {
    		//-webkit-appearance: none;
    		//padding: 9px;
    		//border-radius: 3px;
    		//display: inline-block;
    		//position: relative;
    		//height:100% !important;
    		//max-height:100% !important;
    		//margin-top:0 !important;
    		//margin-bottom:0 !important;
    		//margin-left:5px !important;
    		//margin-right:0 !important;
    		border: solid #393a4d;
    		border-width: 1px 1px 1px 1px;
    		box-shadow: 1px 1px 1px 1px #4f516b;
    	}
    	.msgModBox{
    		display: none;
    		padding-bottom:0.5em;
    	}
    	.msgMod {
    		width: auto;
    		color: white;
    		font-weight: bold;
    		padding: 0 0.5em 0 0.5em;
    		margin: 0 3em 0 0;
    	}
	    	.msgMod.edit {
    		display: none;
    	}
    	.vis .msgModBox {
    		display: initial;
    	}
    	.vis.editMode .msgModBox .msgMod.edit {
    		display: initial;
    	}
    	.contactMain, .contactL, .contactR, .topicMessage{
    		background:#2a2c3b !important;
    		color:white !important;
    	}
    	.contactL{float:left;width:50%;}
    	.contactR{float:right;width:50%;}
    	.contactR input{
    		background:#2a2c3b !important;
    	}
    	.topicMessage{
    		resize:none;
    	}
    	.colors{
    		background:#2a2c3b !important;
    		color:white !important;
    	}


            `;
        var style = document.createElement('style');

        if (style.styleSheet) {
            style.styleSheet.cssText = css;
        } else {
            style.appendChild(document.createTextNode(css));
        };
        document.getElementsByTagName('head')[0].appendChild(style);
    }
    insertCSS()

    var rolled = false;
    var lastURL = window.location.href;
    var settings = JSON.parse(localStorage.getItem('FL_Settings'));
    var defaultSettings = {
        'imageResize': true,
        'questRemove': true,
        'questAuthorRemove': true,
        'removeTaggedAuthor': false,
        'anonToggle': false,
        'removeUsernames': false,
        'autoRoller': false,
        'removeTopicForm': true,
        'removeBlankTopics': true,
        'authorHighlight': true,
        'authorBlacklist': [],
        'chatBlacklist': false,
        'chatBlacklistReplies': true,
        'chatBlacklisted': [],
        'tagBlacklist': [],
        'alertBlacklist': [],
        'sortAlerts': false,
        'highlightColor': '#393c59',
        'highlightLight': '#fc8c03',
        'highlightLightToggle': false,
        'liveRestore': true,
        'liveLight': false,
        'functionalLinks': false,
        'functionalVideos': false,
        'removeNSFW': false,
        'updateRequestDismiss': false,
        'alertContainer': 999,
        'akunPlus': 'Ignore',
        'customCSS': [{}, ``],
        'userReveal':false,
        'unpublishBTN':false,
        'messageEdit':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]
                    };
                });
        }
    };

    localStorage.setItem('FL_Settings', JSON.stringify(settings));
    var USERNAME = getUser();

    function getUser(){
        try{
            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_', '')
                    USERNAME = JSON.parse(decodeURIComponent(cookie[1])).distinct_id
                    break
                }
            }
            return USERNAME
        }catch(error){
            console.log('Username detect failed',error);
            return ''
        };
    };

    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 removeNSFW(){
        if (settings.removeNSFW == true) {
            Array.from(document.getElementsByClassName('nsfwCover')).forEach(qst=>qst.classList.remove('nsfwCover'));
        }
    }

    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=%2Froll+`) + 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);
        }
    }

    //Ignored as the same can be done with default behaviour
    function externalImage() {
        var externalInput = ''
        var chatInput = document.querySelector('form.chatInputContainer')
        chatInput.appendChild(externalInput)

        var latestUpdate = document.querySelector('div#storyPosts').firstChild.lastChild;
        var dataID = latestUpdate.getAttribute('data-id');
        var questID = document.querySelector('article.chat').getAttribute('chat');
        var img = encodeURIComponent('https://i.pximg.net/img-original/img/2020/12/09/18/17/11/86193328_p9.png');
        function x() {
            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": `${window.location}`,
                "body": `r%5B%5D=${questID}&r%5B%5D=${dataID}&nt=chat&i=${img}&ra%5Bhide%5D=true&ra%5B_id%5D=${dataID}&ra%5Bb%5D=chapter+${dataID}`,
                "method": "POST",
                "mode": "cors"
            });
        }

    }

    function autoRoll(change) {
        if (settings.autoRoller != true) {
            return;
        };
        try {
            var rollRegex = /[0-9]+d[0-9]+(?<!1d1)(\+[0-9]+)?( ?)(([ie]+)?([ut][0-9]+)?)+/
            if (rollRegex.test(change.innerText)) {
                var roll = change.innerText.match(rollRegex)[0];
                var latestUpdate = document.querySelector('div#storyPosts').firstChild.lastChild;
                var poll = latestUpdate.firstChild.firstChild;
                if (latestUpdate.classList.contains('readerPost') == false || poll.classList.contains('closed')) {
                    return
                } else if (!(poll.classList.contains('closed'))) {
                    var dataID = latestUpdate.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)}`;
                    if (rolled == false) {
                        chatSend([[chapterID, dataID, roll], template]);
                        rolled = true;
                        poll.classList.add('rolled');
                        setTimeout(function () {
                            rolled = false
                        }, 5000);
                    }
                }
            }
        } catch (error) {}
    }

    function authorCheck(quest) {
        if (/fiction.live\/explore.*/.test(window.location)){return}
        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]);
            }
        };
    };

    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');
        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 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, {
            childList: true,
            subtree: true
        });
        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);
                                    }
                                    removeNSFW();

                                }
                                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) {
                                            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 exploreBlacklistCheck(){
        function checkTagGroup(x){
            if (settings.tagBlacklist.includes(x.querySelector('h2').innerText.replace('/',''))){
                x.remove();
            }else{
                var tags = x.getElementsByClassName('displayedTag');
                let tt=function(tag){
                    if (settings.tagBlacklist.includes(tag.innerText)){
                        tag.closest('.embla__slide').remove()
                    }
                }
                Array.from(tags).forEach(tag=>{tt(tag)});
            }

        }

        function elementAwaitExplore(mutations) {
            for (let mutation of mutations) {
                try {
                    let topic = mutation.addedNodes[0];
                    if (topic) {
                        try {
                            if (!topic.classList){continue};
                            if (topic.classList.contains('popular-tags-list')){
                                observerTopic.disconnect();
                                Array.from(topic.children).forEach(tag=>{checkTagGroup(tag)});
                                removeNSFW()
                            };

                        } catch (error) {
                            console.log(error)
                        }

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

            };
        };

        let observerTopic = new MutationObserver(elementAwaitExplore);
        observerTopic.observe(document, {childList: true, subtree: true});
        questCheck.observerTopic = observerTopic;
    };

    function foryouBlacklistCheck(){
        function checkTag(storyListing){
            try{
                var tag = storyListing.getElementsByClassName('displayedTag')[0]
                if (!tag || tag.length == 0){return}
                if (settings.tagBlacklist.includes(tag.innerText)){
                    storyListing.parentNode.remove()
                }}catch(error){}
        };
        function checkAuthor(storyListing){
            try{
                var name = storyListing.querySelector('span.name').innerText
                if (!name || name.length == 0){return}
                if (settings.authorBlacklist.includes(name)){
                    storyListing.parentNode.remove()
                }}catch(error){}
        };

        function elementAwaitForYou(mutations) {
            for (let mutation of mutations) {
                try {
                    var topic = mutation.addedNodes[0];
                    if (topic) {
                        try {
                            if (!topic.classList){return}
                            if (topic.classList.contains('storyListItem')){}
                            var SLIs=document.getElementsByClassName('storyListItem');
                            //console.log('SLIs',SLIs)
                            if (!SLIs || topic.id != 'main'){continue};
                            if (SLIs){
                                observerTopicx.disconnect();
                                Array.from(SLIs).forEach(SLI=>{checkTag(SLI)});
                                Array.from(SLIs).forEach(SLI=>{checkAuthor(SLI)});
                                removeNSFW();
                            };
                        } catch (error) {
                            console.log(error);
                        }
                    }
                    removeNSFW();
                } catch (error) {
                    console.log('New quest Error', error);
                }
            };
        };

        let observerTopicx = new MutationObserver(elementAwaitForYou);
        observerTopicx.observe(document, {childList: true, subtree: true});
        questCheck.observerTopic = observerTopicx;
    };

    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\/social\/threads\/).*/.test(URL)) {
                //mainThings();
                chatThings();
            } 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 if (/.*fiction.live\/explore/.test(URL)) {
                exploreBlacklistCheck()
            } else if (/.*fiction.live\/foryou/.test(URL)) {
                foryouBlacklistCheck()
            } else if (/.*fiction.live\/user\/.*\/(stories$||collections\/.*)/.test(URL)) {
                if (settings.removeTaggedAuthor == true) {
                    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 chatThings() {
        document.addEventListener("click", function (e) {
            function fetchMessages() {
                b.querySelector('.jadeRepeat').childNodes.forEach(d => handleMsg(d))
            }
            if (e.target.matches(".expandComments.showWhenDiscussionOpened")) {
                var b = e.target.parentNode.parentNode.parentNode
                setTimeout(fetchMessages, 500);
            }
        });

        function chatBlacklist(message) {
            try{
                //var ID = document.querySelector('article.threads').getAttribute('threads');
                let username = message.querySelector('.user span').innerText;
                if (settings.chatBlacklist != true || settings.chatBlacklisted.length == 0) {
                    return;
                };
                if (settings.chatBlacklisted.includes(username)) {
                    //message.remove();
                    message.style.display = 'none';
                    message.classList.add('chatListed');
                    return;
                } else {
                    if (settings.chatBlacklistReplies == true) {
                        replyCheck();
                    }
                };
                async function replyCheck() {
                    let msgData = '';
                    if (message.querySelector('.replyAt')) {
                        //console.log(message);
                        await fetch(`https://fiction.live/api/node/${message.firstChild.getAttribute('data-id')}`).then(response => response.json()).then(data => {
                            msgData = data
                        });
                        if (settings.chatBlacklisted.includes(msgData.ra.u.n)) {
                            message.style.display = 'none';
                            setTimeout(function () {
                                try {
                                    document.querySelectorAll('.chatListed').forEach(mm => mm.remove())
                                } catch (error) {
                                    console.log(error)
                                }
                            }, 500);
                        }
                    }
                };
                async function delMSG(name) {
                    try {
                        var msgID = message.firstChild.getAttribute('data-id');
                    } catch (error) {
                        console.log('id fail')
                    }

                    try {}
                    catch (error) {
                        console.log('error')
                    }
                    try {
                        if (name == message.querySelector('div.user span').innerText) {
                            message.remove();
                            return;
                        } else {
                            var commentName = '';
                            var replyName = '';
                            var msgData = '';

                            await fetch("https://fiction.live/api/node/" + msgID, {}).then(response => response.json()).then(data => {
                                msgData = data
                            });

                            commentName = msgData.u[0].n
                            try {
                                replyName = msgData.ra.u.n
                            } catch (error) {
                                console.log('reply fail')
                            }
                            if (settings.chatBlacklisted.includes(replyName)) {
                                //console.log('reply',document.querySelector(`[data-id="${msgID}"]`))
                                message.remove()
                            } else if (settings.chatBlacklisted.includes(commentName)) {
                                //console.log('comment',document.querySelector(`[data-id="${msgID}"]`))
                                message.remove()
                            }
                        }
                    } catch (error) {
                        console.log('total fail', message.parentNode)
                    };
                };
            } catch (error) {}
        };

        function akunPlus(message) {
            try {
                if (settings.akunPlus == 'Ignore') {
                    return;
                } else if (settings.akunPlus == 'Remove') {
                    message.querySelector('.chatMsg').removeAttribute('plan');
                } else {
                    message.querySelector('.chatMsg').setAttribute('plan', '1');
                }
            } catch (error) {
                //console.log(message.querySelector('span.name'),message.querySelector('.message').innerText,error)
            }
        };

        function functionalLinks(message) {
            try{
                try {
                    if (message.querySelector('.message').querySelector('img')) {
                        return;
                    }
                } catch (error) {}
                let Control = [0, 0, 0]
                var elmDiv = document.createElement('div');
                elmDiv.setAttribute('class', 'linkDiv');
                var elmDivControl = document.createElement('div');

                var elmDivControlA = document.createElement('input');
                elmDivControlA.setAttribute("type", "button");
                elmDivControlA.setAttribute("hide", 'false');
                elmDivControlA.value = 'Disable Link(s)'
                elmDivControlA.onclick = function () {
                    if (this.getAttribute('hide') == 'true' || null) {
                        this.setAttribute('hide', 'false');
                        this.value = 'Disable Link(s)';
                        this.parentNode.parentNode.querySelector('.linkDivA').style.display = 'initial';
                    } else {
                        this.setAttribute('hide', 'true');
                        this.value = 'Enable Link(s)';
                        this.parentNode.parentNode.querySelector('.linkDivA').style.display = 'none';
                    }
                }

                var elmDivControlB = document.createElement('input');
                elmDivControlB.setAttribute("type", "button");
                elmDivControlB.setAttribute("hide", 'false');
                elmDivControlB.value = 'Disable Image(s)'
                elmDivControlB.onclick = function () {
                    if (this.getAttribute('hide') == 'true' || null) {
                        this.setAttribute('hide', 'false');
                        this.value = 'Disable Image(s)';
                        this.parentNode.parentNode.querySelector('.linkDivB').style.display = 'initial';
                    } else {
                        this.setAttribute('hide', 'true');
                        this.value = 'Enable Image(s)';
                        this.parentNode.parentNode.querySelector('.linkDivB').style.display = 'none';
                    }
                }

                var elmDivControlC = document.createElement('input');
                elmDivControlC.setAttribute("type", "button");
                elmDivControlC.setAttribute("hide", 'false');
                elmDivControlC.value = 'Disable Video(s)'
                elmDivControlC.onclick = function () {
                    if (this.getAttribute('hide') == 'true' || null) {
                        this.setAttribute('hide', 'false');
                        this.value = 'Disable Video(s)';
                        this.parentNode.parentNode.querySelector('.linkDivC').style.display = 'initial';
                    } else {
                        this.setAttribute('hide', 'true');
                        this.value = 'Enable Video(s)';
                        this.parentNode.parentNode.querySelector('.linkDivC').style.display = 'none';
                    }
                }

                var elmDivA = document.createElement('div');
                elmDivA.setAttribute('class', 'linkDivA');
                elmDiv.appendChild(elmDivA);

                var elmDivB = document.createElement('div');
                elmDivB.setAttribute('class', 'linkDivB');
                elmDiv.appendChild(elmDivB);

                var elmDivC = document.createElement('div');
                elmDivC.setAttribute('class', 'linkDivC');
                elmDiv.appendChild(elmDivC);

                function link(type, type2, link) {
                    var elm = document.createElement(type);
                    if (type2 == 1) {
                        elm.src = link;
                        elmDiv.childNodes[1].appendChild(elm);
                    } else if (type2 == 2) {
                        elm.href = link;
                        elm.innerHTML = 'Link';
                        elm.setAttribute('class', 'functionalLink');
                        elm.rel = "noopener noreferrer";
                        elm.target = "_blank";
                        elmDiv.childNodes[0].appendChild(elm);
                    } else if (type2 == 3) {
                        elm = document.createElement('iframe');
                        elm.setAttribute('frameborder', '0')
                        elm.setAttribute('allowFullScreen', '')
                        elm.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';
                        elm.src = link;
                        elm.setAttribute('class', 'functionalVideo');
                        let functionalContainer = document.createElement('div');
                        functionalContainer.setAttribute('class', 'functionalContainer');
                        functionalContainer.appendChild(elm);
                        elmDiv.childNodes[2].appendChild(functionalContainer);
                    }
                    return elmDiv
                }

                function linkProcess(match) {
                    try {
                        //If theres already a link container, check if the links been embedded
                        if (message.querySelector('.linkDiv')) {
                            var qq = message.querySelector('.linkDiv').querySelectorAll('a').forEach(
                                x => {
                                    if (x.href == match) {
                                        return;
                                    };
                                });
                        };
                    } catch (error) {
                        console.log(error);
                    };
                    if (typeof match == 'undefined' || match.startsWith('/') || match.length < 5 || /.+\..+/.test(match) == false) {}
                    else {
                        try {
                            if (/([a-z]*\.{2,}[a-z]*)/.test(match) == true) {
                                return
                            };
                            var elm;
                            if (/https?:\/\//.test(match) == false) {
                                match = 'https://'.concat(match)
                            };
                            if (/.*(jpg|jpeg|png|gif|webm|webp)/.test(match)) {
                                elm = new link('img', 1, match);
                                Control[1] = 1;

                            } else if (settings.functionalVideos == true && /youtube/.test(match)) {
                                if (/.*v=(\w+).*/.test(match)) {
                                    let src = `https://www.youtube.com/embed/${(match.match(/v=(\w+)/)[1])}`;
                                    elm = new link('iframe', 3, `https://www.youtube.com/embed/${(match.match(/v=(\w+)/)[1])}`);
                                    message.querySelector('.chatMsg').parentNode.appendChild(elm);
                                } else if (/be\/(\w+)/.test(match)) {
                                    let src = `https://www.youtube.com/embed/${(match.match(/be\/(\w+)/)[1])}`;
                                    elm = new link('iframe', 3, `https://www.youtube.com/embed/${(match.match(/be\/(\w+)/)[1])}`)
                                    message.querySelector('.chatMsg').parentNode.appendChild(elm);
                                }
                                Control[2] = 1;
                            } else {
                                elm = new link('a', 2, match);
                                Control[0] = 1;
                            }
                        } catch (error) {
                            console.log(error)
                        };
                    }
                };

                if (settings.functionalLinks != true) {return;};
                try {
                    //var regex = new RegExp(/(https?:\/\/(www\.)?)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)*/g);
                    var regex = new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)*/g);
                    var text = message.querySelector('div.fieldBody').innerText;
                    if (regex.test(text)) {
                        var matches = text.match(regex), mCount = 0;
                        matches.forEach(match => linkProcess(match));

                        if (Control[0] == 1) {
                            elmDivControl.appendChild(elmDivControlA);
                        };
                        if (Control[1] == 1) {
                            elmDivControl.appendChild(elmDivControlB);
                        };
                        if (Control[2] == 1) {
                            elmDivControl.appendChild(elmDivControlC);
                        };
                        elmDiv.prepend(elmDivControl);
                        message.querySelector('.chatMsg').parentNode.appendChild(elmDiv);
                        let bounding = message.getBoundingClientRect();
                        if(isVisible(message) == true){
                            message.scrollIntoView();
                        }
                    };
                } catch (error) {
                    //console.log(error)
                }
            } catch (error) {}
        };

        function isVisible(element){
            let bounding = element.getBoundingClientRect();
            if(bounding.top >= 0 && bounding.left >= 0 &&
               bounding.right <= (window.innerWidth || document.documentElement.clientWidth) &&
               bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight))
            {
                return true;
            }else{
                return false;
            }
        }

        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 {
                    if (authors.includes(message.querySelector('span.name').innerText)) {
                        message.querySelector('span.name').style.display = 'initial';
                        return;
                    } else {
                        setTimeout(function () {
                            try {
                                message.querySelector('img.avatar').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}
        };

        async function userReveal(message){
            if (settings.userReveal != true){return}
            try{
                //Gets the userID
                if (message.querySelector('.user span').innerText != 'anon'){return;}
                //console.log('gotMSG')
                var messageID=message.firstChild.getAttribute('data-id')
                var returnedData=message.firstChild.getAttribute('data-id')
                try{
                    await fetch(`https://fiction.live/api/node/${messageID}`).then(response => response.json()).then(data => {returnedData=data});
                    if (!returnedData.u[0]._id){
                        //console.log('no _id')
                        //console.log(returnedData.u)
                        return;
                    };
                    //console.log('got_id',returnedData.u[0]._id)
                    var userID=returnedData.u[0]._id;
                    await fetch(`https://fiction.live/api/anonkun/userCollections/${userID}`, {
                    }).then(response => response.json()).then(data => {userID=data});
                    //console.log(userID)
                    if (userID.length == 0){
                        //console.log('len=0',userID,message);
                        return}
                    message.querySelector('.user span').innerText=userID[0].u[0].n;
                }catch(error){
                    //console.log('no collections',message,error);
                    return;
                }
            }catch(error){
                //console.log(error);
                return;
            }
        };

        function messageEdit(message){
            try{
                if (!message.querySelector('span.name') || USERNAME == ''){return}
            } catch (error) {//console.log('err',error);
            }
            try{
                if (message.querySelector('span.name').innerText != USERNAME){return;}
                let messageID=message.firstChild.getAttribute('data-id');
                let messageCont = document.createElement('div');
                messageCont.setAttribute('class','msgModBox')

                let messageEdit = document.createElement('input');
                messageEdit.setAttribute('type','button')
                messageEdit.setAttribute('class','msgMod const')
                messageEdit.onclick = editMsg;
                messageEdit.value = 'Open Edit Mode';
                messageCont.appendChild(messageEdit)
                function editMsg(){
                    if (settings.messageEdit != true){return}
                    if (messageEdit.closest('.logItem').classList.contains('editMode')){
                        messageEdit.value = 'Open Edit Mode';
                        messageEdit.closest('.logItem').classList.remove('editMode');
                        message.children[2].remove();
                        message.children[1].style.display = '';
                    }
                    else{
                        messageEdit.value = 'Close Edit Mode';
                        messageEdit.closest('.logItem').classList.add('editMode')
                        var messageText = document.createElement('textarea');
                        messageText.setAttribute('placeholder', 'Add any more complicated CSS here.');
                        messageText.setAttribute("cols", "1");
                        messageText.setAttribute("rows", "5");
                        messageText.style.resize = 'none';
                        messageText.style.height = '100px';
                        fetch(`https://fiction.live/api/node/${messageID}`).then(response => response.json()).then(data => {messageText.value = data.b});
                        message.children[1].style.display = 'none';
                        message.appendChild(messageText)
                    }


                };

                let messageSave = document.createElement('input');
                messageSave.setAttribute('type','button')
                messageSave.setAttribute('class','msgMod edit')
                messageSave.onclick = saveMsg;
                messageSave.value = 'Save';
                messageCont.appendChild(messageSave)
                function saveMsg(){
                    let messageContent = encodeURI(message.children[2].value);
                    fetch("https://fiction.live/api/node", {
                        "headers": {
                            "User-Agent": "",
                            "Accept": "application/json, text/javascript, */*; q=0.01",
                            "Accept-Language": "en-GB,en;q=0.5",
                            "Content-Type": "application/json",
                            "X-Requested-With": "XMLHttpRequest"
                        },
                        "body": `{\"_id\":\"${messageID}\",\"b\":\"${messageContent}\"}`,
                        "method": "PUT",
                        "mode": "cors"
                    });

                    messageCont.closest('.logItem').classList.remove('editMode');
                    messageEdit.value = 'Open Edit Mode';
                    message.children[2].remove();
                    message.children[1].style.display = '';
                };

                let messageDiscard = document.createElement('input');
                messageDiscard.setAttribute('type','button')
                messageDiscard.setAttribute('class','msgMod edit')
                messageDiscard.onclick = discardMsg;
                messageDiscard.value = 'Discard';
                messageCont.appendChild(messageDiscard)
                function discardMsg(){
                    message.children[2].value = '';
                };

                let messageDelete = document.createElement('input');
                messageDelete.setAttribute('type','button')
                messageDelete.setAttribute('class','msgMod const')
                messageDelete.onclick = deleteMsg;
                messageDelete.value = 'Delete';
                messageCont.appendChild(messageDelete)
                function deleteMsg(){
                    if (settings.unpublishBTN != true){return}
                    fetch("https://fiction.live/api/node", {
                        "headers": {
                            "User-Agent": "",
                            "Accept": "application/json, text/javascript, */*; q=0.01",
                            "Content-Type": "application/json",
                            "X-Requested-With": "XMLHttpRequest"
                        },
                        "body": `{\"_id\":\"${messageID}\",\"trash\":true}`,
                        "method": "PUT",
                        "mode": "cors"
                    });
                    //messageDelete.remove()
                    message.remove()
                };
                message.prepend(messageCont)
            } catch (error) {
                //console.log('Error',error);
            }
        };

        function onX(message){
            message.addEventListener('mouseover',function(){
                if (this.querySelector('div.user span').innerText!=USERNAME){return;}
                this.classList.add('vis');
                if (isVisible(this)){this.scrollIntoView()}
                if (this.querySelectorAll('input').length <= 3){messageEdit(this)};
            })
            message.addEventListener('mouseout',function(){
                this.classList.remove('vis');
            })
        }

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

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

        function withOldMessage(chat) {
            var messages = chat.childNodes;
            try {
                messages.forEach(message => {
                    try {
                        chatBlacklist(message);
                        imageResize(message);
                        userReveal(message);
                        authorHighlight(message);
                        removeUsernames(message);
                        functionalLinks(message);
                        akunPlus(message);
                        onX(message);
                    } catch (error) {
                    };
                });
            } catch (error) {
                console.log('OldMsg', error)
            };
        };

        function handleMsg(message) {
            if (message.tagName == 'HEADER') {
                return;
            }try{
                chatBlacklist(message);
                imageResize(message);
                authorHighlight(message);
                functionalLinks(message);
                removeUsernames(message);
                akunPlus(message);
            } catch (error) {}
        }

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

            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();
                        var chatLog = document.querySelectorAll('article.chatLog')
                        for (var i = 0; i < chatLog.length; i++) {
                            whenNewMessage(chatLog[i].querySelector('div.jadeRepeat'));
                            withOldMessage(chatLog[i].querySelector('div.jadeRepeat'));
                        }
                        break;
                    };
                };
            };
        };

        waitForChat();
    };

    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('.settingsTab[name="Alerts"]').querySelector('div#settingsBlacklist').appendChild(elementBlacklisted(entry));
    };

    function blacklistCheck(alert) {
        function alertBlacklistButton(alert) {
            function createBlacklistButton() {
                var blacklistButton = document.createElement('a');
                blacklistButton.setAttribute('class', 'blacklist');
                blacklistButton.innerText = '∅';
                blacklistButton.onclick = blacklistAdd;
                return blacklistButton
            }
            alert.childNodes[0].after(createBlacklistButton());
        };
        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 {
                if (!alert.querySelector('a.blacklist')){
                    alertBlacklistButton(alert);
                }
            };
        } catch (error) {
            console.log('blacklist checker error', error)
        };
    };

    function updateCheck(alert) {
        if (settings.updateRequestDismiss == false) {
            return;
        }
        else if (alert.classList.length == 0) {
            return
        }
        try {
            var title = alert.querySelector('[set-text="item.value.value"]').innerText;
            if (/.*Looks forward to the next update for.*/.test(title)) {
                var dismiss = alert.querySelector('a.dismiss');
                simClick(dismiss);
            }
        } catch (error) {
            console.log('updateCheck error', error)
        };
    };

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

    function sortAlerts() {
        return;
        //this is broken
        try {
            var sort_by_name = function (a, b) {
                return a.querySelector('.user').innerText.localeCompare(b.querySelector('.user').innerText);
            }
            var list = Array.from(document.querySelectorAll('ul.feedType.ng-scope')[1].querySelectorAll('li'));
            list.sort(sort_by_name);
            for (var i = 0; i < list.length; i++) {
                list[i].parentNode.appendChild(list[i]);
            }
        } catch (error) {}

    };

    function alertUpdate(alert){
        try{
            //console.log('alert up',alert)
            if (settings.updateRequestDismiss == false) {
                return;
            }
            else if (alert.classList.length == 0) {
                return
            }
            var dismiss = alert.querySelector('a.dismiss');
            simClick(dismiss);
        }catch(error){console.log('AU Error',error)}
    };

    function awaitAlerts(){
        try{
            var alerts = document.querySelector('span.feedCount')
            if (alerts){
                //console.log('Alerts Exist');
                try{
                    observerFCP.disconnect();
                }catch(error){};
                monitorFeedCount(alerts.parentNode);
                monitorFeeds();

                let alertContainer = document.querySelectorAll('li.feedItem');
                alertContainer.forEach(alert => {
                    if (/.*went live.*/.test(alert.innerText)) {
                        blacklistCheck(alert);
                    }
                    else if (/.*Looks forward to the next update for.*/.test(alert.innerText)) {
                        alertUpdate(alert)
                    }
                    else if (/.*PM:.*/.test(alert.innerText)) {
                    }
                });
            }
            else{
                //console.log('Alerts Dont Exist');
                var observerFCP = new MutationObserver(awaitFeedCount);
                observerFCP.observe(document, {
                    childList: true,
                    subtree: true
                });
            };

            function awaitFeedCount(mutations){
                //Wait for the feed count, when found stop and start the FC monitor
                try{
                    for (let mutation of mutations) {
                        let alerts = document.querySelector('span.feedCount')
                        if (mutation.addedNodes.length > 0){
                            var elm = mutation.addedNodes[0];
                            if (elm.tagName == 'SPAN' && elm.classList.contains('feedCount')){
                                observerFCP.disconnect();
                                monitorFeedCount(alerts.parentNode);
                                monitorFeeds();
                            };
                        };
                    };
                }
                catch(error){
                    console.log('AFC',error)
                };
            };

            function monitorFeedCount(FC){
                //Monitors feed count parent for when alerts appear or disappear.
                try{
                    var observerFC = new MutationObserver(function(x){
                        if (x[0].removedNodes.length > 0){
                            //console.log('Alerts Removed.');
                            try{
                                window.alertWatcher.disconnect();
                                //console.log('AW');
                            }catch(error){}
                            try{
                                window.observerDrop.disconnect();
                                //console.log('DW');
                            }catch(error){}
                        }
                        else if (x[0].addedNodes.length > 0){
                            //console.log('Alerts Added.',x[0].addedNodes);
                            monitorFeeds();
                        }
                    })
                    observerFC.observe(FC, {childList:true})
                }catch(error){console.log('MFC',error)}
            };

            function monitorFeeds(){
                //Alerts are stored in feeds, this monitors them
                function dropdownWatch(mutations){
                    try{
                        if (dropdown.length == 1){
                            console.log('Dropdown has a single child.')
                            return
                        }
                        for (let mutation of mutations){
                            if (mutation.addedNodes.length > 0 && mutation.addedNodes[0].tagName == 'LI'){
                                let text=mutation.addedNodes[0].innerText
                                let alert = mutation.addedNodes[0]
                                if (/.*went live.*/.test(text)) {
                                    blacklistCheck(alert);
                                }
                                else if (/.*Looks forward to the next update for.*/.test(text)) {
                                    //console.log('update')
                                    alertUpdate(alert)
                                }
                                else if (/.*PM:.*/.test(text)) {
                                    //console.log('pm')
                                }
                            }
                        };
                    }
                    catch(error){
                        console.log('DW',error)
                    };
                };

                var dropdown = document.querySelector('#loginMenu').children[1];
                //console.log('dropdown',dropdown);
                var observerDrop = new MutationObserver(dropdownWatch);
                observerDrop.observe(dropdown, {childList:true,subtree:true});
                window.observerDrop = observerDrop;

                let alertContainer = document.querySelectorAll('li.feedItem');
                alertContainer.forEach(alert => {
                    if (/.*went live.*/.test(alert.innerText)) {
                        blacklistCheck(alert);
                    }
                    else if (/.*Looks forward to the next update for.*/.test(alert.innerText)) {
                        alertUpdate(alert)
                    }
                    else if (/.*PM:.*/.test(alert.innerText)) {
                    }
                });
            }
        }catch(error){console.log('AAlerts',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.setAttribute('class', 'blacklistEntry');

        var settingsBlacklistedText = document.createElement('p');
        settingsBlacklistedText.setAttribute('class', 'colors');
        settingsBlacklistedText.innerText = element;
        settingsBlacklistedText.innerText = settingsBlacklistedText.innerText.replace('___', '     Author: ');

        var settingsBlacklistRemove = document.createElement('a');
        settingsBlacklistRemove.setAttribute('class', 'blacklistRemove')
        settingsBlacklistRemove.innerText = 'Remove'
        settingsBlacklistRemove.onclick = function () {
            blacklistRemove(element);
            this.parentNode.remove();
        }

        settingsBlacklisted.appendChild(settingsBlacklistedText)
        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');
                        return confDisp
                    };
                    function configBox() {
                        var confBox = document.createElement('div');
                        confBox.setAttribute('id', 'confBox');
                        return confBox
                    };

                    //Blacklists start here
                    //Blacklists start here
                    //Blacklists start here
                    //Blacklists start here
                    //Blacklists start here

                    function settingsUserBlacklist() {
                        var settingsTab = document.createElement('div');
                        settingsTab.setAttribute('class', 'settingsTab');
                        settingsTab.setAttribute('name', 'Chat');
                        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.setAttribute('class', 'blacklistEntry');

                                var chatBlacklistedText = document.createElement('p');
                                chatBlacklistedText.setAttribute('class', 'colors');
                                chatBlacklistedText.innerText = element;

                                var settingsUserRemove = document.createElement('a');
                                settingsUserRemove.setAttribute('class', 'blacklistRemove');
                                settingsUserRemove.innerText = 'Remove';
                                settingsUserRemove.onclick = function () {
                                    try {
                                        chatBlacklistRemove(element);
                                        this.parentNode.remove();
                                    } catch (error) {
                                        console.log('Error removing user', error)
                                    }
                                };
                                chatBlacklisted.appendChild(chatBlacklistedText);
                                chatBlacklisted.appendChild(settingsUserRemove);
                                return chatBlacklisted;
                            } catch (error) {
                                console.log('44', error)
                            }
                        };

                        function userAddBlacklist() {
                            var settingsUserBox = document.createElement('div');
                            settingsUserBox.setAttribute('id', 'settingsBox');

                            var settingsUserInput = document.createElement('input');
                            settingsUserInput.setAttribute("type", "text");
                            settingsUserInput.setAttribute("class", "settingsInput");
                            settingsUserInput.setAttribute("placeholder", "Input username here.");

                            var settingsUserAdd = document.createElement('input');
                            settingsUserAdd.setAttribute("type", "button");
                            settingsUserAdd.style.height = '30px';
                            settingsUserAdd.value = 'Add User';
                            settingsUserAdd.onclick = function () {
                                if (settings.chatBlacklisted.includes(this.parentNode.childNodes[0].value)) {
                                    return;
                                }
                                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', 'settingsBlacklist');
                        settingsUserBlacklist.style.padding = '5px';
                        settings.chatBlacklisted = [...new Set(settings.chatBlacklisted)]
                        settings.chatBlacklisted.forEach(element => settingsUserBlacklist.appendChild(chatBlacklisted(element)));

                        var settingsUserBlacklistText = document.createElement('div');
                        settingsUserBlacklistText.setAttribute('class', 'entryTitle');
                        settingsUserBlacklistText.innerText = 'Chat User Blacklist';
                        settingsUserBlacklist.prepend(userAddBlacklist());
                        settingsUserBlacklist.prepend(settingsUserBlacklistText);

                        settingsTab.appendChild(settingsUserBlacklist)
                        return settingsTab;
                    };

                    function settingsAuthorsBlacklist() {
                        var settingsTab = document.createElement('div');
                        settingsTab.setAttribute('class', 'settingsTab');
                        settingsTab.setAttribute('name', 'Author');
                        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.setAttribute('class', 'blacklistEntry')
                                var authorBlacklistedText = document.createElement('p');
                                authorBlacklistedText.setAttribute('class', 'colors');
                                authorBlacklistedText.innerText = element;

                                var settingsAuthorRemove = document.createElement('a');
                                settingsAuthorRemove.setAttribute('class', 'blacklistRemove');
                                settingsAuthorRemove.innerText = 'Remove';
                                settingsAuthorRemove.onclick = function () {
                                    try {
                                        authorBlacklistRemove(element);
                                        this.parentNode.remove();
                                    } catch (error) {
                                        console.log('Error removing author', error)
                                    }
                                };
                                authorBlacklisted.appendChild(authorBlacklistedText);
                                authorBlacklisted.appendChild(settingsAuthorRemove);
                                return authorBlacklisted;
                            } catch (error) {
                                console.log('55', error)
                            }
                        };

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

                            var settingsAuthorsInput = document.createElement('input');
                            settingsAuthorsInput.setAttribute("type", "text");
                            settingsAuthorsInput.setAttribute("class", "settingsInput");
                            settingsAuthorsInput.setAttribute("placeholder", "Input author here.");

                            var settingsAuthorsAdd = document.createElement('input');
                            settingsAuthorsAdd.setAttribute("type", "button");
                            settingsAuthorsAdd.style.height = '30px';
                            settingsAuthorsAdd.value = 'Add Author';
                            settingsAuthorsAdd.onclick = function () {
                                if (settings.authorBlacklist.includes(this.parentNode.childNodes[0].value)) {
                                    return;
                                }
                                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', 'settingsBlacklist');
                        settings.authorBlacklist = [...new Set(settings.authorBlacklist)]
                        settings.authorBlacklist.sort().forEach(element => settingsAuthorsBlacklist.appendChild(authorBlacklisted(element)));

                        var settingsAuthorsBlacklistText = document.createElement('div');
                        settingsAuthorsBlacklistText.innerText = 'Authors Blacklist';
                        settingsAuthorsBlacklistText.setAttribute('class', 'entryTitle');
                        settingsAuthorsBlacklist.prepend(authorAddBlacklist());
                        settingsAuthorsBlacklist.prepend(settingsAuthorsBlacklistText);

                        settingsTab.appendChild(settingsAuthorsBlacklist)
                        return settingsTab;
                    };

                    function settingsTagsBlacklist() {
                        var settingsTab = document.createElement('div');
                        settingsTab.setAttribute('class', 'settingsTab');
                        settingsTab.setAttribute('name', 'Tags');
                        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.setAttribute('class', 'blacklistEntry');
                                var tagBlacklistedText = document.createElement('p');
                                tagBlacklistedText.setAttribute('class', 'colors');
                                tagBlacklistedText.innerText = element;

                                var settingsTagRemove = document.createElement('a');
                                settingsTagRemove.setAttribute('class', 'blacklistRemove');
                                settingsTagRemove.innerText = 'Remove';
                                settingsTagRemove.onclick = function () {
                                    try {
                                        tagBlacklistRemove(element);
                                        this.parentNode.remove();
                                    } catch (error) {
                                        console.log('Error removing tag', error)
                                    }
                                };
                                tagBlacklisted.appendChild(tagBlacklistedText);
                                tagBlacklisted.appendChild(settingsTagRemove);
                                return tagBlacklisted;
                            } catch (error) {
                                console.log('78', error)
                            }
                        };

                        function tagAddBlacklist() {
                            var settingsTagBox = document.createElement('div');
                            settingsTagBox.setAttribute('id', 'settingsBox');

                            var settingsTagsInput = document.createElement('input');
                            settingsTagsInput.setAttribute("type", "text");
                            settingsTagsInput.setAttribute("class", "settingsInput");
                            settingsTagsInput.setAttribute("placeholder", "Input tag here.");

                            var settingsTagsAdd = document.createElement('input');
                            settingsTagsAdd.setAttribute("type", "button");
                            settingsTagsAdd.style.height = '30px';
                            settingsTagsAdd.value = 'Add Tag';
                            settingsTagsAdd.onclick = function () {
                                if (settings.tagBlacklist.includes(this.parentNode.childNodes[0].value)) {
                                    return;
                                }
                                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', 'settingsBlacklist');
                        settings.tagBlacklist = [...new Set(settings.tagBlacklist)]
                        settings.tagBlacklist.sort().forEach(element => settingsTagsBlacklist.appendChild(tagBlacklisted(element)));

                        var settingsTagsBlacklistText = document.createElement('div');
                        settingsTagsBlacklistText.innerText = 'Tags Blacklist';
                        settingsTagsBlacklistText.setAttribute('class', 'entryTitle');
                        settingsTagsBlacklist.prepend(tagAddBlacklist());
                        settingsTagsBlacklist.prepend(settingsTagsBlacklistText);

                        settingsTab.appendChild(settingsTagsBlacklist)
                        return settingsTab;
                    };

                    function settingsBlacklist() {
                        var settingsTab = document.createElement('div');
                        settingsTab.setAttribute('class', 'settingsTab');
                        settingsTab.setAttribute('name', 'Alerts');
                        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.', error);
                            }
                        };

                        var settingsBlacklist = document.createElement('div');
                        settingsBlacklist.setAttribute('id', 'settingsBlacklist');
                        settings.alertBlacklist = [...new Set(settings.alertBlacklist)]
                        settings.alertBlacklist.forEach(element => settingsBlacklist.appendChild(elementBlacklisted(element)));

                        var settingsBlacklistText = document.createElement('div');
                        settingsBlacklistText.innerText = 'Alert Blacklist';
                        settingsBlacklistText.setAttribute('class', 'entryTitle');

                        var settingsSearchBox = document.createElement('div');
                        settingsSearchBox.setAttribute('id', 'settingsBox');

                        var settingsAlertSearchInput = document.createElement('input');
                        settingsAlertSearchInput.setAttribute("type", "text");
                        settingsAlertSearchInput.setAttribute("class", "settingsInput");
                        settingsAlertSearchInput.setAttribute("name", "alertSearch");
                        settingsAlertSearchInput.setAttribute("placeholder", "Enter a title or QM to search.");

                        var settingsAlertSearch = document.createElement('input');
                        settingsAlertSearch.setAttribute("type", "button");
                        settingsAlertSearch.style.height = '30px';
                        settingsAlertSearch.value = 'Search';
                        settingsAlertSearch.onclick = function () {
                            this.closest('#settingsBlacklist').querySelectorAll('.blacklistEntry').forEach(x => {
                                x.style.display = 'initial';
                            })
                            let search = this.parentNode.querySelector('[name="alertSearch"]').value.toLowerCase();
                            let xx = this.closest('#settingsBlacklist').querySelectorAll('.blacklistEntry');
                            xx.forEach(x => {
                                let text = x.firstChild.textContent.toLowerCase().replace('author:')
                                if (!text.includes(search)) {
                                    x.style.display = 'none';
                                } else {}
                            })
                        }

                        var settingsAlertSearchClear = document.createElement('input');
                        settingsAlertSearchClear.setAttribute("type", "button");
                        settingsAlertSearchClear.style.height = '30px';
                        settingsAlertSearchClear.value = 'Clear Search';
                        settingsAlertSearchClear.onclick = function () {
                            this.parentNode.querySelector('[name="alertSearch"]').value = '';
                            this.closest('#settingsBlacklist').querySelectorAll('.blacklistEntry').forEach(x => {
                                x.style.display = 'initial';
                            })

                        }

                        settingsSearchBox.appendChild(settingsAlertSearchInput);
                        settingsSearchBox.appendChild(settingsAlertSearch);
                        settingsSearchBox.appendChild(settingsAlertSearchClear);
                        settingsAlertBox.appendChild(settingsSearchBox);
                        settingsAlertBox.appendChild(settingsAlertAdd);
                        settingsBlacklist.prepend(settingsAlertBox);
                        settingsBlacklist.prepend(settingsBlacklistText);
                        settingsTab.appendChild(settingsBlacklist)
                        return settingsTab;
                    };


                    function settingsStyle() {
                        function genStyle(styleAttribute, styleText) {
                            var settingsStyleEntryText = document.createElement('p');
                            settingsStyleEntryText.setAttribute('class', 'styleTitle');
                            settingsStyleEntryText.innerText = styleText;

                            var settingsStylePicker = document.createElement('input');
                            settingsStylePicker.setAttribute('class', 'colorPick');
                            settingsStylePicker.setAttribute('type', 'color');
                            settingsStylePicker.onchange = function () {
                                this.parentNode.querySelector('.colorSet').value = this.value
                            };

                            var settingsStyleInput = document.createElement('input');
                            settingsStyleInput.setAttribute('class', 'colorSet');
                            settingsStyleInput.setAttribute('type', 'text');

                            if ([styleAttribute]in settings.customCSS[0]) {
                                settingsStyleInput.value = settings.customCSS[0][styleAttribute]
                                settingsStylePicker.value = settings.customCSS[0][styleAttribute]
                            };

                            var settingsStyleEntry = document.createElement('div');
                            settingsStyleEntry.setAttribute('class', 'styleEntry');
                            settingsStyleEntry.setAttribute('name', styleAttribute);
                            settingsStyleEntry.appendChild(settingsStyleEntryText);
                            settingsStyleEntry.appendChild(settingsStyleInput);
                            settingsStyleEntry.appendChild(settingsStylePicker);

                            return settingsStyleEntry;
                        };

                        var settingsStyle = document.createElement('div');
                        settingsStyle.setAttribute('class', 'settingsTab');
                        settingsStyle.setAttribute('name', 'Site Style');

                        var settingsStyleText = document.createElement('div');
                        settingsStyleText.setAttribute('class', 'entryTitle');
                        settingsStyleText.innerText = 'Custom Site Style - Beta';

                        var settingsStyleTextBox = new genStyle('color', 'Text Color');
                        var settingsStyleBackgroundBox = new genStyle('background', 'Background Color');

                        var settingsStyleSave = document.createElement('input');
                        settingsStyleSave.setAttribute("type", "button");
                        settingsStyleSave.setAttribute('class', 'cssBtn');
                        settingsStyleSave.style.height = '30px';
                        settingsStyleSave.onclick = function () {
                            try{
                                try{
                                    document.querySelectorAll('.styleEntry').forEach(
                                        x => {
                                            let name = x.getAttribute("name");
                                            let value = x.querySelector('.colorSet').value;
                                            if (value !== undefined) {
                                                settings.customCSS[0][name] = value;
                                            }
                                        });
                                }catch(error){}

                                try{
                                    for (var key in settings.customCSS[0]) {
                                        if (settings.customCSS[0].hasOwnProperty(key)) {
                                            console.log(key, settings.customCSS[0][key]);
                                        }
                                    }
                                }catch(error){}

                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                let styleS = `*{color:${settings.customCSS[0].color}!important;background:${settings.customCSS[0].background} !important;}`;

                                let style = document.createElement('style');
                                style.setAttribute("name", "styleSheet");
                                if (document.querySelector('[name="styleSheet"]')) {
                                    document.querySelector('[name="styleSheet"]').remove();
                                    style.appendChild(document.createTextNode(styleS));
                                } else {
                                    style.appendChild(document.createTextNode(styleS));
                                }
                                document.getElementsByTagName('head')[0].appendChild(style);
                            }catch(error){}
                        };
                        settingsStyleSave.value = 'Apply Styling';

                        var settingsStyleToggle = document.createElement('input');
                        settingsStyleToggle.setAttribute("type", "button");
                        settingsStyleToggle.setAttribute('class', 'cssBtn');
                        settingsStyleToggle.value = 'Toggle CSS Input';
                        settingsStyleToggle.style.height = '30px';
                        settingsStyleToggle.onclick = function () {
                            let styleInput = document.querySelector('#styleInput');
                            let styleSaveCSS = document.querySelector('#styleSaveCSS');
                            if (styleInput.style.display != 'none') {
                                styleInput.style.display = 'none';
                                styleSaveCSS.style.display = 'none';
                            } else {
                                styleInput.style.display = 'initial';
                                styleSaveCSS.style.display = 'initial';
                            }
                        };

                        var settingsStyleBoxSave = document.createElement('input');
                        settingsStyleBoxSave.setAttribute("type", "button");
                        settingsStyleBoxSave.setAttribute('id', 'styleSaveCSS');
                        settingsStyleBoxSave.setAttribute('class', 'cssBtn');
                        settingsStyleBoxSave.value = 'Save CSS Input';
                        settingsStyleBoxSave.style.display = 'none';
                        settingsStyleBoxSave.style.height = '30px';
                        settingsStyleBoxSave.onclick = function () {
                            let styleS = document.querySelector('#styleInput').value
                            if (styleS !== undefined) {
                                settings.customCSS[1] = styleS;
                            }
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));

                            let style = document.createElement('style');
                            style.setAttribute("name", "styleSheet");
                            if (document.querySelector('[name="styleSheet"]')) {
                                document.querySelector('[name="styleSheet"]').remove();
                                style.appendChild(document.createTextNode(styleS));
                            } else {
                                style.appendChild(document.createTextNode(styleS));
                            }
                            document.getElementsByTagName('head')[0].appendChild(style);
                        };

                        var settingsStyleClear = document.createElement('input');
                        settingsStyleClear.setAttribute("type", "button");
                        settingsStyleClear.setAttribute('class', 'cssBtn');
                        settingsStyleClear.value = 'Reset Style Settings';
                        settingsStyleClear.style.height = '30px';
                        settingsStyleClear.onclick = function () {
                            try{
                                document.querySelector('[name="styleSheet"]').remove();
                                document.querySelectorAll('.colorPick').forEach(x => {
                                    x.value = ''
                                });
                                document.querySelectorAll('.colorSet').forEach(x => {
                                    x.value = ''
                                });
                                document.querySelector('#styleInput').value = '';
                                settings.customCSS = [{}, ``];
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            }catch(error){}
                        };

                        var settingsStyleBox = document.createElement('textarea');
                        settingsStyleBox.setAttribute('id', 'styleInput');
                        settingsStyleBox.setAttribute('placeholder', 'Add any more complicated CSS here.');
                        settingsStyleBox.setAttribute("cols", "50");
                        settingsStyleBox.setAttribute("rows", "50");
                        settingsStyleBox.style.display = 'none';
                        if (settings.customCSS[1] !== ``) {
                            settingsStyleBox.value = settings.customCSS[1];
                        }

                        var settingsStyleEntries = document.createElement('div');
                        settingsStyleEntries.setAttribute('id', 'styleEntries');
                        settingsStyleEntries.appendChild(settingsStyleTextBox);
                        settingsStyleEntries.appendChild(settingsStyleBackgroundBox);

                        settingsStyle.appendChild(settingsStyleText);
                        settingsStyle.appendChild(settingsStyleEntries);
                        settingsStyle.appendChild(settingsStyleSave);
                        settingsStyle.appendChild(settingsStyleToggle);
                        settingsStyle.appendChild(settingsStyleBoxSave);
                        settingsStyle.appendChild(settingsStyleClear);
                        settingsStyle.appendChild(settingsStyleBox);
                        try {
                            if (settings.customCSS[0] != {}) {
                                let A=''
                                let B=''
                                if (settings.customCSS[0].color != undefined){A=`color:${settings.customCSS[0].color}!important;`}
                                if (settings.customCSS[0].background != undefined){B=`background:${settings.customCSS[0].background} !important;}`}
                                var styleS = `*{${A}${B}}`;
                                if (styleS!='*{}'){
                                    var style = document.createElement('style');
                                    style.setAttribute("name", "styleSheet");
                                    if (document.querySelector('[name="styleSheet"]')) {
                                        document.querySelector('[name="styleSheet"]').remove();
                                        style.setAttribute("name", "styleSheet");
                                        style.appendChild(document.createTextNode(styleS));
                                    } else {
                                        style.appendChild(document.createTextNode(styleS));
                                    }
                                    document.getElementsByTagName('head')[0].appendChild(style);
                                }
                            };
                        } catch (error) {
                            console.log(error)
                        }

                        try {
                            if (settings.customCSS[1] != ``) {
                                var style2 = document.createElement('style');
                                var styleS2 = settings.customCSS[1]
                                if (document.querySelector('[name="styleSheet"]')) {
                                    document.querySelector('[name="styleSheet"]').remove();
                                    style2.setAttribute("name", "styleSheet");
                                    style2.appendChild(document.createTextNode(styleS2));
                                }
                                else {
                                    style2.setAttribute("name", "styleSheet");
                                    style2.appendChild(document.createTextNode(styleS2));
                                }
                                document.getElementsByTagName('head')[0].appendChild(style2);
                            }
                        } catch (error) {
                            console.log('customcss',error)
                        }

                        return settingsStyle;
                    }

                    //Toggles for features start here
                    //Toggles for features start here
                    //Toggles for features start here
                    //Toggles for features start here
                    //Toggles for features start here

                    function settingsImageResize() {
                        var settingsImageResize = document.createElement('div');
                        settingsImageResize.setAttribute('class', 'settingsToggle');

                        var settingsImageResizeText = document.createElement('div');
                        settingsImageResizeText.style.display = 'inline';
                        settingsImageResizeText.innerText = 'Resize images in chat.';

                        var settingsImageResizeCheckbox = document.createElement('input');
                        settingsImageResizeCheckbox.setAttribute("type", "checkbox");
                        settingsImageResizeCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsImageResizeText);
                        settingsImageResize.appendChild(settingsImageResizeCheckbox);
                        return settingsImageResize
                    };

                    function settingsRemoveBlankTopics() {
                        var settingsRemoveBlankTopics = document.createElement('div');
                        settingsRemoveBlankTopics.setAttribute('class', 'settingsToggle');

                        var settingsRemoveBlankTopicsText = document.createElement('div');
                        settingsRemoveBlankTopicsText.style.display = 'inline';
                        settingsRemoveBlankTopicsText.innerText = 'Remove blank topics.';

                        var settingsRemoveBlankTopicsCheckbox = document.createElement('input');
                        settingsRemoveBlankTopicsCheckbox.setAttribute("type", "checkbox");
                        settingsRemoveBlankTopicsCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsRemoveBlankTopicsText);
                        settingsRemoveBlankTopics.appendChild(settingsRemoveBlankTopicsCheckbox);
                        return settingsRemoveBlankTopics
                    };

                    function settingsFormRemove() {
                        var settingsFormRemove = document.createElement('div');
                        settingsFormRemove.setAttribute('class', 'settingsToggle');

                        var settingsFormRemoveText = document.createElement('div');
                        settingsFormRemoveText.style.display = 'inline';
                        settingsFormRemoveText.innerText = 'Remove topic submission form.';

                        var settingsFormRemoveCheckbox = document.createElement('input');
                        settingsFormRemoveCheckbox.setAttribute("type", "checkbox");
                        settingsFormRemoveCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsFormRemoveText);
                        settingsFormRemove.appendChild(settingsFormRemoveCheckbox);
                        return settingsFormRemove
                    };

                    function settingsChatBlacklist() {
                        var settingsChatBlacklist = document.createElement('div');
                        settingsChatBlacklist.setAttribute('class', 'settingsToggle');

                        var settingsChatBlacklistText = document.createElement('div');
                        settingsChatBlacklistText.style.display = 'inline';
                        settingsChatBlacklistText.innerText = 'Hide blacklisted users in chat.';

                        var settingsChatBlacklistCheckbox = document.createElement('input');
                        settingsChatBlacklistCheckbox.setAttribute("type", "checkbox");
                        settingsChatBlacklistCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsChatBlacklistText);
                        settingsChatBlacklist.appendChild(settingsChatBlacklistCheckbox);
                        return settingsChatBlacklist
                    };

                    function settingsAuthorBlacklist() {
                        var settingsAuthorBlacklist = document.createElement('div');
                        settingsAuthorBlacklist.setAttribute('class', 'settingsToggle')

                        var settingsAuthorBlacklistText = document.createElement('div');
                        settingsAuthorBlacklistText.style.display = 'inline';
                        settingsAuthorBlacklistText.innerText = 'Hide quests with blacklisted authors.';

                        var settingsAuthorBlacklistCheckbox = document.createElement('input');
                        settingsAuthorBlacklistCheckbox.setAttribute("type", "checkbox");
                        settingsAuthorBlacklistCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsAuthorBlacklistText);
                        settingsAuthorBlacklist.appendChild(settingsAuthorBlacklistCheckbox);
                        return settingsAuthorBlacklist
                    };

                    function settingsTagBlacklist() {
                        var settingsTagBlacklist = document.createElement('div');
                        settingsTagBlacklist.setAttribute("class", "settingsToggle");

                        var settingsTagBlacklistText = document.createElement('div');
                        settingsTagBlacklistText.style.display = 'inline';
                        settingsTagBlacklistText.innerText = 'Hide quests with blacklisted tags.';

                        var settingsTagBlacklistCheckbox = document.createElement('input');
                        settingsTagBlacklistCheckbox.setAttribute("type", "checkbox");
                        settingsTagBlacklistCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsTagBlacklistText);
                        settingsTagBlacklist.appendChild(settingsTagBlacklistCheckbox);
                        return settingsTagBlacklist
                    };

                    function settingsNamefagToggle() {

                        var settingsNamefagToggle = document.createElement('div');
                        settingsNamefagToggle.setAttribute('class', 'settingsToggle');

                        var settingsNamefagToggleText = document.createElement('div');
                        settingsNamefagToggleText.style.display = 'inline';
                        settingsNamefagToggleText.innerText = 'Make everyone Anon.';

                        var settingsNamefagToggleCheckbox = document.createElement('input');
                        settingsNamefagToggleCheckbox.setAttribute("type", "checkbox");
                        settingsNamefagToggleCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.removeUsernames == true) {
                            settingsNamefagToggleCheckbox.checked = true;
                        };
                        settingsNamefagToggleCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.removeUsernames = true;
                                try{
                                    let authorList = document.querySelectorAll('span.author.ng-scope');
                                    let authors = []
                                    authorList.forEach(element => authors.push(element.querySelector('span.name').innerText))
                                    let names = document.querySelectorAll('div.user span.name')
                                    names.forEach(name => {
                                        let txt = name.innerText;
                                        if (!authors.includes(txt)){
                                            name.innerText = 'anon';
                                        }
                                    })
                                }catch(error){console.log('anonForce',error)}
                            } else {
                                settings.removeUsernames = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsNamefagToggle.appendChild(settingsNamefagToggleText);
                        settingsNamefagToggle.appendChild(settingsNamefagToggleCheckbox);
                        return settingsNamefagToggle
                    };

                    function settingsRollerToggle() {
                        var settingsRollerToggle = document.createElement('div');
                        settingsRollerToggle.setAttribute('class', 'settingsToggle');

                        var settingsRollerToggleText = document.createElement('div');
                        settingsRollerToggleText.style.display = 'inline';
                        settingsRollerToggleText.innerText = 'Toggle Auto Roller.';

                        var settingsRollerToggleCheckbox = document.createElement('input');
                        settingsRollerToggleCheckbox.setAttribute("type", "checkbox");
                        settingsRollerToggleCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.autoRoller == true) {
                            settingsRollerToggleCheckbox.checked = true;
                        };
                        settingsRollerToggleCheckbox.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(settingsRollerToggleText);
                        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;
                                } 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.setAttribute('class', 'settingsToggle');

                        var settingsAnonToggleText = document.createElement('div');
                        settingsAnonToggleText.style.display = 'inline';
                        settingsAnonToggleText.innerText = 'Toggle Anon status.';

                        var settingsAnonToggleCheckbox = document.createElement('input');
                        settingsAnonToggleCheckbox.setAttribute("type", "checkbox");
                        settingsAnonToggleCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsAnonToggleText);
                        settingsAnonToggle.appendChild(settingsAnonToggleCheckbox);
                        return settingsAnonToggle
                    };

                    function settingsLiveRestore() {
                        var settingsLiveRestore = document.createElement('div');
                        settingsLiveRestore.setAttribute('class', 'settingsToggle');

                        var settingsLiveRestoreText = document.createElement('div');
                        settingsLiveRestoreText.style.display = 'inline';
                        settingsLiveRestoreText.innerText = 'Restore live timer to nav bar.';

                        var settingsLiveRestoreCheckbox = document.createElement('input');
                        settingsLiveRestoreCheckbox.setAttribute("type", "checkbox");
                        settingsLiveRestoreCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.liveRestore == true) {
                            settingsLiveRestoreCheckbox.checked = true;
                        };
                        settingsLiveRestoreCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.liveRestore = true;
                                let canvas = document.querySelector('header[class="next-live ng-scope"]');
                                if (canvas){
                                    liveRestore()
                                }
                            } else {
                                settings.liveRestore = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsLiveRestore.appendChild(settingsLiveRestoreText);
                        settingsLiveRestore.appendChild(settingsLiveRestoreCheckbox);
                        return settingsLiveRestore
                    };

                    function settingsLiveLight() {
                        var settingsLiveLight = document.createElement('div');
                        settingsLiveLight.setAttribute('class', 'settingsToggle');

                        var settingsLiveLightText = document.createElement('div');
                        settingsLiveLightText.style.display = 'inline';
                        settingsLiveLightText.innerText = 'Light mode live timer.';

                        var settingsLiveLightCheckbox = document.createElement('input');
                        settingsLiveLightCheckbox.setAttribute("type", "checkbox");
                        settingsLiveLightCheckbox.setAttribute("class", "toggleCheck");
                        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(settingsLiveLightText);
                        settingsLiveLight.appendChild(settingsLiveLightCheckbox);
                        return settingsLiveLight
                    };

                    function settingsAuthorHighlight() {
                        var settingsAuthorHighlight = document.createElement('div');
                        settingsAuthorHighlight.setAttribute('class', 'settingsToggle');

                        var settingsAuthorHighlightText = document.createElement('div');
                        settingsAuthorHighlightText.style.display = 'inline';
                        settingsAuthorHighlightText.innerText = 'Highlight author(s) in chat.';

                        var settingsAuthorHighlightCheckbox = document.createElement('input');
                        settingsAuthorHighlightCheckbox.setAttribute("type", "checkbox");
                        settingsAuthorHighlightCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.authorHighlight == true) {
                            settingsAuthorHighlightCheckbox.checked = true;
                        };
                        settingsAuthorHighlightCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.authorHighlight = true;
                                try{
                                    let authorList = document.querySelectorAll('span.author.ng-scope');
                                    let authors = []
                                    authorList.forEach(element => authors.push(element.querySelector('span.name').innerText))
                                    var currentColor = settings.highlightColor;
                                    if (settings.highlightLightToggle == true) {
                                        currentColor = settings.highlightLight;
                                    }
                                    document.querySelectorAll('div.user span.name').forEach(name => {
                                        if (authors.includes(name.innerText)){
                                            name.closest('.logItem').style.background = currentColor
                                        }
                                    })
                                }catch(error){}
                            } else {
                                settings.authorHighlight = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsAuthorHighlight.appendChild(settingsAuthorHighlightText);
                        settingsAuthorHighlight.appendChild(settingsAuthorHighlightCheckbox);
                        return settingsAuthorHighlight
                    };

                    function settingsLightHighlight() {
                        var settingsLightHighlight = document.createElement('div');
                        settingsLightHighlight.setAttribute('class', 'settingsToggle');

                        var settingsLightHighlightText = document.createElement('div');
                        settingsLightHighlightText.style.display = 'inline';
                        settingsLightHighlightText.innerText = 'Light mode highlighting.';

                        var settingsLightHighlightCheckbox = document.createElement('input');
                        settingsLightHighlightCheckbox.setAttribute("type", "checkbox");
                        settingsLightHighlightCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.highlightLightToggle == true) {
                            settingsLightHighlightCheckbox.checked = true;
                        };
                        settingsLightHighlightCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.highlightLightToggle = true;
                                try{
                                    let authorList = document.querySelectorAll('span.author.ng-scope');
                                    let authors = []
                                    authorList.forEach(element => authors.push(element.querySelector('span.name').innerText))
                                    var currentColor = settings.highlightColor;
                                    if (settings.highlightLightToggle == true) {
                                        currentColor = settings.highlightLight;
                                    }
                                    document.querySelectorAll('div.user span.name').forEach(name => {
                                        if (authors.includes(name.innerText)){
                                            name.closest('.logItem').style.background = currentColor
                                        }
                                    })
                                }catch(error){}
                            } else {
                                settings.highlightLightToggle = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsLightHighlight.appendChild(settingsLightHighlightText);
                        settingsLightHighlight.appendChild(settingsLightHighlightCheckbox);
                        return settingsLightHighlight
                    };

                    function settingsTaggedAuthor() {
                        var settingsTaggedAuthor = document.createElement('div');
                        settingsTaggedAuthor.setAttribute('class', 'settingsToggle');

                        var settingsTaggedAuthorText = document.createElement('div');
                        settingsTaggedAuthorText.style.display = 'inline';
                        settingsTaggedAuthorText.innerText = 'Hide tagged on author pages.';

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

                    function settingsFunctionalLinks() {
                        var settingsFunctionalLinks = document.createElement('div');
                        settingsFunctionalLinks.setAttribute('class', 'settingsToggle');

                        var settingsFunctionalLinksText = document.createElement('div');
                        settingsFunctionalLinksText.style.display = 'inline';
                        settingsFunctionalLinksText.innerText = 'Make text links functional.';

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

                    function settingsFunctionalVideos() {
                        var settingsFunctionalVideos = document.createElement('div');
                        settingsFunctionalVideos.setAttribute('class', 'settingsToggle');

                        var settingsFunctionalVideosText = document.createElement('div');
                        settingsFunctionalVideosText.style.display = 'inline';
                        settingsFunctionalVideosText.innerText = 'Make video links functional.';

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

                    function settingsNSFWToggle() {
                        var settingsNSFWToggle = document.createElement('div');
                        settingsNSFWToggle.setAttribute('class', 'settingsToggle');

                        var settingsNSFWToggleText = document.createElement('div');
                        settingsNSFWToggleText.style.display = 'inline';
                        settingsNSFWToggleText.innerText = 'Remove NSFW covers from quests.';

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

                    function settingsUpdateRequestDismissToggle() {
                        var settingsUpdateRequestDismissToggle = document.createElement('div');
                        settingsUpdateRequestDismissToggle.setAttribute('class', 'settingsToggle');

                        var settingsUpdateRequestText = document.createElement('div');
                        settingsUpdateRequestText.style.display = 'inline';
                        settingsUpdateRequestText.innerText = 'Auto dismiss update requests.';

                        var settingsUpdateRequestDismissToggleCheckbox = document.createElement('input');
                        settingsUpdateRequestDismissToggleCheckbox.setAttribute("type", "checkbox");
                        settingsUpdateRequestDismissToggleCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.updateRequestDismiss == true) {
                            settingsUpdateRequestDismissToggleCheckbox.checked = true;
                        };
                        settingsUpdateRequestDismissToggleCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.updateRequestDismiss = true;
                                let alertContainer = document.querySelectorAll('li.feedItem');
                                alertContainer.forEach(alert => {
                                    if (/.*Looks forward to the next update for.*/.test(alert.innerText)) {
                                        alertUpdate(alert)
                                    }
                                });
                            } else {
                                settings.updateRequestDismiss = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsUpdateRequestDismissToggle.appendChild(settingsUpdateRequestText);
                        settingsUpdateRequestDismissToggle.appendChild(settingsUpdateRequestDismissToggleCheckbox);
                        return settingsUpdateRequestDismissToggle
                    };

                    function settingsAkunPlusToggle() {
                        var settingsAkunPlusToggle = document.createElement('div');
                        settingsAkunPlusToggle.setAttribute('class', 'settingsToggle');

                        var settingsAkunPlusToggleText = document.createElement('div');
                        settingsAkunPlusToggleText.style.display = 'inline';

                        var settingsAkunPlusToggleBtn = document.createElement('input');
                        settingsAkunPlusToggleBtn.style.marginLeft = '10px';
                        settingsAkunPlusToggleBtn.setAttribute("type", "button");
                        settingsAkunPlusToggleBtn.setAttribute("class", "toggleBtn");

                        if (settings.akunPlus == 'Ignore') {
                            settingsAkunPlusToggleText.innerText = '(Chat) Ignore Akun Premium';
                            settingsAkunPlusToggleBtn.value = 'Remove';
                        } else if (settings.akunPlus == 'Remove') {
                            settingsAkunPlusToggleText.innerText = '(Chat) Remove Akun Premium';
                            settingsAkunPlusToggleBtn.value = 'Global';
                        } else {
                            settingsAkunPlusToggleText.innerText = '(Chat) Global Akun Premium';
                            settingsAkunPlusToggleBtn.value = 'Ignore';
                        };
                        settingsAkunPlusToggleBtn.onclick = function () {
                            try {
                                if (settings.akunPlus == 'Ignore') {
                                    this.parentNode.childNodes[0].innerText = '(Chat) Remove Akun Premium';
                                    this.value = 'Global';
                                    settings.akunPlus = 'Remove';
                                } else if (settings.akunPlus == 'Remove') {
                                    this.parentNode.childNodes[0].innerText = '(Chat) Global Akun Premium';
                                    this.value = 'Ignore';
                                    settings.akunPlus = 'Global';
                                } else {
                                    this.parentNode.childNodes[0].innerText = '(Chat) Ignore Akun Premium';
                                    this.value = 'Remove';
                                    settings.akunPlus = 'Ignore';
                                };
                                localStorage.setItem('FL_Settings', JSON.stringify(settings));
                                settings = JSON.parse(localStorage.getItem('FL_Settings'));
                            } catch (error) {
                                console.log('Error changin akunPlus', error);
                            };
                        };
                        settingsAkunPlusToggle.appendChild(settingsAkunPlusToggleText);
                        settingsAkunPlusToggle.appendChild(settingsAkunPlusToggleBtn);
                        return settingsAkunPlusToggle
                    };

                    function settingsChatBlacklistRepliesToggle() {
                        var settingsChatBlacklistReplies = document.createElement('div');
                        settingsChatBlacklistReplies.setAttribute('class', 'settingsToggle');

                        var settingsChatBlacklistRepliesText = document.createElement('div');
                        settingsChatBlacklistRepliesText.style.display = 'inline';
                        settingsChatBlacklistRepliesText.innerText = 'Remove replies to blacklisted users.';

                        var settingsChatBlacklistRepliesCheckbox = document.createElement('input');
                        settingsChatBlacklistRepliesCheckbox.setAttribute("type", "checkbox");
                        settingsChatBlacklistRepliesCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.chatBlacklistReplies == true) {
                            settingsChatBlacklistRepliesCheckbox.checked = true;
                        };

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

                    function settingsSortAlerts() {
                        var settingsSortAlerts = document.createElement('div');
                        settingsSortAlerts.setAttribute('class', 'settingsToggle');

                        var settingsSortAlertsText = document.createElement('div');
                        settingsSortAlertsText.style.display = 'inline';
                        settingsSortAlertsText.innerText = 'Sort alerts by author name.';

                        var settingsSortAlertsCheckbox = document.createElement('input');
                        settingsSortAlertsCheckbox.setAttribute("type", "checkbox");
                        settingsSortAlertsCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.sortAlerts == true) {
                            settingsSortAlertsCheckbox.checked = true;
                            //sortAlerts();
                        };

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

                    function settingsUnpublishToggle() {
                        var settingsUnpublishToggle = document.createElement('div');
                        settingsUnpublishToggle.setAttribute('class', 'settingsToggle');

                        var settingsUnpublishToggleText = document.createElement('div');
                        settingsUnpublishToggleText.style.display = 'inline';
                        settingsUnpublishToggleText.innerText = 'Add delete button to your messages.';

                        var settingsUnpublishToggleCheckbox = document.createElement('input');
                        settingsUnpublishToggleCheckbox.setAttribute("type", "checkbox");
                        settingsUnpublishToggleCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.unpublishBTN == true) {
                            settingsUnpublishToggleCheckbox.checked = true;
                        };

                        settingsUnpublishToggleCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.unpublishBTN = true;
                                sortAlerts();
                            } else {
                                settings.unpublishBTN = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsUnpublishToggle.appendChild(settingsUnpublishToggleText);
                        settingsUnpublishToggle.appendChild(settingsUnpublishToggleCheckbox);
                        return settingsUnpublishToggle
                    };

                    function settingsAnonRevealToggle() {
                        var settingsAnonRevealToggle = document.createElement('div');
                        settingsAnonRevealToggle.setAttribute('class', 'settingsToggle');

                        var settingsAnonRevealToggleText = document.createElement('div');
                        settingsAnonRevealToggleText.style.display = 'inline';
                        settingsAnonRevealToggleText.innerText = 'Attempt to reveal anon usernames in chat.';

                        var settingsAnonRevealToggleCheckbox = document.createElement('input');
                        settingsAnonRevealToggleCheckbox.setAttribute("type", "checkbox");
                        settingsAnonRevealToggleCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.userReveal == true) {
                            settingsAnonRevealToggleCheckbox.checked = true;
                            //sortAlerts();
                        };

                        settingsAnonRevealToggleCheckbox.addEventListener('change', (event) => {
                            if (event.target.checked) {
                                settings.userReveal = true;
                                sortAlerts();
                            } else {
                                settings.userReveal = false;
                            };
                            localStorage.setItem('FL_Settings', JSON.stringify(settings));
                            settings = JSON.parse(localStorage.getItem('FL_Settings'));
                        });
                        settingsAnonRevealToggle.appendChild(settingsAnonRevealToggleText);
                        settingsAnonRevealToggle.appendChild(settingsAnonRevealToggleCheckbox);
                        return settingsAnonRevealToggle
                    };

                    function settingsMsgEditToggle() {
                        var settingsToggle = document.createElement('div');
                        settingsToggle.setAttribute('class', 'settingsToggle');

                        var settingsText = document.createElement('div');
                        settingsText.style.display = 'inline';
                        settingsText.innerText = 'Allow message editing in chat.';

                        var settingsCheckbox = document.createElement('input');
                        settingsCheckbox.setAttribute("type", "checkbox");
                        settingsCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.messageEdit == true) {
                            settingsCheckbox.checked = true;
                        };

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

                    //Toggle Template
                    function settingsToggle() {
                        var settingsToggle = document.createElement('div');
                        settingsToggle.setAttribute('class', 'settingsToggle');

                        var settingsText = document.createElement('div');
                        settingsText.style.display = 'inline';
                        settingsText.innerText = 'WhatItDo?';

                        var settingsCheckbox = document.createElement('input');
                        settingsCheckbox.setAttribute("type", "checkbox");
                        settingsCheckbox.setAttribute("class", "toggleCheck");
                        if (settings.setting == true) {
                            settingsCheckbox.checked = true;
                            //sortAlerts();
                        };

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

                    function settingsActual() {
                        var settingsActual = document.createElement('div');
                        settingsActual.setAttribute('class', 'settingsTab');
                        settingsActual.setAttribute('name', 'General');
                        settingsActual.style.display = 'initial';

                        var settingsActualText = document.createElement('div');
                        settingsActualText.innerText = 'General Script Settings';
                        settingsActualText.setAttribute('class', 'entryTitle');



                        var settingsText = document.createElement('div');
                        settingsText.innerText = 'Chat Settings';
                        settingsText.setAttribute('class', 'entryTitle');
                        settingsText.style.fontSize = '18px'
                        settingsText.style.float = 'left'
                        settingsText.style.marginTop = '0.5em'

                        //Settings Checkboxes
                        settingsActual.appendChild(settingsUpdateRequestDismissToggle());
                        //settingsActual.appendChild(settingsSortAlerts());
                        settingsActual.appendChild(settingsNSFWToggle());
                        settingsActual.appendChild(settingsLiveRestore());
                        settingsActual.appendChild(settingsLiveLight());
                        settingsActual.appendChild(settingsRemoveBlankTopics());
                        settingsActual.appendChild(settingsFormRemove());
                        settingsActual.appendChild(settingsTagBlacklist());
                        settingsActual.appendChild(settingsTaggedAuthor());
                        settingsActual.appendChild(settingsAuthorBlacklist());
                        settingsActual.appendChild(settingsText);

                        settingsActual.appendChild(settingsAnonToggle());
                        settingsActual.appendChild(settingsRollerToggle());
                        settingsActual.appendChild(settingsAuthorHighlight());
                        settingsActual.appendChild(settingsLightHighlight());
                        settingsActual.appendChild(settingsNamefagToggle());
                        settingsActual.appendChild(settingsAnonRevealToggle());
                        settingsActual.appendChild(settingsUnpublishToggle());
                        settingsActual.appendChild(settingsChatBlacklist());
                        settingsActual.appendChild(settingsChatBlacklistRepliesToggle());
                        settingsActual.appendChild(settingsAkunPlusToggle());
                        settingsActual.appendChild(settingsImageResize());
                        settingsActual.appendChild(settingsFunctionalLinks());
                        settingsActual.appendChild(settingsFunctionalVideos());
                        settingsActual.appendChild(settingsMsgEditToggle());

                        settingsActual.prepend(settingsActualText);

                        return settingsActual
                    }

                    var settingsTop = document.createElement('div');
                    settingsTop.setAttribute('id', 'scriptTitle');
                    var settingsTopText = document.createElement('h1');
                    settingsTopText.innerText = 'Script Config';
                    settingsTopText.style.margin = '0';
                    settingsTop.appendChild(settingsTopText)

                    try {
                        var settingsSelect = document.createElement('div');
                        settingsSelect.setAttribute("class", "settingsSelect");
                        var settingsTabs = ['General', 'Tags', 'Chat', 'Alerts', 'Author', 'Site Style'];
                        let tabC = 0;
                        function createTab(tab) {
                            let settingsSelectBTN = document.createElement('input');
                            settingsSelectBTN.setAttribute("type", "button");
                            settingsSelectBTN.setAttribute("class", "settingsSelectBTN");
                            settingsSelectBTN.value = String(tab);
                            if (tabC == 0) {
                                settingsSelectBTN.style.backgroundColor = '#4b4f6b';
                                settingsSelectBTN.disabled = true;
                                tabC = 1;
                                var settingTab = document.querySelector(`.settingsTab[name="${String(tab)}"]`)

                                }
                            settingsSelectBTN.onclick = function () {
                                let len = document.querySelectorAll('input.settingsSelectBTN');
                                for (let i = 0; i < len.length; i++) {
                                    if (len[i].disabled == true) {
                                        len[i].disabled = false;
                                        len[i].style.backgroundColor = '#373952';
                                    }
                                };
                                this.disabled = true;
                                this.style.backgroundColor = '#4b4f6b';
                                try {
                                    var settingTab = document.querySelector(`.settingsTab[name="${String(tab)}"]`)
                                    if (settingTab) {
                                        var tabs = document.querySelectorAll(`div.settingsTab`)
                                        for (let i = 0; i < tabs.length; i++) {
                                            tabs[i].style.display = 'none';
                                        };
                                        settingTab.style.display = 'initial'
                                    }
                                } catch (error) {
                                    console.log(error);
                                };
                            };

                            let settingsSelectDiv = document.createElement('div');
                            settingsSelectDiv.setAttribute('class', 'settingsSelectDiv');
                            settingsSelectDiv.style.width = String(100 / settingsTabs.length) + '%';
                            settingsSelectDiv.appendChild(settingsSelectBTN);
                            settingsSelect.appendChild(settingsSelectDiv);
                        }
                        settingsTabs.forEach(tab => createTab(tab));
                    } catch (error) {
                        console.log(error);
                    }

                    var settingsExit = document.createElement('a');
                    settingsExit.setAttribute('class', 'blacklistRemove');
                    settingsExit.innerText = 'Exit'
                    settingsExit.onclick = function () {
                        document.querySelector('#confDisp').style.display = 'none'
                    };

                    function contact() {
                        function topicSendMessage(){
                            try{
                                let message = document.querySelector('[name="topicMessage"]').value;
                                fetch("https://fiction.live/api/node", {
                                    "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",
                                        "Cache-Control": "max-age=0"
                                    },
                                    "referrer": "https://fiction.live/social/threads/Fiction-live-script-Update-19-Custom-Site-Colors/snFwRdTqfhBoQxutt",
                                    "body": `r%5B%5D=snFwRdTqfhBoQxutt&nt=chat&b=${message}`,
                                    "method": "POST",
                                    "mode": "cors"
                                });
                                document.querySelector('[name="topicMessage"]').value = null;
                            }catch(error){console.log(error)}

                        }
                        var contactLeft = document.createElement('div');
                        contactLeft.setAttribute('class', 'contactL');

                        var contactContainer = document.createElement('div');
                        contactContainer.setAttribute('id', 'reportDiv');
                        contactContainer.innerText = 'Report any issues you encounter to me through either of the links below or the comment box to the side.';
                        contactContainer.style.fontSize = '20px';
                        contactContainer.style.padding = '5px';
                        contactContainer.style.color = 'white';

                        var contactAkun = document.createElement('a');
                        contactAkun.innerText = 'Akun Script Topic';
                        contactAkun.href = 'https://fiction.live/social/threads/snFwRdTqfhBoQxutt';
                        contactAkun.rel = "noopener noreferrer";
                        contactAkun.target = "_blank";

                        var contactGreasyfork = document.createElement('a');
                        contactGreasyfork.innerText = 'Greasyfork Page';
                        contactGreasyfork.href = 'https://greasyfork.org/en/scripts/418607-fiction-live-merged';
                        contactGreasyfork.rel = "noopener noreferrer";
                        contactGreasyfork.target = "_blank";

                        var contactRight = document.createElement('div');
                        contactRight.setAttribute('class', 'contactR');

                        var topicMessage = document.createElement('textarea');
                        topicMessage.setAttribute('name', 'topicMessage');
                        topicMessage.setAttribute('class', 'topicMessage');
                        topicMessage.setAttribute('placeholder', "You can use this to report issues. Fill the box in then press the button. Check the topic for replies.");
                        topicMessage.setAttribute("cols", "1");
                        topicMessage.setAttribute("rows", "5");

                        var sendMessage = document.createElement('input');
                        sendMessage.setAttribute("type", "button");
                        sendMessage.setAttribute("class", "colors");
                        sendMessage.value='Send report to topic.'
                        sendMessage.onclick=topicSendMessage;
                        sendMessage.style.background = 'rgb(42,44,59) !important';

                        var contact = document.createElement('div');
                        contact.setAttribute('class', 'contactMain');
                        contactContainer.appendChild(document.createElement('br'));
                        contactContainer.appendChild(contactAkun);
                        contactContainer.appendChild(document.createElement('br'));
                        contactContainer.appendChild(contactGreasyfork);
                        contactLeft.appendChild(contactContainer);
                        contactRight.appendChild(topicMessage);
                        contactRight.appendChild(sendMessage);
                        contact.appendChild(contactLeft);
                        contact.appendChild(contactRight);

                        return contact;
                    };

                    settingsTop.appendChild(settingsExit)
                    var confDisp = configDisplay();
                    var confBox = configBox();
                    confBox.appendChild(settingsTop);
                    confBox.appendChild(settingsSelect);
                    confBox.appendChild(settingsActual());
                    confBox.appendChild(settingsTagsBlacklist());
                    confBox.appendChild(settingsUserBlacklist());
                    confBox.appendChild(settingsAuthorsBlacklist());
                    confBox.appendChild(settingsStyle());
                    confBox.appendChild(settingsBlacklist());
                    confBox.appendChild(contact());
                    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();
    awaitAlerts()
    awaitMainMenu();
})();