function PleromaModFavicon () { this.instances = {}; this.config = { favicon: "favicon.png", fallback: "favicon.ico" }; this.loadConfig(); } [ function loadConfig () { window.fetch(PleromaModLoader.getModDir() + "pleroma-mod-favicon/config.json").then((response) => { if (response.ok) { response.json().then((json) => { // TODO (puniko): do config stuff }).catch((error) => { console.error("can't parse favicon config"); console.error(error); }); } }).catch((error) => { console.error("can't load favicon config"); console.error(error); }); }, function onMutation (mutation, observer) { this.addFavicon(); }, function onReady () { this.addFavicon(); }, function run () { PleromaModLoader.includeModCss("pleroma-mod-favicon/style.css"); }, function addFavicon () { const statusHeadingRights = document.querySelectorAll(".status>.status-body"); for (let statusHeadingRight of statusHeadingRights) { this.addFaviconByStatus(statusHeadingRight); } }, function addFaviconByStatus (statusHeadingRight) { if (statusHeadingRight.querySelector(".instance-favicon")) { return; } const sourceElements = statusHeadingRight.querySelector(".source_url"); let instance = "default"; if (sourceElements) { const urlMatches = sourceElements.href.match(/https?:\/\/[^/]*/); if (urlMatches.length > 0) { instance = urlMatches[0]; } } instance = instance.replace(/^https?:\/\//, ""); const faviconElement = document.createElement("img"); faviconElement.src = PleromaModLoader.getModDir() + "pleroma-mod-favicon/cache/" + instance + ".png"; faviconElement.className = "instance-favicon"; statusHeadingRight.appendChild(faviconElement); } ].forEach((func) => { PleromaModFavicon.prototype[func.name] = func; }); PleromaModLoader.registerMod(PleromaModFavicon);