add a helpful userscript
This commit is contained in:
parent
962510a19b
commit
1732d72cf1
1 changed files with 89 additions and 0 deletions
89
Open Fedi In My Instance.user.js
Normal file
89
Open Fedi In My Instance.user.js
Normal file
|
@ -0,0 +1,89 @@
|
|||
// ==UserScript==
|
||||
// @name Open Fedi In My Instance
|
||||
// @namespace http://pix.solarpunk.moe
|
||||
// @version 0.1
|
||||
// @description Open a Pixelfed post on your own instance by clicking the external link icon! For now, this is Pixelfed only.
|
||||
// @author Vivi
|
||||
// @match https://*/*
|
||||
// @icon https://www.google.com/s3/favicons?sz=64&domain=pixelfed.social
|
||||
// @grant GM_xmlhttpRequest
|
||||
// @connect pix.solarpunk.moe
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
const MY_INSTANCE = 'https://pix.solarpunk.moe';
|
||||
|
||||
var MutationObserver = window.MutationObserver;
|
||||
var myObserver = new MutationObserver (mutationHandler);
|
||||
var obsConfig = {
|
||||
childList: true, attributes: true,
|
||||
subtree: true, attributeFilter: ['class']
|
||||
};
|
||||
|
||||
myObserver.observe (document, obsConfig);
|
||||
|
||||
function mutationHandler (mutationRecords) {
|
||||
|
||||
mutationRecords.forEach ( (mutation) => {
|
||||
if (mutation.type == "childList"
|
||||
&& typeof mutation.addedNodes == 'object'
|
||||
&& mutation.addedNodes.length) {
|
||||
for (let node of mutation.addedNodes) {
|
||||
processNode(node);
|
||||
}
|
||||
}
|
||||
else if (mutation.type == 'attributes') {
|
||||
processNode(mutation.target);
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
function processNode (node) {
|
||||
if (node.nodeType !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node.classList.contains('timeline-status-component')) {
|
||||
return;
|
||||
}
|
||||
|
||||
let linkNode = node.querySelector('.timestamp');
|
||||
if (!linkNode) {
|
||||
return;
|
||||
}
|
||||
|
||||
let link = linkNode.href;
|
||||
|
||||
let externalButton = document.createElement('button');
|
||||
|
||||
let icon = document.createElement('i');
|
||||
externalButton.appendChild(icon);
|
||||
icon.classList = 'far fa-external-link';
|
||||
|
||||
externalButton.classList = 'btn btn-dark';
|
||||
externalButton.onclick = () => {
|
||||
icon.classList = 'far fa-spinner fa-pulse';
|
||||
GM_xmlhttpRequest({
|
||||
method: 'GET',
|
||||
url: `${MY_INSTANCE}/api/search?scope=remote&v=2&src=metro&q=${encodeURIComponent(link)}`,
|
||||
responseType: 'json',
|
||||
onerror: (e) => {
|
||||
console.error(e);
|
||||
icon.classList = 'far fa-external-link';
|
||||
},
|
||||
onload: (r) => {
|
||||
window.open(`${MY_INSTANCE}${r.response.posts[0].url}`,'popup','width=365,height=960');
|
||||
icon.classList = 'far fa-external-link';
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// Find the dot menu
|
||||
let dotMenu = node.querySelector('.card-header > .media > .btn-link');
|
||||
dotMenu.before(externalButton);
|
||||
}
|
||||
|
||||
})();
|
Loading…
Reference in a new issue