Update v1.2.2 (bitte nutzt v1.2.3, weiter unten)
Changelog:
- einen Button "NGB-Sl Buttons [an/aus] im Usermenü (für uneingeloggt im "Untermenü im Forum") hinzugefügt
- neuer Button blendet den Button zum "Add to subload" / "Remove of subload" aus (über Cookies)
- Fehlermeldungen zeigen nun auch auf die Zeile im Skript, in der der Fehler passiert ist
- Code cleanups
[src=javascript]// ==UserScript==
// @name NGB Subloader
// @namespace ngb_subload
// @description NGB Subloader
// @include https://ngb.to/
// @include https://ngb.to/#*
// @include https://ngb.to/forum*
// @version 1.2.2
// @grant none
// ==/UserScript==
var loaded = 0;
var hasLoaded = false;
var boardLinks;
function toggleVisibility(event) {
var ngbSubloadDivs = document.getElementsByClassName("ngbSubloadDiv");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl [an]";
document.cookie = "subload_switch=off";
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl [aus]";
document.cookie = "subload_switch=on";
}
for (var i = 0; i < ngbSubloadDivs.length; ++i) {
ngbSubloadDivs.style.display = show;
}
if (!hasLoaded) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
}
return false;
}
function toggleButtons(event) {
var ngbSubloadToggles = document.getElementsByClassName("subLoadtoggleForum");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl Buttons [an]";
document.cookie = "subload_switch_buttons=off";
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl Buttons [aus]";
document.cookie = "subload_switch_buttons=on";
}
for (var i = 0; i < ngbSubloadToggles.length; ++i) {
ngbSubloadToggles.style.display = show;
}
return false;
}
function toggleSubLoad(event) {
var forumId = event.target.dataset.name;
if (document.cookie.indexOf("subload_"+ forumId +"=true") != -1) {
document.cookie = "subload_"+forumId+"=false";
} else {
document.cookie = "subload_"+forumId+"=true";
}
var oldData = document.querySelector("div.ngbSubloadDiv."+forumId);
oldData.parentNode.removeChild(oldData);
loaded--;
boardLinks = document.querySelectorAll('h2.forumtitle');
var index = parseInt(event.target.dataset.index);
var hrefLink = boardLinks[index].innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, index);
}
function checkLoad() {
if (loaded >= boardLinks.length-2) {
var userMenu = document.querySelector("ul.isuser");
if (userMenu !== null) {
if (document.getElementById("ngb_subload_switch") === null) {
userMenu.innerHTML += '<li><a id="ngb_subload_switch_buttons" data-status="on" style="margin-right: 15px; cursor: pointer; text-decoration: none;" title="NGB Subload Buttons">NGB-Sl Buttons[aus]</a></li>';
userMenu.innerHTML += '<li><a id="ngb_subload_switch" data-status="on" style="margin-left: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl [aus]</a></li>';
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
}
} else {
var subMenu = document.querySelector("ul.floatcontainer > ul.floatcontainer");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><a id="ngb_subload_switch" class="popupmenu" data-status="on" style="margin-left: 30px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl [aus]</a></li>';
subMenu.innerHTML += '<li><a id="ngb_subload_switch_buttons" class="popmenu" data-status="on" style="margin-right: 15px; cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons [aus]</a></li>';
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
}
}
var displayStr = "inline-block";
if (document.cookie.indexOf("subload_switch_buttons=off") != -1) {
displayStr = "none";
}
var toggleButtonsArray = document.getElementsByClassName("subLoadtoggleForum");
for (var i = 0; i < toggleButtonsArray.length; ++i) {
toggleButtonsArray.addEventListener("click", toggleSubLoad, true);
toggleButtonsArray.style.display = displayStr;
}
hasLoaded = true;
}
}
function loaderChangeStatus(loader) {
loader = loader.target;
if (loader.readyState == 4 && loader.status == 200) {
data = loader.responseText.replace(/\n|\t|\b/g, '');
try {
var threadLinks = data.match(/class="titl.*<\/a>/g);
var threadLastPosts = data.match(/<a .*lastpostdate.*<\/a>/g);
var threadPrefixes = data.replace(/\n|\t|\b|\r/g, '').match(/id="thread_prefix.*\<\/span>/g);
var threadAuthors = data.match(/<a[\s\w\b].* popupctr.*<\/a>/g);
var threadTimes = data.match(/<dd>.*<\/span>/g);
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
loaded++;
return;
}
for (var i = 0; i < threadTimes.length; i++) {
if (threadTimes.match(/"time"/) === null) {
threadTimes.splice(i, 1);
i--;
}
}
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1) {
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+ loader.index +'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
if (threadLinks.length !== 0) {
try {
var threadTitle = "";
var threadUrl = '';
var threadAuthor = '';
var threadAuthorId = 0;
var threadTime = '';
var threadId = "";
var lastThreadPrefix = 0;
var now = new Date();
var offset = 0;
var offsetUser = Math.abs(threadAuthors.length - threadLinks.length);
for (var x = 0; x < 8; x++) {
if (offset + x + offsetUser == threadAuthors.length || offset + x == threadLinks.length || offset + x == threadTimes.length) {
break;
}
threadTitle = threadLinks[x + offset].match(/">.*<\/a>/g)[0];
threadTitle = threadTitle.substring(2, threadTitle.length-4);
threadUrl = threadLastPosts[x + offset].match(/href="threads[\s\wäöüÄÖÜ\\\/\#\?\+\-\_\=\(\)\[\]]*/g)[0];
threadUrl = threadUrl.substr(6, threadUrl.length - 1);
threadAuthor = threadAuthors[x + offset + offsetUser].match(/<strong\>[\s\w\däöüÄÖÜ\-\\\\/_\(\)\[\]].*<\/strong>/g)[0];
threadAuthor = threadAuthor.substring(8,threadAuthor.length-9);
threadAuthorId = threadAuthors[x + offset].match(/members\/[0-9]*\-/g)[0];
threadAuthorId.substring(7, threadAuthorId.length);
threadTime = threadTimes[x + offset].replace(/<dd>|<span class="time">|<\/span>/g, '');
threadId = threadLinks[x + offset].match(/href="threads\/[0-9]*/g)[0];
threadId = threadId.substring(14, threadId.length);
if (threadTime.indexOf("Heute,") === -1 && threadTime.indexOf("Gestern,") === -1) {
var timeDate = threadTime.match(/[0-9].?/g);
var dateObj = new Date();
dateObj.setDate(parseInt(timeDate[0]));
dateObj.setMonth(parseInt(timeDate[1])-1);
dateObj.setFullYear(parseInt("20"+timeDate[2]));
dateObj.setHours(parseInt(timeDate[3]));
dateObj.setMinutes(parseInt(timeDate[4]));
dateObj.setSeconds(0);
dateObj.setMilliseconds(0);
if (dateObj.getTime() < now - ((3600 * 1000) * 24 * 30)) { // 30 - Anzahl der Tage die Themen alt sein duerfen
offset++;
x--;
continue;
}
}
var prefix = "";
if (threadPrefixes !== null) {
for (var i = lastThreadPrefix; i < threadPrefixes.length; ++i) {
if (threadPrefixes.indexOf(threadId) != -1) {
lastThreadPrefix = i;
prefix = threadPrefixes.match(/>[\s\w\b\-\_\(\)\[\]äöüÄÖÜ\:\,\;\#\+\*\&\/]*<\/span>/g)[0].trimRight();
prefix = prefix.substring(1, prefix.length-7);
}
}
}
if (prefix != "") {
htmlData += '<span style="clear: both; float:left;"><i>' + prefix + '</i> <a href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a></span>';
} else {
htmlData += '<a style="clear: left; float: left;" href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a>';
}
htmlData += '<p style="display: block; text-align: right; margin-left: 10%;">[ <a href="https://ngb.to/members/'+threadAuthorId+threadAuthor+'">' + threadAuthor + '</a>, ' + threadTime + ' Uhr ]</p>';
}
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Remove of subload</button></div>';
loaded++;
checkLoad();
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
}
}
} else if (loader.readyState == 4) {
console.log("[ERROR] Loader status: " + loader.responseURL + " : (" + loader.status + ") "+ loader.statusText);
loaded++;
checkLoad();
}
return;
}
function ajaxLoader(url, index) {
var loader = new XMLHttpRequest();
loader.addEventListener('readystatechange', loaderChangeStatus);
loader.parent = boardLinks[index].parentNode.parentNode;
loader.index = index;
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1) {
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
loader.open('GET', 'https://ngb.to/' + url.replace("http:\/\/", "https:\/\/"), true);
loader.send();
return;
}
//-----------------------------------------------------------------------------------------------
boardLinks = document.querySelectorAll('h2.forumtitle');
for (var i = 0; i < boardLinks.length; ++i) {
var forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1 && document.cookie.indexOf("subload_"+ forumId +"=false") == -1) {
document.cookie = "subload_"+ forumId +"=false";
}
}
// Check for existing subload main cookies
if (document.cookie.indexOf("subload_switch=on") == -1 && document.cookie.indexOf("subload_switch=off") == -1) {
document.cookie = "subload_switch=on";
}
if (document.cookie.indexOf("subload_switch_buttons=on") == -1 && document.cookie.indexOf("subload_switch_buttons=off") == -1) {
document.cookie = "subload_switch_buttons=on";
}
if (document.cookie.indexOf("subload_switch=on") != -1) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
} else {
setTimeout(function() {
var userMenu = document.querySelector("ul.isuser");
if (userMenu !== null) {
if (document.getElementById("ngb_subload_switch") === null) {
userMenu.innerHTML += '<li><a id="ngb_subload_switch_buttons" data-status="off" style="margin-right: 15px; cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons [an]</a></li>';
userMenu.innerHTML += '<li><a id="ngb_subload_switch" data-status="off" style="margin-left: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl [an]</a></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
} else {
var subMenu = document.querySelector("ul.floatcontainer > ul.floatcontainer");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><a id="ngb_subload_switch" class="popupmenu" data-status="off" style="margin-left: 30px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl [an]</a></li>';
subMenu.innerHTML += '<li><a id="ngb_subload_switch_buttons" class="popupmenu" data-status="off" style="margin-right: 15px; cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons [an]</a></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
}
}, 450);
}
[/src]
Update 1.2.3 (1.2.4 weiter unten!)
- Important Change: Die Schalter für Subload sind nun nicht mehr im Usermenü, sondern auf einer Höhe mit der Breadcrumb Liste, weil ansonsten die "Popups" für die Menüs nicht mehr funktioniert haben, nachdem die Subload Einträge hinzugefügt worden sind.
- Change: Die Schalter sind nun keine Textlinks mehr, sondern Buttons
- Bugfix "Der Button ein/ausschalter" hatte nicht den korrekten Status beim Neuladen übernommen
[src=javascript]
// ==UserScript==
// @name NGB Subloader
// @namespace ngb_subload
// @description NGB Subloader
// @include https://ngb.to/
// @include https://ngb.to/#*
// @include https://ngb.to/forum*
// @version 1.2.3
// @grant none
// ==/UserScript==
var loaded = 0;
var hasLoaded = false;
var boardLinks;
function toggleVisibility(event) {
var ngbSubloadDivs = document.getElementsByClassName("ngbSubloadDiv");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl [an]";
document.cookie = "subload_switch=off";
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl [aus]";
document.cookie = "subload_switch=on";
}
for (var i = 0; i < ngbSubloadDivs.length; ++i) {
ngbSubloadDivs.style.display = show;
}
if (!hasLoaded) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
}
return false;
}
function toggleButtons(event) {
var ngbSubloadToggles = document.getElementsByClassName("subLoadtoggleForum");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl Buttons [an]";
document.cookie = "subload_switch_buttons=off";
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl Buttons [aus]";
document.cookie = "subload_switch_buttons=on";
}
for (var i = 0; i < ngbSubloadToggles.length; ++i) {
ngbSubloadToggles.style.display = show;
}
return false;
}
function toggleSubLoad(event) {
var forumId = event.target.dataset.name;
if (document.cookie.indexOf("subload_"+ forumId +"=true") != -1) {
document.cookie = "subload_"+forumId+"=false";
} else {
document.cookie = "subload_"+forumId+"=true";
}
var oldData = document.querySelector("div.ngbSubloadDiv."+forumId);
oldData.parentNode.removeChild(oldData);
loaded--;
boardLinks = document.querySelectorAll('h2.forumtitle');
var index = parseInt(event.target.dataset.index);
var hrefLink = boardLinks[index].innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, index);
}
function checkLoad() {
if (loaded >= boardLinks.length-2) {
var subLoadStatus = "off";
var subLoadText = "an";
if (document.cookie.indexOf("subload_switch=on") != -1) {
subLoadStatus = "on";
subLoadText = "aus";
}
var buttonStatus = "off";
var buttonText = "an";
if (document.cookie.indexOf("subload_switch_buttons=on") != -1) {
buttonStatus = "on";
buttonText = "aus";
}
var subMenu = document.querySelector("div.breadcrumb > ul");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><div style="float: right;"> \
<button id="ngb_subload_switch" data-status="'+ subLoadStatus +'" style="margin-right: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl ['+ subLoadText +']</button> \
<button id="ngb_subload_switch_buttons" data-status="'+ buttonStatus +'" style="cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons ['+ buttonText +']</button></div></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
var displayStr = "inline-block";
if (document.cookie.indexOf("subload_switch_buttons=off") != -1) {
displayStr = "none";
}
var toggleButtonsArray = document.getElementsByClassName("subLoadtoggleForum");
for (var i = 0; i < toggleButtonsArray.length; ++i) {
toggleButtonsArray.addEventListener("click", toggleSubLoad, true);
toggleButtonsArray.style.display = displayStr;
}
hasLoaded = true;
}
}
function loaderChangeStatus(loader) {
loader = loader.target;
if (loader.readyState == 4 && loader.status == 200) {
data = loader.responseText.replace(/\n|\t|\b/g, '');
try {
var threadLinks = data.match(/class="titl.*<\/a>/g);
var threadLastPosts = data.match(/<a .*lastpostdate.*<\/a>/g);
var threadPrefixes = data.replace(/\n|\t|\b|\r/g, '').match(/id="thread_prefix.*\<\/span>/g);
var threadAuthors = data.match(/<a[\s\w\b].* popupctr.*<\/a>/g);
var threadTimes = data.match(/<dd>.*<\/span>/g);
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
loaded++;
return;
}
for (var i = 0; i < threadTimes.length; i++) {
if (threadTimes.match(/"time"/) === null) {
threadTimes.splice(i, 1);
i--;
}
}
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1) {
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+ loader.index +'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
if (threadLinks.length !== 0) {
try {
var threadTitle = "";
var threadUrl = '';
var threadAuthor = '';
var threadAuthorId = 0;
var threadTime = '';
var threadId = "";
var lastThreadPrefix = 0;
var now = new Date();
var offset = 0;
var offsetUser = Math.abs(threadAuthors.length - threadLinks.length);
for (var x = 0; x < 8; x++) {
if (offset + x + offsetUser == threadAuthors.length || offset + x == threadLinks.length || offset + x == threadTimes.length) {
break;
}
threadTitle = threadLinks[x + offset].match(/">.*<\/a>/g)[0];
threadTitle = threadTitle.substring(2, threadTitle.length-4);
threadUrl = threadLastPosts[x + offset].match(/href="threads[\s\wäöüÄÖÜ\\\/\#\?\+\-\_\=\(\)\[\]]*/g)[0];
threadUrl = threadUrl.substr(6, threadUrl.length - 1);
threadAuthor = threadAuthors[x + offset + offsetUser].match(/<strong\>[\s\w\däöüÄÖÜ\-\\\\/_\(\)\[\]].*<\/strong>/g)[0];
threadAuthor = threadAuthor.substring(8,threadAuthor.length-9);
threadAuthorId = threadAuthors[x + offset].match(/members\/[0-9]*\-/g)[0];
threadAuthorId.substring(7, threadAuthorId.length);
threadTime = threadTimes[x + offset].replace(/<dd>|<span class="time">|<\/span>/g, '');
threadId = threadLinks[x + offset].match(/href="threads\/[0-9]*/g)[0];
threadId = threadId.substring(14, threadId.length);
if (threadTime.indexOf("Heute,") === -1 && threadTime.indexOf("Gestern,") === -1) {
var timeDate = threadTime.match(/[0-9].?/g);
var dateObj = new Date();
dateObj.setDate(parseInt(timeDate[0]));
dateObj.setMonth(parseInt(timeDate[1])-1);
dateObj.setFullYear(parseInt("20"+timeDate[2]));
dateObj.setHours(parseInt(timeDate[3]));
dateObj.setMinutes(parseInt(timeDate[4]));
dateObj.setSeconds(0);
dateObj.setMilliseconds(0);
if (dateObj.getTime() < now - ((3600 * 1000) * 24 * 30)) { // 30 - Anzahl der Tage die Themen alt sein duerfen
offset++;
x--;
continue;
}
}
var prefix = "";
if (threadPrefixes !== null) {
for (var i = lastThreadPrefix; i < threadPrefixes.length; ++i) {
if (threadPrefixes.indexOf(threadId) != -1) {
lastThreadPrefix = i;
prefix = threadPrefixes.match(/>[\s\w\b\-\_\(\)\[\]äöüÄÖÜ\:\,\;\#\+\*\&\/]*<\/span>/g)[0].trimRight();
prefix = prefix.substring(1, prefix.length-7);
}
}
}
if (prefix != "") {
htmlData += '<span style="clear: both; float:left;"><i>' + prefix + '</i> <a href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a></span>';
} else {
htmlData += '<a style="clear: left; float: left;" href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a>';
}
htmlData += '<p style="display: block; text-align: right; margin-left: 10%;">[ <a href="https://ngb.to/members/'+threadAuthorId+threadAuthor+'">' + threadAuthor + '</a>, ' + threadTime + ' Uhr ]</p>';
}
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Remove of subload</button></div>';
loaded++;
checkLoad();
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
}
}
} else if (loader.readyState == 4) {
console.log("[ERROR] Loader status: " + loader.responseURL + " : (" + loader.status + ") "+ loader.statusText);
loaded++;
checkLoad();
}
return;
}
function ajaxLoader(url, index) {
var loader = new XMLHttpRequest();
loader.addEventListener('readystatechange', loaderChangeStatus);
loader.parent = boardLinks[index].parentNode.parentNode;
loader.index = index;
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1) {
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
loader.open('GET', 'https://ngb.to/' + url.replace("http:\/\/", "https:\/\/"), true);
loader.send();
return;
}
//-----------------------------------------------------------------------------------------------
boardLinks = document.querySelectorAll('h2.forumtitle');
for (var i = 0; i < boardLinks.length; ++i) {
var forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1 && document.cookie.indexOf("subload_"+ forumId +"=false") == -1) {
document.cookie = "subload_"+ forumId +"=false";
}
}
// Check for existing subload main cookies
if (document.cookie.indexOf("subload_switch=on") == -1 && document.cookie.indexOf("subload_switch=off") == -1) {
document.cookie = "subload_switch=on";
}
if (document.cookie.indexOf("subload_switch_buttons=on") == -1 && document.cookie.indexOf("subload_switch_buttons=off") == -1) {
document.cookie = "subload_switch_buttons=on";
}
if (document.cookie.indexOf("subload_switch=on") != -1) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
} else {
setTimeout(function() {
var subLoadStatus = "off";
var subLoadText = "an";
if (document.cookie.indexOf("subload_switch=on") != -1) {
subLoadStatus = "on";
subLoadText = "aus";
}
var buttonStatus = "off";
var buttonText = "an";
if (document.cookie.indexOf("subload_switch_buttons=on") != -1) {
buttonStatus = "on";
buttonText = "aus";
}
var subMenu = document.querySelector("div.breadcrumb > ul");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><div style="float: right;"> \
<button id="ngb_subload_switch" data-status="'+ subLoadStatus +'" style="margin-right: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl ['+ subLoadText +']</button> \
<button id="ngb_subload_switch_buttons" data-status="'+ buttonStatus +'" style="cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons ['+ buttonText +']</button></div></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
}, 450);
}
[/src]
Update 1.2.4
- Change: Einstellung über Variable: "useGMinsteadOfCookies" (Standard: true)
.... welche aussagt das wir SQLite über GM_setValue/GM_getValue nutzen, und nicht Cookies, welche gelöscht werden können. Wer Cookies verwenden will, muß Zeile 17 den Wert auf "false" (ohne "") setzen.
[src=javascript]// ==UserScript==
// @name NGB Subloader
// @namespace ngb_subload
// @description NGB Subloader
// @include https://ngb.to/
// @include https://ngb.to/#*
// @include https://ngb.to/forum*
// @version 1.2.4
// @author theSplit
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
// Change either to: true OR false ---- in order to use OR not to use GM_setValue and GM_getValue with SQLite as storage out side the cookies, default: true
var useGMinsteadOfCookies = true;
// Dont change this
var loaded = 0;
var hasLoaded = false;
var boardLinks;
function toggleVisibility(event) {
var ngbSubloadDivs = document.getElementsByClassName("ngbSubloadDiv");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl [an]";
if (useGMinsteadOfCookies) {
GM_setValue("subload_switch", "off");
} else {
document.cookie = "subload_switch=off";
}
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl [aus]";
if (useGMinsteadOfCookies) {
GM_setValue("subload_switch", "on");
} else {
document.cookie = "subload_switch=on";
}
}
for (var i = 0; i < ngbSubloadDivs.length; ++i) {
ngbSubloadDivs.style.display = show;
}
if (!hasLoaded) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
}
return false;
}
function toggleButtons(event) {
var ngbSubloadToggles = document.getElementsByClassName("subLoadtoggleForum");
var show = "inline-block";
if (event.target.dataset.status == "on") {
show = "none";
event.target.dataset.status = "off";
event.target.innerHTML = "NGB-Sl Buttons [an]";
if (useGMinsteadOfCookies) {
GM_setValue("subload_switch_buttons", "off");
} else {
document.cookie = "subload_switch_buttons=off";
}
} else {
event.target.dataset.status = "on";
event.target.innerHTML = "NGB-Sl Buttons [aus]";
if (useGMinsteadOfCookies) {
GM_setValue("subload_switch_buttons", "on");
} else {
document.cookie = "subload_switch_buttons=on";
}
}
for (var i = 0; i < ngbSubloadToggles.length; ++i) {
ngbSubloadToggles.style.display = show;
}
return false;
}
function toggleSubLoad(event) {
var forumId = event.target.dataset.name;
if (useGMinsteadOfCookies) {
if (GM_getValue("subload_"+ forumId) == "true") {
GM_setValue("subload_"+ forumId, "false");
} else {
GM_setValue("subload_"+ forumId, "true");
}
} else {
if (document.cookie.indexOf("subload_"+ forumId +"=true") != -1) {
document.cookie = "subload_"+forumId+"=false";
} else {
document.cookie = "subload_"+forumId+"=true";
}
}
var oldData = document.querySelector("div.ngbSubloadDiv."+forumId);
oldData.parentNode.removeChild(oldData);
loaded--;
boardLinks = document.querySelectorAll('h2.forumtitle');
var index = parseInt(event.target.dataset.index);
var hrefLink = boardLinks[index].innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, index);
}
function checkLoad() {
if (loaded >= boardLinks.length-2) {
var subLoadStatus = "off";
var subLoadText = "an";
var buttonStatus = "off";
var buttonText = "an";
if ((!useGMinsteadOfCookies && document.cookie.indexOf("subload_switch=on") != -1) || (useGMinsteadOfCookies && GM_getValue("subload_switch") == "on")) {
subLoadStatus = "on";
subLoadText = "aus";
}
if ((!useGMinsteadOfCookies && document.cookie.indexOf("subload_switch_buttons=on") != -1) || (useGMinsteadOfCookies && GM_getValue("subload_switch_buttons") == "on")) {
buttonStatus = "on";
buttonText = "aus";
}
var subMenu = document.querySelector("div.breadcrumb > ul");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><div style="float: right;"> \
<button id="ngb_subload_switch" data-status="'+ subLoadStatus +'" style="margin-right: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl ['+ subLoadText +']</button> \
<button id="ngb_subload_switch_buttons" data-status="'+ buttonStatus +'" style="cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons ['+ buttonText +']</button></div></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
var displayStr = "inline-block";
if ((!useGMinsteadOfCookies && document.cookie.indexOf("subload_switch_buttons=off") != -1) || (useGMinsteadOfCookies && GM_getValue("subload_switch_buttons") == "off")) {
displayStr = "none";
}
var toggleButtonsArray = document.getElementsByClassName("subLoadtoggleForum");
for (var i = 0; i < toggleButtonsArray.length; ++i) {
toggleButtonsArray.addEventListener("click", toggleSubLoad, true);
toggleButtonsArray.style.display = displayStr;
}
hasLoaded = true;
}
}
function loaderChangeStatus(loader) {
loader = loader.target;
if (loader.readyState == 4 && loader.status == 200) {
data = loader.responseText.replace(/\n|\t|\b/g, '');
try {
var threadLinks = data.match(/class="titl.*<\/a>/g);
var threadLastPosts = data.match(/<a .*lastpostdate.*<\/a>/g);
var threadPrefixes = data.replace(/\n|\t|\b|\r/g, '').match(/id="thread_prefix.*\<\/span>/g);
var threadAuthors = data.match(/<a[\s\w\b].* popupctr.*<\/a>/g);
var threadTimes = data.match(/<dd>.*<\/span>/g);
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
loaded++;
return;
}
for (var i = 0; i < threadTimes.length; i++) {
if (threadTimes.match(/"time"/) === null) {
threadTimes.splice(i, 1);
i--;
}
}
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
if ((!useGMinsteadOfCookies && document.cookie.indexOf("subload_"+ forumId +"=true") == -1) || (useGMinsteadOfCookies && GM_getValue("subload_"+forumId) == "false")) {
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+ loader.index +'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
if (threadLinks.length !== 0) {
try {
var threadTitle = "";
var threadUrl = '';
var threadAuthor = '';
var threadAuthorId = 0;
var threadTime = '';
var threadId = "";
var lastThreadPrefix = 0;
var now = new Date();
var offset = 0;
var offsetUser = Math.abs(threadAuthors.length - threadLinks.length);
for (var x = 0; x < 8; x++) {
if (offset + x + offsetUser == threadAuthors.length || offset + x == threadLinks.length || offset + x == threadTimes.length) {
break;
}
threadTitle = threadLinks[x + offset].match(/">.*<\/a>/g)[0];
threadTitle = threadTitle.substring(2, threadTitle.length-4);
threadUrl = threadLastPosts[x + offset].match(/href="threads[\s\wäöüÄÖÜ\\\/\#\?\+\-\_\=\(\)\[\]]*/g)[0];
threadUrl = threadUrl.substr(6, threadUrl.length - 1);
threadAuthor = threadAuthors[x + offset + offsetUser].match(/<strong\>[\s\w\däöüÄÖÜ\-\\\\/_\(\)\[\]].*<\/strong>/g)[0];
threadAuthor = threadAuthor.substring(8,threadAuthor.length-9);
threadAuthorId = threadAuthors[x + offset].match(/members\/[0-9]*\-/g)[0];
threadAuthorId.substring(7, threadAuthorId.length);
threadTime = threadTimes[x + offset].replace(/<dd>|<span class="time">|<\/span>/g, '');
threadId = threadLinks[x + offset].match(/href="threads\/[0-9]*/g)[0];
threadId = threadId.substring(14, threadId.length);
if (threadTime.indexOf("Heute,") === -1 && threadTime.indexOf("Gestern,") === -1) {
var timeDate = threadTime.match(/[0-9].?/g);
var dateObj = new Date();
dateObj.setDate(parseInt(timeDate[0]));
dateObj.setMonth(parseInt(timeDate[1])-1);
dateObj.setFullYear(parseInt("20"+timeDate[2]));
dateObj.setHours(parseInt(timeDate[3]));
dateObj.setMinutes(parseInt(timeDate[4]));
dateObj.setSeconds(0);
dateObj.setMilliseconds(0);
if (dateObj.getTime() < now - ((3600 * 1000) * 24 * 30)) { // 30 - Anzahl der Tage die Themen alt sein duerfen
offset++;
x--;
continue;
}
}
var prefix = "";
if (threadPrefixes !== null) {
for (var i = lastThreadPrefix; i < threadPrefixes.length; ++i) {
if (threadPrefixes.indexOf(threadId) != -1) {
lastThreadPrefix = i;
prefix = threadPrefixes.match(/>[\s\w\b\-\_\(\)\[\]äöüÄÖÜ\:\,\;\#\+\*\&\/]*<\/span>/g)[0].trimRight();
prefix = prefix.substring(1, prefix.length-7);
}
}
}
if (prefix != "") {
htmlData += '<span style="clear: both; float:left;"><i>' + prefix + '</i> <a href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a></span>';
} else {
htmlData += '<a style="clear: left; float: left;" href="https://ngb.to/' + threadUrl + '" target="_blank">' + threadTitle + '</a>';
}
htmlData += '<p style="display: block; text-align: right; margin-left: 10%;">[ <a href="https://ngb.to/members/'+threadAuthorId+threadAuthor+'">' + threadAuthor + '</a>, ' + threadTime + ' Uhr ]</p>';
}
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Remove of subload</button></div>';
loaded++;
checkLoad();
} catch (error) {
console.log("[ERROR] Error in script: "+ error + ", lineNumber, "+error.lineNumber+", loader: " + loader.responseURL);
}
}
} else if (loader.readyState == 4) {
console.log("[ERROR] Loader status: " + loader.responseURL + " : (" + loader.status + ") "+ loader.statusText);
loaded++;
checkLoad();
}
return;
}
function ajaxLoader(url, index) {
var loader = new XMLHttpRequest();
loader.addEventListener('readystatechange', loaderChangeStatus);
loader.parent = boardLinks[index].parentNode.parentNode;
loader.index = index;
var forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = loader.parent.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if ((!useGMinsteadOfCookies && document.cookie.indexOf("subload_"+ forumId +"=true") == -1) || (useGMinsteadOfCookies && GM_getValue("subload_"+forumId) == "false")) {
var htmlData = '<div class="ngbSubloadDiv ' + forumId +'" style="clear: both; display: inline-block; width: 100%; margin: 10px 0px 10px 20px;">';
loader.parent.innerHTML += htmlData + '<button class="subLoadtoggleForum" data-name="'+forumId+'" data-index="'+loader.index+'" style="clear:both; float: right; margin-top: 15px;">Add to subload</button></div>';
loaded++;
checkLoad();
return;
}
loader.open('GET', 'https://ngb.to/' + url.replace("http:\/\/", "https:\/\/"), true);
loader.send();
return;
}
boardLinks = document.querySelectorAll('h2.forumtitle');
for (var i = 0; i < boardLinks.length; ++i) {
var forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
if (window.location.pathname.indexOf("/forums/") != -1) {
forumId = boardLinks.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;
}
if (useGMinsteadOfCookies && GM_getValue("subload_"+forumId) != "true" && GM_getValue("subload_"+forumId) != "false") {
GM_setValue("subload_"+forumId, "false");
} else if (document.cookie.indexOf("subload_"+ forumId +"=true") == -1 && document.cookie.indexOf("subload_"+ forumId +"=false") == -1) {
document.cookie = "subload_"+ forumId +"=false";
}
}
// Check for existing subload main cookies
var subLoadOn = true;
var buttonsOn = true;
if (useGMinsteadOfCookies) {
if (GM_getValue("subload_switch") != "on" && GM_getValue("subload_switch") != "off") {
GM_setValue("subload_switch", "on");
} else if (GM_getValue("subload_switch") != "on") {
subLoadOn = false;
}
if (GM_getValue("subload_switch_buttons") != "on" && GM_getValue("subload_switch_buttons") != "off") {
GM_setValue("subload_switch_buttons", "on");
} else if (GM_getValue("subload_switch_buttons") != "on") {
buttonsOn = false;
}
} else {
if (document.cookie.indexOf("subload_switch=on") == -1 && document.cookie.indexOf("subload_switch=off") == -1) {
document.cookie = "subload_switch=on";
} else if (document.cookie.indexOf("subload_switch=on") == -1) {
subLoadOn = false;
}
if (document.cookie.indexOf("subload_switch_buttons=on") == -1 && document.cookie.indexOf("subload_switch_buttons=off") == -1) {
document.cookie = "subload_switch_buttons=on";
} else if (document.cookie.indexOf("subload_switch_buttons=on") == -1) {
buttonsOn = false;
}
}
if (subLoadOn) {
for (var i = 0; i < boardLinks.length; ++i) {
var hrefLink = boardLinks.innerHTML.match(/href=".*"/g) [0];
var url = hrefLink.substring(6, hrefLink.length - 1);
ajaxLoader(url, i);
}
} else {
var subLoadStatus = "off";
var subLoadText = "an";
var buttonStatus = "off";
var buttonText = "an";
if (subLoadOn) {
subLoadStatus = "on";
subLoadText = "aus";
}
if (buttonsOn) {
buttonStatus = "on";
buttonText = "aus";
}
var subMenu = document.querySelector("div.breadcrumb > ul");
if (document.getElementById("ngb_subload_switch") === null) {
subMenu.innerHTML += '<li><div style="float: right;"> \
<button id="ngb_subload_switch" data-status="'+ subLoadStatus +'" style="margin-right: 10px; cursor: pointer; text-decoration: none;" title="NGB Subload umschalten">NGB-Sl ['+ subLoadText +']</button> \
<button id="ngb_subload_switch_buttons" data-status="'+ buttonStatus +'" style="cursor: pointer; text-decoration: none;" title="NGB Subload Buttons umschalten">NGB-Sl Buttons ['+ buttonText +']</button></div></li>';
document.getElementById("ngb_subload_switch").addEventListener("click", toggleVisibility, true);
document.getElementById("ngb_subload_switch_buttons").addEventListener("click", toggleButtons, true);
}
}
[/src]