// ==UserScript== // @name nightly.link buttons // @namespace blankie-scripts // @match http*://github.com/* // @grant none // @version 1.1 // @author blankie // @run-at document-end // @description Show buttons to nightly.link on artifacts and build logs // ==/UserScript== const INSTANCE_URL = "https://nightly.link"; function addArtifactsButton(artifactsDiv) { if (artifactsDiv === null) { return false; } let artifactsButton = document.createElement("a"); artifactsButton.className = "btn"; // https://stackoverflow.com/a/17228764 artifactsButton.style.float = "right"; artifactsButton.innerText = "View on nightly.link"; artifactsButton.href = INSTANCE_URL + location.pathname; artifactsDiv.prepend(artifactsButton); return true; } function addLogsButton(githubLogsButton, logsHeader) { if (githubLogsButton !== null) { let nightlyLogsButton = document.createElement("a"); nightlyLogsButton.className = "pl-5 dropdown-item btn-link"; nightlyLogsButton.innerText = "View logs on nightly.link"; nightlyLogsButton.href = INSTANCE_URL + location.pathname + ".txt"; githubLogsButton.parentNode.append(nightlyLogsButton); return true; } else if (logsHeader !== null) { let logsLink = document.createElement("a"); logsLink.innerText = "View on nightly.link"; logsLink.href = INSTANCE_URL + location.pathname + ".txt"; logsHeader.append(logsLink); return true; } return false; } function handleNewPage() { let artifactsDiv = document.body.querySelector("div#artifacts div.mx-0.mx-md-1"); let githubLogsButton = document.body.querySelector("a.js-steps-dropdown-raw-logs"); let logsHeader = document.body.querySelector("div.js-checks-log-toolbar"); addArtifactsButton(artifactsDiv) || addLogsButton(githubLogsButton, logsHeader); }; handleNewPage(); function observerCallback(mutationList, observer) { for (mutation of mutationList) { if (mutation.type !== "childList") { continue; } for (node of mutation.addedNodes) { if (node.nodeName === "BODY") { handleNewPage(); return; } } } } let observer = new MutationObserver(observerCallback); observer.observe(document.body.parentNode, {childList: true});