A small suite of tools to make Lemmy easier.
当前为
// ==UserScript== // @name LemmyTools // @namespace https://thesimplecorner.org/c/lemmytools // @version 0.1.1 // @description A small suite of tools to make Lemmy easier. // @author [email protected] // @match https://*/* // ==/UserScript== /* SCRIPT BELOW */ const homeString = ` // -------------- VERSION ------------------- const ltVer = "0.1.1"; const ltTestedVer = "BE: 0.18.0"; var homeInstance = ''; var comm = ''; `; //-------------------------------------------- const funcsString = ` function isltMobile(){ if (/Android|iPhone/i.test(navigator.userAgent)) { console.log("LemmyTools: " + "is mobile!"); return true; } else { console.log("LemmyTools: " + "is desktop!"); return false; } } function update(comm, page, subString, hI) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { console.log("LemmyTools: " + "update()" + subString); document.querySelectorAll('[role="alert"]').forEach(function(el) { el.innerHTML += "<br /><br /><a href=" + subString + " target='_blank'><button class='ltbutton'>Easy Subscribe</button></a>"; }); /* let commPageArray = []; let remoteLinks = []; if (url.includes("/communities")) { document.querySelectorAll('[class="overflow-wrap-anywhere"]').forEach(function(el) { commPageArray.push(el.innerText); }); if (commPageArray.count > 1) { console.log("LemmyTools: " + "setting remoteComms to localstore"); localStorage.setItem("remoteComms", commPageArray); site = site.replace("/communities", ""); for (const comm of commPageArray) { //subString = hI + "/search/?q=!" + comm + "@" + site + "&type=All&listingType=Communities&page=1&sort=TopAll"; remoteLinks.push(subString); //div.innerHTML += comm + "<br /><a href=" + subString + " target='_blank'><button class='ltbutton'>Easy Subscribe</button></a><hr />"; } console.log("LemmyTools: " + "setting remoteLinks to localstore"); localStorage.setItem("remoteLinks", remoteLinks); } } */ } } xhttp.open("GET", page, true); xhttp.send(page); } function commupdate(id, page, data) { console.log("LemmyTools: " + "Comm Update"); var count = -1; var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { console.log("LemmyTools: " + "updating " + id + " commsearch with: " + data); data.forEach(_ => count++); id.innerHTML = ""; id.innerHTML += "Results: " + count + "<hr />"; id.innerHTML += data; } } xhttp.open("GET", page, true); xhttp.send(page); } function Toggle(overide) { let settings = options(); var s = document.getElementById("searchdiv"); var size = s.getBoundingClientRect(); var x = document.getElementById("myDiv"); var b = document.getElementById("toggle"); //on remote instance just hide the bar. if (overide == 0) { console.log("LemmyTools: " + "overiding bar to hide."); x.style.display = "none"; } if (x.style.display === "none") { x.style.display = "block"; b.innerHTML = "<<"; s.style[settings.positionSide] = "0%"; } else { x.style.display = "none"; b.innerHTML = ">>"; if (size.width > 261){ s.style[settings.positionSide] = "-7.33%"; } else{ s.style[settings.positionSide] = "-200px"; } } } function searchComms(id, full, commsdiv) { var url = window.location.href; var query = id.value.toLowerCase(); if (query == "") { var commsCount = localStorage.getItem("commsCount"); if (commsCount == null) { commsdiv.innerHTML = "<hr /><b>Welcome to LemmyTools! Ver " + ltVer + "</b><br /><br />If this is your first time running the script, set your lemmy homeinstance in the option page. <br /><br /> If you dont see your subscribed communities here simply login to your lemmy and then click the LemmyTools home button above. "; } else { commsdiv.innerHTML = "Communities: " + commsCount + "<hr />"; commsdiv.innerHTML += full; } } else { commsdiv.innerHTML = full; console.log("LemmyTools: " + "Searching for:" + query) var children = commsdiv.getElementsByTagName("li"); // any tag could be used here.. console.log("LemmyTools: " + "Children found: " + children.length); let data = [""]; var found; for (var i = 0; i < children.length; i++) { if (children[i].innerHTML.toLowerCase().indexOf(query) !== -1) { found = children[i].innerHTML + "<hr />"; console.log("LemmyTools: " + "Found " + query + " in " + found); data.push(found); } } let dup = [...new Set(data)]; data = dup; data.sort(); commupdate(commsdiv, url, data); } } function options(open){ var odiv = document.getElementById("ltOptions"); console.log("LemmyTools: " + "Options Functions"); if (open == 1) { odiv.style.display = "block"; } else if (open == 2){ //First run set defaults or pull from localstorage. commposSide = localStorage.getItem("option_commposSide"); reverseSide = localStorage.getItem("option_reverseSide"); var instance = localStorage.getItem("option_homeInstance"); commposVertical = localStorage.getItem("option_commposVertical"); if (localStorage.getItem('option_commposSide') == null) { console.log("LemmyTools: First Run Defaults"); commposSide = "right"; reverseSide = "left"; } if (localStorage.getItem('option_reverseSide') == null) { reverseSide = "left"; } if (localStorage.getItem('option_homeInstance') == null) { instance = 'https://thesimplecorner.org'; //alert('LemmyTools has defaulted to this lemmy instance. You can change this setting by clicking the options button on the sidebar.'); } if (localStorage.getItem('option_commposVertical') == null) { commposVertical = "0"; } localStorage.setItem("option_commposSide", commposSide); localStorage.setItem("option_reverseSide", reverseSide); localStorage.setItem("option_homeInstance", instance); localStorage.setItem("option_commposVertical", commposVertical); } else if (open == 3) { //save button odiv.style.display = "none"; var commposSide = document.getElementsByName("option_commposSide")[0]; var value = commposSide.options[commposSide.selectedIndex].value; commposSide = value; theHomeinstance = document.getElementsByName("option_homeInstance")[0]; value = theHomeinstance.value; theHomeinstance = value; var commposVertical = document.getElementsByName("option_commposVertical")[0]; value = commposVertical.value; commposVertical = value; if (commposVertical > 85) { commposVertical = 85; } else if (commposVertical <= -1) { commposVertical = 0; } var reverseSide = ""; if (commposSide == "left") { reverseSide = "right"; } else { reverseSide = "left"; } localStorage.setItem("option_commposSide", commposSide); localStorage.setItem("option_reverseSide", reverseSide); localStorage.setItem("option_homeInstance", theHomeinstance); localStorage.setItem("option_commposVertical", commposVertical); location.reload(true); } commposSide = localStorage.getItem("option_commposSide"); reverseSide = localStorage.getItem("option_reverseSide"); instance = localStorage.getItem("option_homeInstance"); commposVertical = localStorage.getItem("option_commposVertical"); const userOptions = {theInstance: instance, positionSide: commposSide, reverseSide: reverseSide, positionVertical: commposVertical}; return userOptions; } `; /*--- */ const mainString = ` // LemmyTools //check if first run or load saved settings let settings = options("2"); /* Script */ var url = window.location.href; var currentPage = url; var broken = url.split('/c/'); var site = broken[0]; site = site.replace('https://', ''); var community = broken[1]; var subString = settings.theInstance + "/search?q=!" + community + "@" + site + "&type=All&listingType=All&page=1&sort=TopAll"; var count = 0; if (isltMobile()) { Toggle(0); } //Easier Subscribe Buttons --------------------------- //Browsing remote instance setInterval(function() { url = window.location.href; if (currentPage != location.href) { broken = url.split('/c/'); site = broken[0]; site = site.replace('https://', ''); community = broken[1]; //subString = settings.theInstance + "/search/?q=!" + community + "@" + site + "&type=All&listingType=Communities&page=1&sort=TopAll"; // page has changed, set new page as 'current' console.log("LemmyTools: " + "Easy Sub Running..."); if (document.querySelector('meta[name="Description"]').content.includes("Lemmy")) { console.log("LemmyTools: " + "On remote lemmy"); if ((url.includes(settings.theInstance) == false) && ((url.includes("/c/") || url.includes("/post/") || url.includes("/comment/") || url.includes("/communities")))) { console.log("LemmyTools: " + "On remote instance community" + "Button to: " + subString); update(community, url, subString, settings.theInstance); } } } currentPage = location.href; }, 500); // Direct to community if (document.querySelector('meta[name="Description"]').content.includes("Lemmy")) { console.log("LemmyTools: " + "On lemmy"); if ((url.includes(settings.theInstance) == false) && ((url.includes("/c/") || url.includes("/post/") || url.includes("/comment/") || url.includes("/communities")))) { console.log("LemmyTools: " + "On remote instance community - DIRECT -" + "Button to: " + subString); update(community, url, subString, settings.theInstance); } } //Better Subscription List -------------------------- //Option Divs var odiv = document.createElement("div"); odiv.setAttribute("id", "ltOptions"); odiv.classList.add("ltoptions", "border-secondary", "card"); odiv.innerHTML = "<h4>LemmyTools " + ltVer + "</h4></hr>" + "<div class='table-responsive'><table class='table table-sm table-hover'>" + "<thead class='pointer'>" + "<tr><th>Option:</th>" + "<th>Value:</th>" + "</thead></tr>" + "<tbody>" + "<tr><td>HomeInstance URL (Ex: https://yourinstance.lemmy)</td><td><textarea name='option_homeInstance'>" + settings.theInstance + "</textarea></td></tr>" + "<tr><td>Community Bar Side - default: right</td><td><select name='option_commposSide'><option value='" + settings.positionSide + "'>" + settings.positionSide + "</option><option value='right'>right</option><option value='left'>left</option></select></td></tr>" + "<tr><td>Community Bar Side Vertical Position (% from top [0-85]) - default: 0</td><td><textarea name='option_commposVertical'>" + settings.positionVertical + "</textarea></td></tr>" + "<tr><td><button id='LTsaveoptions' onclick='options(3)'>Save</button></td></tr></tbody></table></div>" + "<p> Tested on Lemmy Version: " + ltTestedVer + "<br /><h5>LemmyTools Links</h5><hr /><a href='https://thesimplecorner.org/c/lemmytools'>[email protected]</a><br />Get it here: <a href='https://github.com/howdy-tsc/LemmyTools'>Github</a> or <a href='https://greasyfork.org/en/scripts/469169-lemmytools'>GreasyFork</a><br /><br /> Please submit issues to the github for feature requests and problems: <a href='https://github.com/howdy-tsc/LemmyTools/issues'>Github LemmyTools Issues</a><br /></p>"; document.body.appendChild(odiv); var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; height = (height/100 * 1); //Comm divs var idiv = document.createElement("div"); idiv.setAttribute("id", "searchdiv"); idiv.classList.add("ltmenu", "border-secondary", "card"); idiv.innerHTML = "<span style='float:" + settings.reverseSide + ";'><button class='ltbutton' id='toggle' onClick='Toggle()'" + "/> << </button></span><input type='text' id='commsearch' placeholder='Sub search' oninput='searchComms(commsearch, communityArray, div)' /><br />LemmyTools - <a href='#' id='LToptions' onclick='options(" + 1 + ")'>Options</a><br /><b><a href=" + homeInstance + ">Home</a> - <a href='https://lemmyverse.net/communities' target='_new'>Find Comms</a></b></span>"; var div = document.createElement("div"); div.setAttribute("id", "myDiv"); div.classList.add("ltcommsbar"); // One liner function: const addCSS = css => document.head.appendChild(document.createElement("style")).innerHTML = css; // Usage: addCSS(".ltmenu {position: fixed; min-width: 240px; width: 8%; top: " + settings.positionVertical +"%;" + settings.positionSide + ": 0; font-size: .75em; display: block; height:" + (100 - settings.positionVertical) + "%; z-index:999;}" + ".ltcommsbar { word-wrap: break-word; overflow:scroll; height:100%;}" + ".ltbutton {background-color: #ccffe5;}" + ".ltoptions {position: fixed; min-width: 500px; min-height: 500px; width: 60%; height: 45%; top: 10%; display:none; left: 20%; z-index:1000; padding:0.5%;}"); if (document.querySelector('meta[name="Description"]').content.includes("Lemmy")) { url = location.href; console.log("LemmyTools: " + "url is " + url) // ----------------------------------------------- //Add divs to page; document.body.appendChild(idiv); idiv.appendChild(div); } var commsearch = document.getElementById("commsearch"); // ----------------------------------------------- let communityArray = new Array(); if (url.includes(settings.theInstance)) { console.log("LemmyTools: " + "home instance do bar"); document.querySelectorAll('[class="list-inline-item d-inline-block"]').forEach(function(el) { communityArray.push("<li>" + el.innerHTML + "</li>"); }); let dup = [...new Set(communityArray)]; communityArray = dup; if ((count == 0) || (count == null)) { count = 0; communityArray.forEach(_ => count++); } div.innerHTML += communityArray; if (div.innerHTML.length >= 20) { //make use of it: console.log("LemmyTools: Got Results >20"); console.log("LemmyTools: " + "setting localcomms localstore"); localStorage.setItem("localComms", communityArray); localStorage.setItem("commsCount", count); //force update the page searchComms(commsearch, communityArray, div); } else { console.log("LemmyTools: " + "get localcomms from localstore"); communityArray = localStorage.getItem("localComms"); div.innerHTML += communityArray; //force update the page searchComms(commsearch, communityArray, div); } } else { console.log("LemmyTools: On Remote Instance - Bar"); //div.innerHTML = localStorage.getItem("remoteComms"); Toggle(0); } `; //Pragmatic const LTHome = document.head.appendChild(document.createElement("script")).innerHTML = homeString; const LTFuncs = document.head.appendChild(document.createElement("script")).innerHTML = funcsString; const LTMain = document.body.appendChild(document.createElement("script")).innerHTML = mainString;