NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name oujs - Issues in profile
// @description Show latest issues in the list of scripts in a profile on openuserjs.org. Fetched from the last 25 issues from https://openuserjs.org/issues
// @namespace cuzi
// @version 2
// @license GPL-3.0
// @include /^https:\/\/openuserjs\.org\/users\/.+\/scripts.*/
// @grant GM_xmlhttpRequest
// @grant GM.xmlHttpRequest
// ==/UserScript==
(function() {
"use strict";
if(typeof GM == "undefined") {
var GM = {};
}
if(! "xmlHttpRequest" in GM) {
GM.xmlHttpRequest = GM_xmlhttpRequest;
}
function nextIssue(ev) {
ev.stopPropagation();
// Cycle through issues. Make next 5 <td> cells visible, hide the rest
var tr = this.parentNode.parentNode.parentNode;
var tdsHidden = tr.querySelectorAll("td.issueVisible ~ td.issueHidden");
var tdsVisible = tr.querySelectorAll("td.issueVisible");
if(tdsHidden.length === 0) {
tdsHidden = tr.querySelectorAll("td.issueHidden");
}
if(tdsHidden.length === 0) {
this.style.color = "#e74c3c";
this.setAttribute("title", "Only one issue available");
return;
}
for(let i = 0; i < 5; i++) {
tdsHidden[i].style.display = 'table-cell';
tdsHidden[i].setAttribute("class","issueVisible");
}
for(let i = 0; i < tdsVisible.length; i++) {
tdsVisible[i].style.display = 'none';
tdsVisible[i].setAttribute("class","issueHidden");
}
}
function showIssues() {
// Find unique URI of all scripts on this profile
var myscripts = {};
document.querySelector("table.table thead tr").innerHTML += '<th></th><th class="text-center">Topic</th><th class="text-center td-fit">Users</th><th class="text-center td-fit">Replies</th><th class="text-center td-fit">Created</th><th class="text-center td-fit">Updated</th>';
var lst = document.querySelectorAll("table.table tbody .tr-link-a");
for(var i = 0; i < lst.length; i++) {
var a = lst[i];
var url = a.href.match(/(\/scripts\/.+\/.+)/);
if(url && url[1]) {
myscripts[url[1]] = { node: a.parentNode.parentNode, issueCounter: 0, naviTd : null};
}
}
// Get last 25 issues
GM.xmlHttpRequest({
url: "https://openuserjs.org/issues",
method: "GET",
onload: function (response) {
var newDoc = document.implementation.createHTMLDocument();
newDoc.documentElement.innerHTML = response.responseText;
var lst = newDoc.querySelectorAll("table.table tbody tr td:nth-child(2) a");
for(var j = 0; j < lst.length; j++) {
var a = lst[j];
var url = a.href.match(/(\/scripts\/.+\/.+)\/issues/);
if(url && url[1] in myscripts) {
var script = url[1];
var i = 0;
if(myscripts[script].issueCounter === 0) {
// Add navigation arrow
var tdn = document.createElement("td");
myscripts[script].naviTd = tdn;
tdn.innerHTML = "▼";
tdn.setAttribute("title", "Next issue");
tdn.addEventListener("click", nextIssue);
myscripts[script].node.appendChild(tdn);
}
// Append table columns from issues to the table
var lst2 = a.parentNode.parentNode.parentNode.querySelectorAll("td");
for(var k = 0; k < lst2.length; k++) {
var td = lst2[k];
if(i++ != 1 && td instanceof Node) {
if(myscripts[script].issueCounter > 0) { // Hide all issues except first one
td.style.display = 'none';
td.setAttribute("class","issueHidden");
} else {
td.setAttribute("class","issueVisible");
}
myscripts[script].node.appendChild(td);
}
}
myscripts[script].issueCounter++;
}
}
// Remove navigation arrow if there's only one issue
for(var att in myscripts) {
var script = myscripts[att];
if(script.issueCounter > 0) {
if(script.issueCounter == 1) {
script.naviTd.innerHTML = script.issueCounter;
tdn.removeEventListener("click", nextIssue);
} else {
script.naviTd.innerHTML += " " + script.issueCounter;
}
}
}
}
});
}
showIssues();
})();