forked from Ag/disspam
1
0
Fork 0
disspam/disstuff.js

208 lines
5.7 KiB
JavaScript

var update = async function ()
{
filterstatus.textContent = "Working...";
var response = await fetch("badusers.json");
var json = await response.json();
var badUsers = {};
for (var t of json)
{
badUsers[t] = true;
}
var response = await fetch("repos.json");
var json = await response.json();
console.log(json.length);
main.innerHTML = "";
var filterFn = null;
if (filter.value.trim())
{
filterFn = Function("with (arguments[1]) return eval(arguments[0]);").bind(null, filter.value);
}
var table = document.createElement("table");
table.setAttribute("border", "");
var thead = document.createElement("thead");
thead.innerHTML = `
<th>rowid</th>
<th>owner</th>
<th>name</th>
<th>desc</th>
<th>stars</th>
<th>forks</th>
<th>lang</th>
`;
table.appendChild(thead);
var tbody = document.createElement("tbody");
table.appendChild(tbody);
var numFilteredOut = 0;
for (var t of json)
{
if (filterFn)
{
try
{
if (!filterFn(t))
{
numFilteredOut++;
continue;
}
}
catch (e)
{
// want to catch syntax errors
alert(e);
break;
}
}
var tr = document.createElement("tr");
tr.setAttribute("class", "table-row");
if (t["flag"])
tr.setAttribute("data-flag", t["flag"]);
tr.setAttribute("data-rowid", t["rowid"]);
var tdRowid = document.createElement("td");
tdRowid.textContent = t["rowid"];
tdRowid.setAttribute("align", "right");
tr.appendChild(tdRowid);
var tdOwner = document.createElement("td");
if (badUsers[t["owner"]])
tdOwner.dataset.badUser = true;
var ownerLink = document.createElement("a");
ownerLink.className = "owner-link";
ownerLink.textContent = t["owner"];
ownerLink.href = `https://git.disroot.org/${t["owner"]}`;
ownerLink.target = "_blank";
tdOwner.appendChild(ownerLink);
tr.appendChild(tdOwner);
var tdName = document.createElement("td");
var repoLink = document.createElement("a");
repoLink.className = "repo-link";
repoLink.textContent = t["name"];
repoLink.href = `https://git.disroot.org/${t["owner"]}/${t["name"]}`;
repoLink.target = "_blank";
tdName.appendChild(repoLink);
tr.appendChild(tdName);
var tdDesc = document.createElement("td");
//~ tdDesc.textContent = t["desc"];
tdDesc.innerHTML = t["desc"];
tr.appendChild(tdDesc);
var tdStars = document.createElement("td");
tdStars.textContent = t["stars"];
tdStars.setAttribute("align", "right");
tr.appendChild(tdStars);
var tdForks = document.createElement("td");
tdForks.textContent = t["forks"];
tdForks.setAttribute("align", "right");
tr.appendChild(tdForks);
var tdLang = document.createElement("td");
tdLang.textContent = t["lang"];
tr.appendChild(tdLang);
tbody.appendChild(tr);
}
tbody.children[0].dataset.activeRow = true;
main.appendChild(table);
filterstatus.textContent = `Showing ${json.length-numFilteredOut} of ${json.length} results (${numFilteredOut} filtered out)`;
};
update();
var setFlag = async function (flag)
{
var ar = document.querySelector("[data-active-row]");
rowid = ar.dataset.rowid;
try
{
var response = await fetch("/flag", {
method: "POST",
body: `rowid=${encodeURIComponent(rowid)}&flag=${encodeURIComponent(flag)}`,
headers: {"Content-Type": "application/x-www-form-urlencoded"},
});
if (response.status !== 200)
throw new Error(`Request failed with status ${response.status}`);
ar.dataset.flag = flag;
}
catch (e)
{
alert(e);
}
};
document.onkeydown = function (event)
{
//~ console.log(event);
if (event.ctrlKey || event.altKey || event.shiftKey)
return;
if (event.srcElement.matches("input"))
return;
var dir = 1;
var nextOrPrev = null;
switch (event.key)
{
case "ArrowDown":
nextOrPrev = "nextElementSibling";
case "ArrowUp":
if (!nextOrPrev)
nextOrPrev = "previousElementSibling";
var ar = document.querySelector("[data-active-row]");
if (ar && ar[nextOrPrev])
{
ar[nextOrPrev].dataset.activeRow = true;
delete ar.dataset.activeRow;
event.preventDefault();
ar.scrollIntoView({block: "center"});
}
break;
case "a":
setFlag("spam");
break;
case "s":
setFlag("");
break;
case "d":
setFlag("notSpam");
break;
case "w":
var ar = document.querySelector("[data-active-row]");
if (ar)
ar.querySelector(".owner-link").click();
break;
case "e":
var ar = document.querySelector("[data-active-row]");
if (ar)
ar.querySelector(".repo-link").click();
break;
default:
return;
}
};
document.onclick = function (event)
{
if (event.target.matches("tr, tr *"))
{
var newAr = event.target.closest("tr");
var ar = document.querySelector("[data-active-row]");
if (ar)
delete ar.dataset.activeRow;
newAr.dataset.activeRow = true;
}
};