// ==UserScript==
// @name MSPFA extras
// @namespace http://tampermonkey.net/
// @version 1.0.1
// @description Adds custom features to MSPFA.
// @author seymour schlong
// @match https://mspfa.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
const saveData = (data) => {
localStorage.mspfaextra = JSON.stringify(data);
console.log("Saved cookies under mspfaextra.");
};
let settings = {};
if (localStorage.mspfaextra) {
settings = JSON.parse(localStorage.mspfaextra);
} else {
settings.autospoiler = false;
settings.style = 0;
settings.styleURL = "";
saveData(settings);
}
//console.log(settings);
let styleOptions = ["Standard", "Low Contrast", "Light", "Dark", "Felt", "Trickster", "Custom"];
let myLink = document.querySelector('nav a[href="/my/"]');
let dropDiv = document.createElement('div');
dropDiv.className = 'dropdown';
Object.assign(dropDiv.style, {
position: 'relative',
display: 'inline-block',
backgroundColor: 'inherit'
});
let dropContent = document.createElement('div');
dropContent.className = 'dropdown-content';
Object.assign(dropContent.style, {
display: 'none',
backgroundColor: 'inherit',
position: 'absolute',
textAlign: 'left',
minWidth: '100px',
marginLeft: '-5px',
padding: '2px',
zIndex: '1',
borderRadius: '0 0 5px 5px'
});
dropDiv.addEventListener('mouseenter', evt => {
dropContent.style.display = 'block';
dropContent.style.color = getComputedStyle(myLink).color;
});
dropDiv.addEventListener('mouseleave', evt => {
dropContent.style.display = 'none';
});
if (myLink) {
myLink.parentNode.insertBefore(dropDiv, myLink);
dropDiv.appendChild(myLink);
dropDiv.appendChild(dropContent);
let dLinks = [];
dLinks[0] = [ 'Messages', 'My Adventures', 'Settings' ];
dLinks[1] = [ '/my/messages/', '/my/stories/', '/my/settings/' ];
for (let i = 0; i < dLinks[0].length; i++) {
let newLink = document.createElement('a');
newLink.textContent = dLinks[0][i];
newLink.href = dLinks[1][i];
dropContent.appendChild(newLink);
}
}
let dropStyle = document.createElement('style');
dropStyle.id = 'dropdown-style';
dropStyle.textContent = '#notification { z-index: 2; } .dropdown-content a { color: inherit; padding: 2px; text-decoration: underline; display: block;}';
//dropdownStyle.textContent = '#notification { z-index: 2;}.dropdown:hover .dropdown-content { display: block;}.dropdown { position: relative; display: inline-block; background-color: inherit;}.dropdown-content { display: none; position: absolute; text-align: left; background-color: inherit; min-width: 100px; margin-left: -5px; padding: 2px; z-index: 1; border-radius: 0 0 5px 5px;}.dropdown-content a { color: #fffa36; padding: 2px 2px; text-decoration: underline; display: block;}';
let theme = document.createElement('link');
Object.assign(theme, { id: 'theme', type: 'text/css', rel: 'stylesheet' });
if (!document.querySelector('#theme') && !/^\/css\/|^\/js\//.test(location.pathname)) {
document.querySelector('head').appendChild(theme);
}
if (!document.querySelector('#dropdown-style')) {
document.querySelector('head').appendChild(dropStyle);
}
const pageLoad = (fn) => {
let interval = setInterval(() => {
if (fn()) clearInterval(interval);
}, 500);
};
if (settings.style > 0) {
theme.href = settings.style < styleOptions.length - 1 ? '/css/theme' + settings.style + '.css' : settings.styleURL;
}
pageLoad(() => {
if (window.MSPFA) {
if (window.MSPFA.story.y.length > 0) {
theme.href = "";
}
return true;
}
});
if (location.pathname === "/" || location.pathname === "/preview/") {
if (settings.autospoiler) {
window.MSPFA.slide.push((p) => {
document.querySelectorAll('#slide .spoiler:not(.open) > div:first-child > input').forEach(sb => sb.click());
});
}
if (location.search) {
pageLoad(() => {
if (document.querySelector('#infobox tr td:nth-child(2)')) {
document.querySelector('#infobox tr td:nth-child(2)').appendChild(document.createTextNode('Creation date: ' + new Date(window.MSPFA.story.d).toString().split(' ').splice(1, 3).join(' ')));
return true;
}
});
pageLoad(() => {
let infoButton = document.querySelector('.edit.major');
if (infoButton) {
let editPages = document.createElement('button');
Object.assign(editPages, { className: 'editpages major edit', title: 'Edit pages'});
//infoButton.parentNode.insertBefore(editPages, infoButton);
return true;
}
});
}
}
else if (location.pathname === "/my/settings/") { // Custom settings
let saveBtn = document.querySelector('#savesettings');
let table = document.querySelector("#editsettings tbody");
let saveTr = table.querySelectorAll("tr");
saveTr = saveTr[saveTr.length - 1];
let headerTr = document.createElement('tr');
let header = document.createElement('th');
header.textContent = "Extra Settings";
headerTr.appendChild(header);
let settingsTr = document.createElement('tr');
let localMsg = document.createElement('span');
let settingsTd = document.createElement('td');
localMsg.innerHTML = "Because this is an extension, any data saved is only <b>locally</b> on this device.<br>Don't forget to <b>save</b> when you've finished making changes!";
let plusTable = document.createElement('table');
let plusTbody = document.createElement('tbody');
plusTable.appendChild(plusTbody);
settingsTd.appendChild(localMsg);
settingsTd.appendChild(document.createElement('br'));
settingsTd.appendChild(document.createElement('br'));
settingsTd.appendChild(plusTable);
settingsTr.appendChild(settingsTd);
let spoilerTr = plusTbody.insertRow(0);
let spoilerTextTd = spoilerTr.insertCell(0);
let spoilerInputTd = spoilerTr.insertCell(1);
let spoilerInput = document.createElement('input');
spoilerInputTd.appendChild(spoilerInput);
/*
let errorTr = plusTbody.insertRow(1);
let errorTextTd = errorTr.insertCell(0);
let errorInputTd = errorTr.insertCell(1);
let errorInput = document.createElement('input');
errorInputTd.appendChild(errorInput);//*/
let cssTr = plusTbody.insertRow(1);
let cssTextTd = cssTr.insertCell(0);
let cssSelectTd = cssTr.insertCell(1);
let cssSelect = document.createElement('select');
cssSelectTd.appendChild(cssSelect);
let customTr = plusTbody.insertRow(2);
let customTextTd = customTr.insertCell(0);
let customCssTd = customTr.insertCell(1);
let customCssInput = document.createElement('input');
customCssTd.appendChild(customCssInput);
plusTable.style = "text-align: center;";
spoilerTextTd.textContent = "Automatically open spoilers:";
spoilerInput.name = "p1";
spoilerInput.type = "checkbox";
spoilerInput.checked = settings.autospoiler;
/*
errorTextTd.textContent = "Fix text glitches (may break some adventures):";
errorInput.name = "p2";
errorInput.type = "checkbox";
errorInput.checked = settings.fixErrors;//*/
cssTextTd.textContent = "Change style:";
customTextTd.textContent = "Custom CSS URL:";
customCssInput.style.width = "99px";
customCssInput.value = settings.styleURL;
styleOptions.forEach(o => cssSelect.appendChild(new Option(o, o)));
// Enable the save button
spoilerInput.addEventListener("mouseup", () => {
saveBtn.disabled = false;
});
//errorInput.addEventListener("mouseup", () => {
// saveBtn.disabled = false;
//});
cssSelect.addEventListener("mouseup", () => {
saveBtn.disabled = false;
});
customCssInput.addEventListener("mouseup", () => {
saveBtn.disabled = false;
});
saveTr.parentNode.insertBefore(headerTr, saveTr);
saveTr.parentNode.insertBefore(settingsTr, saveTr);
cssSelect.selectedIndex = settings.style;
saveBtn.addEventListener('mouseup', () => {
settings.autospoiler = spoilerInput.checked;
settings.style = cssSelect.selectedIndex;
settings.styleURL = customCssInput.value;
//settings.fixErrors = errorInput.checked;
theme.href = settings.style < styleOptions.length - 1 ? '/css/theme' + settings.style + '.css' : settings.styleURL;
console.log(settings);
saveData(settings);
});
}
else if (location.pathname === "/my/messages/") { // New buttons
let btnStyle = "margin: 10px 5px;";
// Select all read messages button.
const selRead = document.createElement('input');
selRead.style = btnStyle;
selRead.value = "Select Read";
selRead.id = "selectread";
selRead.classList.add("major");
selRead.type = "button";
// On click, select all messages with the style attribute indicating it as read.
selRead.addEventListener('mouseup', () => {
document.querySelectorAll('td[style="border-left: 8px solid rgb(221, 221, 221);"] > input').forEach((m) => m.click());
});
// Select duplicate message (multiple update notifications).
const selDupe = document.createElement('input');
selDupe.style = btnStyle;
selDupe.value = "Select Same";
selDupe.id = "selectdupe";
selDupe.classList.add("major");
selDupe.type = "button";
selDupe.addEventListener('mouseup', evt => {
let temp = document.querySelectorAll('#messages > tr');
let msgs = [];
for (let i = temp.length - 1; i >= 0; i--) {
msgs.push(temp[i]);
}
let titles = [];
msgs.forEach((msg) => {
let title = msg.querySelector('a.major').textContent;
if (/^New update: /.test(title)) { // Select only adventure updates
if (titles.indexOf(title) === -1) {
if (msg.querySelector('td').style.cssText !== "border-left: 8px solid rgb(221, 221, 221);") {
titles.push(title);
}
} else {
msg.querySelector('input').click();
}
}
});
});
// Add buttons to the page.
let del = document.querySelector('#deletemsgs');
del.parentNode.appendChild(document.createElement('br'));
del.parentNode.appendChild(selRead);
del.parentNode.appendChild(selDupe);
}
else if (location.pathname === "/my/stories/") {
let guides = ["MSPFA Etiquette", "Fanventure Guide for Dummies", "CSS Guide", "HTML and CSS Things"];
let ids = ["27631", "29299", "21099", "23711"];
let authors = ["Radical Dude 42", "nzar", "MadCreativity", "seymour schlong"];
let parentTd = document.querySelector('.container > tbody > tr:last-child > td');
let unofficial = parentTd.querySelector('span');
unofficial.textContent = "Unofficial Guides";
let guideTable = document.createElement('table');
let guideTbody = document.createElement('tbody');
guideTable.style.width = "100%";
guideTable.style.textAlign = "center";
guideTable.appendChild(guideTbody);
parentTd.appendChild(guideTable);
for (let i = 0; i < guides.length; i++) {
let guideTr = guideTbody.insertRow(i);
let guideTd = guideTr.insertCell(0);
let guideLink = document.createElement('a');
guideLink.href = '/?s='+ids[i];
guideLink.textContent = guides[i];
guideLink.className = "major";
guideTd.appendChild(guideLink);
guideTd.appendChild(document.createElement('br'));
guideTd.appendChild(document.createTextNode('by '+authors[i]));
guideTd.appendChild(document.createElement('br'));
guideTd.appendChild(document.createElement('br'));
}
}
else if (location.pathname === "/user/") {
pageLoad(() => {
if (window.MSPFA) {
window.MSPFA.request(0, {
do: "user",
u: location.search.slice(3)
}, user => {
if (typeof user !== "undefined") {
let stats = document.querySelector('#userinfo table');
let joinTr = stats.insertRow(1);
let joinTextTd = joinTr.insertCell(0);
joinTextTd.appendChild(document.createTextNode("Account created:"));
let d = new Date(user.d).toString().split(' ').splice(1, 4).join(' ');
let joinDate = joinTr.insertCell(1);
let joinTime = document.createElement('b');
joinTime.appendChild(document.createTextNode(d));
joinDate.appendChild(joinTime);
}
}, status => {
console.log(status);
}, true);
return true;
}
});
}
})();