// ==UserScript==
// @name Fiction.Live Merged
// @namespace http://tampermonkey.net/
// @version 38
// @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=`
#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;
}
#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;
}
.blacklistEntry{
font-size:20px;
float:left;
min-width:50%;
color:white;
display:inline-block;
border:thin solid silver;
padding:5px;
}
.blacklistRemove{
color:white;
font-size:20px;
display:inline-block;
border:3px solid red;
background: red !important;
float:right;
padding-left:5px;
padding-right:5px;
}
.blacklistRemove:hover{
color:white;
}
#settingsBox{
margin-bottom:5px;
}
.settingsInput{
color:white;
max-width:40%;
height:30px;
margin:0 !important;
}
#settingsBlacklist{
padding:5px;
}
#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;
boxs-hadow:0 0 10px #000000;
pointer-evnts:auto;
}
.functionalLink{
padding:0.5em;
}
.linkDiv{
width: 100%;
overflow: auto;
}
.linkDiv img{
width: 100%;
display: block;
}
.settingsToggle{
min-width:25%;
font-size:20px;
color:white;
border:thin solid silver;
padding:5px;
max-width:25%;
float:left;
}
.settingsTab{
padding:5px;
display:none;
}
.settingsSelect{
max-height:80px;
padding-top:5px;
}
.settingsSelectDiv{
display:inline-block;
backgroundColor:#4b4f6b;
box-sizing=border-box;
height:2em;
}
.settingsSelectBTN{
width:100% !important;
height:100%;
font-size:20px;
color:white;
text-decoration:none;
background:#373952 !important;
box-sizing:border-box;
border:1px #21222b solid;
}
.settingsSelectBTN:disabled{
background:#4b4f6b !important;
}
.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;
}
.toggleCheck {
-webkit-appearance: none;
background:white !important;
border: 1px solid #cacece;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px -15px 10px -12px rgba(0, 0, 0, 0.05);
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;
}
.toggleCheck:active,
.toggleCheck:checked:active {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px 1px 3px rgba(0, 0, 0, 0.1);
}
.toggleCheck:checked {
background-color: #e9ecee;
border: 1px solid #adb8c0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px -15px 10px -12px rgba(0, 0, 0, 0.05), inset 15px 10px -12px rgba(255, 255, 255, 0.1);
color: black;
}
.toggleCheck:checked:after {
content: '\\2714';
font-size: 20px;
position: absolute;
left: 2px;
color: black;
}
.toggleCheck:after {
content: '\\2716';
font-size: 20px;
position: absolute;
top: -5px;
left: 1px;
color: black;
}
.functionalContainer {
position: relative;
width: 100%;
padding-bottom: 100%;
}
.functionalVideo {
position: absolute;
width: 100%;
height: 100%;
}
.entryTitle{
min-width:100%;
font-Size:20px;
color:white;
}
`
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;
try{
var alertBlacklist = JSON.parse(localStorage.getItem('alertBlacklist'));
alertBlacklist = [...new Set(alertBlacklist)];
}
catch(error){};
var settings = JSON.parse(localStorage.getItem('FL_Settings'));
var defaultSettings = {
'imageResize':true,
'questRemove':true,
'questAuthorRemove':true,
'removeTaggedAuthor':false,
'anonToggle':false,
'removeUsernames':false,
'autoRoller':false,
'removeTopicForm':true,
'removeBlankTopics':true,
'authorHighlight':true,
'authorBlacklist':[],
'chatBlacklist':false,
'chatBlacklisted':[],
'tagBlacklist':[],
'alertBlacklist':[],
'highlightColor':'#393c59',
'highlightLight':'#fc8c03',
'highlightLightToggle':false,
'liveRestore':true,
'liveLight':false,
'functionalLinks':false,
'functionalVideos':false,
'removeNSFW':false,
'updateRequestDismiss':false,
'alertContainer':999,
'akunPlus':'Ignore',
'customCSS':[{},``]
};
//Updates settings when there is a change between versions.
if (!settings){
console.log('Settings set to defaults.');
settings = defaultSettings
}
else if (Object.keys(settings).length !== Object.keys(defaultSettings).length){
console.log('Settings differ in length.');
Object.keys(defaultSettings).forEach(
function(key){
if (!(key in settings)){
settings[key] = defaultSettings[key];
console.log('Added '+key+' to the current settings.');
};
}
);
if (Object.keys(settings).length > Object.keys(defaultSettings).length){
Object.keys(settings).forEach(
function(key){
if (!(key in defaultSettings)){
console.log(`Removed invalid variable and value from settings, ${key}:${settings[key]}.`);
delete settings[key]
};
}
);
}
};
//For handling merge and deletion of alertBlacklist storage item.
if (typeof alertBlacklist != ('undefined' || 'null')){
if (settings.alertBlacklist.length == 0 && alertBlacklist.length > 0){
console.log('set and remove alert bl');
settings.alertBlacklist = alertBlacklist;
try{
localStorage.removeItem('alertBlacklist');
}catch(error){console.log(error);};
}
else if(settings.alertBlacklist.length == 0 && alertBlacklist.length == 0){
try{
localStorage.removeItem('alertBlacklist');
}catch(error){console.log(error);};
}
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
function sortQuestTags(){
//ignore this
var list = document.querySelector('span.tags');
var l2 = [...list.children];
var l3 = l2.filter(
function(value, index, arr){
if (value.className !== 'tag more ng-scope'){
return value
};
}
);
l3.sort((a,b)=>a.innerText>b.innerText?1:-1).forEach(node=>list.appendChild(node));
};
function blacklistRemove(item){
if (settings.alertBlacklist.includes(item)){
let position = settings.alertBlacklist.indexOf(item);
settings.alertBlacklist.splice(position, 1);
localStorage.setItem('FL_Settings', JSON.stringify(settings));
};
};
function repeatChecker(){
try{
let thisPage = window.location.href;
if (thisPage !== lastURL){
try{
questCheck.observerQst.disconnect();
}catch(error){
}
try{
questCheck.observerTopic.disconnect();
}catch(error){
}
pageCheck();
lastURL = window.location.href;
};
}catch(error){
console.log('Error with repeatChecker',error);
};
};
setInterval(repeatChecker,500);
function chatSend(info){
let body = info[1]
try{
//var encodedBody = encodeURI(body);
fetch("https://fiction.live/api/anonkun/dice", {
"credentials": "include",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
"Accept": "*/*",
"Accept-Language": "en-GB,en;q=0.5",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
},
"referrer": window.location.href,
"body": body,
"method": "POST",
"mode": "cors"
}
);
}catch(error){
console.log('Error with chatSend',error);
}
try{
let chapterID = info[0][0]
let dataID = info[0][1]
let roll = info[0][2]
var cookies = document.cookie;
cookies=cookies.split("; ")
for (let i = 0; i < cookies.length; i++){
var cookie = cookies[i].split("=")
if (/.*distinct_id.*/.test(cookie)){
var cookieName = cookie[0].replace(/_posthog/,'')
cookieName = cookieName.replace('ph_','')
}
}
fetch("https://fiction.live/api/node", {
"credentials": "include",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
"Accept": "*/*",
"Accept-Language": "en-GB,en;q=0.5",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
},
"referrer": `https://fiction.live/stories/${body}`,
"body": encodeURI(`r[]=${chapterID}&r[]=${dataID}&nt=chat&b=%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){
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{
console.log('xx',quest.parentNode)
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);
}
if (settings.removeNSFW == true){
if (quest.parentNode.classList.contains('nsfwCover')){quest.parentNode.classList.remove('nsfwCover')}
}
}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 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)) {
console.log('yaapage');
//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\/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 chatBlacklist(message){
function delMSG(name){
if (name == message.querySelector('div.user').querySelector('span').innerText){
//message.remove();
message.style.display = 'none';
return;
};
}
if (settings.chatBlacklist != true && settings.chatBlacklisted.length == 0){
return;
}
else{
settings.chatBlacklisted.forEach(name=>delMSG(name));
};
};
function chatThings() {
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 handleMsg (message){
if(message.tagName == 'HEADER'){return;}
chatBlacklist(message);
imageResize(message);
authorHighlight(message);
functionalLinks(message);
removeUsernames(message);
akunPlus(message);
}
waitForChat();
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){
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(){
console.log(this.getAttribute('hide'));
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(){
console.log(this.getAttribute('hide'));
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(){
console.log(this.getAttribute('hide'));
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
}
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);
for (var i = 0;i<matches.length;i++){
if (typeof matches[i]=='undefined' || matches[i].startsWith('/')|| matches[i].length < 5 || /.+\..+/.test(matches[i])==false){}
else{
try{
if (/([a-z]*\.{2,}[a-z]*)/.test(matches[i])==true){return};
var elm;
if (/https?:\/\//.test(matches[i])==false){matches[i]='https://'.concat(matches[i])};
if(/.*(jpg|jpeg|png|gif|webm|webp)/.test(matches[i])){
elm=new link('img',1,matches[i]);
Control[1]=1;
}else if(settings.functionalVideos == true && /youtube/.test(matches[i])){
if(/.*v=(\w+).*/.test(matches[i])){
let src = `https://www.youtube.com/embed/${(matches[i].match(/v=(\w+)/)[1])}`;
elm=new link('iframe',3,`https://www.youtube.com/embed/${(matches[i].match(/v=(\w+)/)[1])}`);
message.querySelector('.chatMsg').parentNode.appendChild(elm);
}
else if(/be\/(\w+)/.test(matches[i])){
let src = `https://www.youtube.com/embed/${(matches[i].match(/be\/(\w+)/)[1])}`;
elm=new link('iframe',3,`https://www.youtube.com/embed/${(matches[i].match(/be\/(\w+)/)[1])}`)
message.querySelector('.chatMsg').parentNode.appendChild(elm);
}
Control[2]=1;
}else{
elm=new link('a',2,matches[i]);
Control[0]=1;
}
}catch(error){error;};
}
};
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);
};
}catch(error){error}
};
function removeUsernames(message){
//return;
//console.log('this shouldnt be seen')
if (settings.removeUsernames == true && message.querySelector('span.name')){
message.querySelector('span.name').style.display = 'none';
let authorList = document.querySelectorAll('span.author.ng-scope');
let authors=[]
authorList.forEach(element=>authors.push(element.querySelector('span.name').innerText))
try {
console.log(authors)
console.log(message.querySelector('span.name'))
if (authors.includes(message.querySelector('span.name').innerText)) {
message.querySelector('span.name').style.display = 'initial';
return;
}
else {
console.log('ac')
setTimeout(function(){
try{
message.querySelector('img.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
};
function whenNewMessage(chat) {
var options = {
childList: true
};
function messageMod(mutations) {
for (let mutation of mutations) {
try{
var message = mutation.addedNodes[0];
chatBlacklist(message);
removeUsernames(message);
authorHighlight(message);
imageResize(message);
autoRoll(message);
functionalLinks(message);
akunPlus(message)
//observerMessage.disconnect();
}catch(error){
console.log('New Message Error',error);
}
};
};
let observerMessage = new MutationObserver(messageMod);
observerMessage.observe(chat, options);
};
function withOldMessage(chat) {
let messages = chat.childNodes;
try {
messages.forEach(messageMod);
} catch (error) {
console.log('tried running msgmod',error)
};
function messageMod(message) {
try {
chatBlacklist(message);
imageResize(message);
authorHighlight(message);
functionalLinks(message);
akunPlus(message);
} catch (error) {
console.log('messageMod', 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 qq=document.querySelectorAll('article.chatLog')
for (var i=0;i<qq.length;i++){
whenNewMessage(qq[i].querySelector('div.jadeRepeat'));
withOldMessage(qq[i].querySelector('div.jadeRepeat'));
}
break;
};
};
};
};
};
function deleteTopicCreate(){
try{
if (settings.removeTopicForm == true){
let formItem = document.querySelector('div.formItem');
if (formItem){
formItem.parentNode.remove();
};
};
}catch(error){
console.log('Error with removing topic form',error);
};
};
function blacklistAdd(){
let title = this.parentNode.querySelector('[set-text="item.value.value"]').textContent.replace(' went live', '');
let author = this.parentNode.querySelector('span.user').innerText;
let entry = title+'___'+author;
settings.alertBlacklist.push(entry);
localStorage.setItem('FL_Settings', JSON.stringify(settings));
let dismiss = this.parentNode.querySelector('a.dismiss');
simClick(dismiss);
document.querySelector('.settingsTab[name="Alerts"]').querySelector('div#settingsBlacklist').appendChild(elementBlacklisted(entry));
};
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());
};
function blacklistCheck(alert){
try{
var title = alert.querySelector('[set-text="item.value.value"]').textContent.replace(' went live', '');
var author = alert.querySelector('span.user').innerText;
var dismiss = alert.querySelector('a.dismiss');
if (settings.alertBlacklist.includes(title+'___'+author)){
simClick(dismiss);
}
else{
alertBlacklistButton(alert);
};}
catch(error){
console.log('blacklist checker error',error)
};
};
function updateCheck(alert){
if (settings.updateRequestDismiss==false){return;}
//console.log(settings.updateRequestDismiss);
//console.log(alert);
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);
console.log('dismissed update request')
}
}
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 monitorAlerts() {
try {
function getAlertContainer(){
//goes through the containers and finds the correct one, hopefully
console.log('Finding alert container');
for(var i=0;i<alertContainer.length;i++){
if(alertContainer[i].children.length == 0){continue;};
try{
if (/.*went live.*/.test(alertContainer[i].querySelector('li').querySelector('div.value').innerText)){
settings.alertContainer=i;
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
alertContainer=alertContainer[i];
break;
};
}catch(error){};
};
}
var alertContainer = document.getElementsByClassName('feedType');
if (settings.alertContainer != 999){
console.log('Loading saved container')
let savedAlert=alertContainer[settings.alertContainer].querySelector('li').querySelector('div.value').innerText;
if (/.* went live.*/.test(savedAlert)){
alertContainer=alertContainer[settings.alertContainer];
}else{
console.log('Saved container invalid');
getAlertContainer();}
}else{
getAlertContainer();
}
alertContainer.querySelectorAll('li').forEach(alert => blacklistCheck(alert))
var observer = new MutationObserver(function (mutations, me) {
try {
for (let mutation of mutations) {
if (mutation.addedNodes[0] !== undefined) {
if (mutation.addedNodes[0].className == ('feedItem ng-scope ng-animate')) {
blacklistCheck(mutation.addedNodes[0]);
};
};
};
} catch (error) {
console.log('Alert monitor error',error)
};
});
observer.observe(alertContainer, {
childList: true
});
} catch(error) {
console.log(error);
//console.log('You have no alerts, which broke the alert monitor. Just refresh the page at any point and it will work, provided there are alerts to see.')
//console.log('It will automatically retry in 60 seconds too, ignore repeated messages.')
//console.log('If you can see this then the error below just means you have no alerts. Ignore it.')
//console.log('Alert Watcher Fail',error)
};
};
function monitorUpdates() {
function getUpdateContainer(){
for(var i=0;i<alertContainer.length;i++){
try{
let firstAlert=alertContainer[i].querySelector('li').querySelector('div.value').innerText;
if (/.*Looks forward to the next update for.*/.test(firstAlert)){
alertContainer=alertContainer[i];
console.log('Found update container');
break;
}
}catch(error){}
}
};
try {
var alertContainer = document.getElementsByClassName('feedType');
if(settings.alertContainer != 999){
try{
let alertText=alertContainer[settings.alertContainer+1].querySelector('li').querySelector('div.value').innerText;
if (/.*Looks forward to the next update for.*/.test(alertText)){
alertContainer=alertContainer[settings.alertContainer+1];
console.log('Found update container');
}
else{getUpdateContainer();}
}catch(error){getUpdateContainer();}
}else{getUpdateContainer();};
alertContainer.querySelectorAll('li').forEach(alert => updateCheck(alert))
var observer = new MutationObserver(function (mutations, me) {
try {
for (var mutation of mutations) {
if (mutation.addedNodes[0] !== undefined) {
if (mutation.addedNodes[0].className == ('feedItem ng-scope ng-animate')) {
updateCheck(mutation.addedNodes[0]);
};
};
};
} catch (error) {
console.log('Update monitor error',error)
};
});
observer.observe(alertContainer, {
childList: true
});
} catch (error) {
//console.log('You have no alerts, which broke the alert monitor. Just refresh the page at any point and it will work, provided there are alerts to see.')
//console.log('It will automatically retry in 60 seconds too, ignore repeated messages.')
//console.log('If you can see this then the error below just means you have no alerts. Ignore it.')
//console.log('Alert Watcher Fail',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')
settingsBlacklisted.innerText = element
settingsBlacklisted.innerText = settingsBlacklisted.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(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
};
//Toggles features here
function settingsImageResize(){
var settingsImageResize = document.createElement('div');
settingsImageResize.setAttribute('class', 'settingsToggle');
settingsImageResize.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(settingsImageResizeCheckbox);
return settingsImageResize
};
function settingsRemoveBlankTopics(){
var settingsRemoveBlankTopics = document.createElement('div');
settingsRemoveBlankTopics.setAttribute('class', 'settingsToggle');
settingsRemoveBlankTopics.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(settingsRemoveBlankTopicsCheckbox);
return settingsRemoveBlankTopics
};
function settingsFormRemove(){
var settingsFormRemove = document.createElement('div');
settingsFormRemove.setAttribute('class', 'settingsToggle');
settingsFormRemove.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(settingsFormRemoveCheckbox);
return settingsFormRemove
};
function settingsChatBlacklist(){
var settingsChatBlacklist = document.createElement('div');
settingsChatBlacklist.setAttribute('class', 'settingsToggle');
settingsChatBlacklist.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(settingsChatBlacklistCheckbox);
return settingsChatBlacklist
};
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');
chatBlacklisted.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(settingsUserRemove);
return chatBlacklisted;
} catch (error) {
console.log('', 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 () {
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.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 settingsAuthorBlacklist(){
var settingsAuthorBlacklist = document.createElement('div');
settingsAuthorBlacklist.setAttribute('class','settingsToggle')
settingsAuthorBlacklist.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(settingsAuthorBlacklistCheckbox);
return settingsAuthorBlacklist
};
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')
authorBlacklisted.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(settingsAuthorRemove);
return authorBlacklisted;
} catch (error) {
console.log('', 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 () {
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.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 settingsTagBlacklist(){
var settingsTagBlacklist = document.createElement('div');
settingsTagBlacklist.setAttribute("class", "settingsToggle");
settingsTagBlacklist.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(settingsTagBlacklistCheckbox);
return settingsTagBlacklist
};
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');
tagBlacklisted.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(settingsTagRemove);
return tagBlacklisted;
}catch(error){console.log('',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 (){
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.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;
};
//Toggles for features start here
function settingsNamefagToggle(){
var settingsNamefagToggle = document.createElement('div');
settingsNamefagToggle.setAttribute('class','settingsToggle');
settingsNamefagToggle.innerText = 'Make everyone Anon.';
var settingsNamefagToggleCheckbox = document.createElement('input');
settingsNamefagToggleCheckbox.setAttribute("type", "checkbox");
settingsNamefagToggleCheckbox.setAttribute("class", "toggleCheck");
if (settings.removeUsernames == true){
settingsNamefagToggleCheckbox.checked = true;
};
settingsNamefagToggle.addEventListener('change', (event) => {
if (event.target.checked) {
settings.removeUsernames = true;
} else {
settings.removeUsernames = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsNamefagToggle.appendChild(settingsNamefagToggleCheckbox);
return settingsNamefagToggle
};
function settingsRollerToggle(){
var settingsRollerToggle = document.createElement('div');
settingsRollerToggle.innerText = 'Toggle Auto Roller.';
settingsRollerToggle.setAttribute('class','settingsToggle');
var settingsRollerToggleCheckbox = document.createElement('input');
settingsRollerToggleCheckbox.setAttribute("type", "checkbox");
settingsRollerToggleCheckbox.setAttribute("class", "toggleCheck");
if (settings.autoRoller == true){
settingsRollerToggleCheckbox.checked = true;
};
settingsRollerToggle.addEventListener('change', (event) => {
if (event.target.checked) {
settings.autoRoller = true;
} else {
settings.autoRoller = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsRollerToggle.appendChild(settingsRollerToggleCheckbox);
return settingsRollerToggle
};
function settingsAnonToggle(){
function toggleAnonStatus(){
var x=1
try{
try{
var username = localStorage.getItem('username');
var refURL = "https://fiction.live/user/"+username;
var profile = window.ty.currentUser.profile;
profile.asAnon = settings.anonToggle;
}catch(error){
console.log('Toggle Anon Prep',error);x=2;
};
if (x=1){
fetch("https://fiction.live/api/user", {
"credentials": "include",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "en-GB,en;q=0.5",
"Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest"
},
"referrer": refURL,
"body": JSON.stringify(profile),
"method": "PUT",
"mode": "cors"
});};
}catch(error){
console.log('Toggle Anon Set',error);
};
};
var settingsAnonToggle = document.createElement('div');
settingsAnonToggle.innerText = 'Toggle Anon status.';
settingsAnonToggle.setAttribute('class','settingsToggle');
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(settingsAnonToggleCheckbox);
return settingsAnonToggle
};
function settingsLiveRestore(){
var settingsLiveRestore = document.createElement('div');
settingsLiveRestore.innerText = 'Restore live timer to nav bar.';
settingsLiveRestore.setAttribute('class','settingsToggle');
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;
} else {
settings.liveRestore = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsLiveRestore.appendChild(settingsLiveRestoreCheckbox);
return settingsLiveRestore
};
function settingsLiveLight(){
var settingsLiveLight = document.createElement('div');
settingsLiveLight.innerText = 'Light mode live timer.';
settingsLiveLight.setAttribute('class','settingsToggle');
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(settingsLiveLightCheckbox);
return settingsLiveLight
};
function settingsAuthorHighlight(){
var settingsAuthorHighlight = document.createElement('div');
settingsAuthorHighlight.innerText = 'Highlight author(s) in chat.';
settingsAuthorHighlight.setAttribute('class','settingsToggle');
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;
} else {
settings.authorHighlight = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsAuthorHighlight.appendChild(settingsAuthorHighlightCheckbox);
return settingsAuthorHighlight
};
function settingsLightHighlight(){
var settingsLightHighlight = document.createElement('div');
settingsLightHighlight.innerText = 'Light mode highlighting.';
settingsLightHighlight.setAttribute('class','settingsToggle');
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;
} else {
settings.highlightLightToggle = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsLightHighlight.appendChild(settingsLightHighlightCheckbox);
return settingsLightHighlight
};
function settingsTaggedAuthor(){
var settingsTaggedAuthor = document.createElement('div');
settingsTaggedAuthor.innerText = 'Hide tagged on author pages.';
settingsTaggedAuthor.setAttribute('class','settingsToggle');
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(settingsTaggedAuthorCheckbox);
return settingsTaggedAuthor
};
function settingsFunctionalLinks(){
var settingsFunctionalLinks = document.createElement('div');
settingsFunctionalLinks.innerText = 'Make text links functional.';
settingsFunctionalLinks.setAttribute('class','settingsToggle');
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(settingsFunctionalLinksCheckbox);
return settingsFunctionalLinks
};
function settingsFunctionalVideos(){
var settingsFunctionalVideos = document.createElement('div');
settingsFunctionalVideos.innerText = 'Make video links functional.';
settingsFunctionalVideos.setAttribute('class','settingsToggle');
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(settingsFunctionalVideosCheckbox);
return settingsFunctionalVideos
};
function settingsNSFWToggle(){
var settingsNSFWToggle = document.createElement('div');
settingsNSFWToggle.innerText = 'Remove NSFW cover from quests.';
settingsNSFWToggle.setAttribute('class','settingsToggle');
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;
} else {
settings.removeNSFW = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsNSFWToggle.appendChild(settingsNSFWToggleCheckbox);
return settingsNSFWToggle
};
function settingsupdateRequestDismissToggle(){
var settingsupdateRequestDismissToggle = document.createElement('div');
settingsupdateRequestDismissToggle.innerText = 'Auto dismiss update requests.';
settingsupdateRequestDismissToggle.setAttribute('class','settingsToggle');
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;
} else {
settings.updateRequestDismiss = false;
};
localStorage.setItem('FL_Settings', JSON.stringify(settings));
settings = JSON.parse(localStorage.getItem('FL_Settings'));
});
settingsupdateRequestDismissToggle.appendChild(settingsupdateRequestDismissToggleCheckbox);
return settingsupdateRequestDismissToggle
};
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. You did try it on a quest, RIGHT?',error);
}
};
var settingsBlacklist = document.createElement('div');
settingsBlacklist.setAttribute('id', 'settingsBlacklist');
settings.alertBlacklist.forEach(element => settingsBlacklist.appendChild(elementBlacklisted(element)));
var settingsBlacklistText = document.createElement('div');
settingsBlacklistText.innerText = 'Alert Blacklist';
settingsBlacklistText.setAttribute('class','entryTitle');
settingsAlertBox.prepend(settingsAlertAdd);
settingsBlacklist.prepend(settingsAlertBox);
settingsBlacklist.prepend(settingsBlacklistText);
settingsTab.appendChild(settingsBlacklist)
return settingsTab;
};
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 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(){
document.querySelectorAll('.styleEntry').forEach(
x => {
let name=x.getAttribute("name");
let value = x.querySelector('.colorSet').value;
if (value !== undefined){
settings.customCSS[0][name] = value;
}
}
);
for (var key in settings.customCSS[0]) {
if (settings.customCSS[0].hasOwnProperty(key)) {
console.log(key, settings.customCSS[0][key]);
}
}
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.styleSheet.cssText = styleS;
} else {
style.appendChild(document.createTextNode(styleS));
}
document.getElementsByTagName('head')[0].appendChild(style);
};
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 xx=document.querySelector('#styleInput');
let xy=document.querySelector('#styleSaveCSS');
console.log(xx)
if (xx.style.display != 'none'){
xx.style.display = 'none';
xy.style.display = 'none';
}
else{
xx.style.display = 'initial';
xy.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.styleSheet.cssText = 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(){
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));
};
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", "5");
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] != {}){
var styleS=`*{color:${settings.customCSS[0].color}!important;background:${settings.customCSS[0].background} !important;}`
var style = document.createElement('style');
style.setAttribute("name", "styleSheet");
if (document.querySelector('[name="styleSheet"]')) {
document.querySelector('[name="styleSheet"]').remove();
style.styleSheet.cssText = 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 (style2.stylesheet){
if (document.querySelector('[name="styleSheet"]')) {
document.querySelector('[name="styleSheet"]').remove();
style2.setAttribute("name", "styleSheet");
style2.styleSheet.cssText = styleS2;
} else {
style2.setAttribute("name", "styleSheet");
style2.appendChild(document.createTextNode(styleS2));
}
document.getElementsByTagName('head')[0].appendChild(style2);
}
}}catch(error){console.log(error)}
return settingsStyle;
}
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');
//Settings Checkboxes
settingsActual.appendChild(settingsAnonToggle());
settingsActual.appendChild(settingsupdateRequestDismissToggle());
settingsActual.appendChild(settingsNSFWToggle());
settingsActual.appendChild(settingsRollerToggle());
settingsActual.appendChild(settingsNamefagToggle());
settingsActual.appendChild(settingsImageResize());
settingsActual.appendChild(settingsFunctionalLinks());
settingsActual.appendChild(settingsFunctionalVideos());
settingsActual.appendChild(settingsLiveRestore());
settingsActual.appendChild(settingsLiveLight());
settingsActual.appendChild(settingsAuthorHighlight());
settingsActual.appendChild(settingsLightHighlight());
settingsActual.appendChild(settingsRemoveBlankTopics());
settingsActual.appendChild(settingsFormRemove());
settingsActual.appendChild(settingsTagBlacklist());
settingsActual.appendChild(settingsTaggedAuthor());
settingsActual.appendChild(settingsChatBlacklist());
settingsActual.appendChild(settingsAuthorBlacklist());
settingsActual.appendChild(settingsAkunPlusToggle());
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 reportIssuesHere(){
var reportIssuesHere = document.createElement('div');
reportIssuesHere.setAttribute('id','reportDiv');
reportIssuesHere.innerText = 'Report any issues you encounter to me through either of the links below.';
reportIssuesHere.style.fontSize = '20px';
reportIssuesHere.style.color = 'white';
reportIssuesHere.style.padding = '5px';
var reportIssuesHereA = document.createElement('a');
reportIssuesHereA.innerText = 'Akun Forum';
reportIssuesHereA.href = 'https://fiction.live/social/threads/snFwRdTqfhBoQxutt';
reportIssuesHereA.rel="noopener noreferrer"
reportIssuesHereA.target="_blank"
reportIssuesHere.appendChild(document.createElement('br'));
reportIssuesHere.appendChild(reportIssuesHereA);
var reportIssuesHereB = document.createElement('a');
reportIssuesHereB.innerText = 'Greasyfork Page';
reportIssuesHereB.href = 'https://greasyfork.org/en/scripts/418607-fiction-live-merged';
reportIssuesHereB.rel="noopener noreferrer"
reportIssuesHereB.target="_blank"
reportIssuesHere.appendChild(document.createElement('br'));
reportIssuesHere.appendChild(reportIssuesHereB);
return reportIssuesHere;
};
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(reportIssuesHere());
confDisp.appendChild(confBox);
document.querySelector('body').prepend(confDisp);
}
}catch (error){
console.log('Settings Display Error',error);
};
};
function settingsOpen(){
var myLive = document.createElement('li');
myLive.setAttribute('id', 'confScript');
myLive.style.textShadow = '-1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000';
myLive.style.fontWeight = 'bold';
var configOpen = document.createElement('a');
configOpen.innerText = 'Config';
configOpen.onclick = function(){document.querySelector('#confDisp').style.display = 'block'};
myLive.appendChild(configOpen);
return myLive
};
function settingsInsert(){
try{
let mainMenu = document.querySelector('nav#mainMenu');
settingsDisplay()
if (!(mainMenu.querySelector('#confScript'))){
mainMenu.childNodes[2].appendChild(settingsOpen());
}
}catch (error){console.log('Errors inserting Settings',error)};
};
settingsInsert()
};
pageCheck();
monitorAlerts();
monitorUpdates();
awaitMainMenu();
})();