Tampermonkey/Greasemonkey script to redirect to your local instance

For those that use Tampermonkey or GreaseMonkey, here's a quick script I whipped up that creates a button that redirects communities from other instances to your local instance. If your instance isn't lemmy.world, then change the localLemmy var at the top. Enjoy!

// ==UserScript==
// @name         Lemmings Fix
// @version      1.0
// @description  Redirect to your local Lemmy instance
// @author       @lemmy.world/u/soy
// @match        https://*/c/*
// @icon         https://join-lemmy.org/static/assets/icons/favicon.svg
// @grant        GM_addStyle
// ==/UserScript==

const localLemmy = 'lemmy.world';
var isLemmy = document.head.querySelector("[name~=Description][content]").content === 'Lemmy';

if (isLemmy) {
    // Get URL info
    var splitUrl = location.href.split('/');
    var instanceUrl = splitUrl[2];
    var community = splitUrl[4];
    var localizedUrl = 'https://' + localLemmy + '/c/' + community + '@' + instanceUrl;

    // Create redirect button if not on local
    if (instanceUrl !== localLemmy) {
        var zNode = document.createElement ('div');
        zNode.innerHTML = '<button id="localize" type="button">Open in local instance</button>';
        zNode.setAttribute('id', 'localizeContainer');
        document.body.appendChild(zNode);
        document.getElementById ("localize").addEventListener (
            "click", onLocalize
        );
    }
}

function onLocalize (zEvent) {
    window.location.replace(localizedUrl);
}

GM_addStyle ( `
    #localizeContainer {
        position: fixed;
        right: 0px;
        bottom: 0px;
    }
    #localize {
        cursor: pointer;
        padding: 16px;
    }
` );

35 points · 14 comments · view on lemmy.world

14 Comments

Zeus@lemmy.world · 8 pts · 3y

nice, we had the same idea within about 10 minutes...

edit: uh, it seems to have gone; so i've tried reposting it

Kris@lemmy.world · 6 pts · 3y

I wish lemmy instances had an indicator for if that instance is lemmy instead of using the url.

god@sh.itjust.works · 5 pts · 3y (6 replies)

Henlo buddy, your script didn't work for me, so I fixed it. Works for me now. I also changed lemmy.world to sh.itjust.works so beware.

Here's my final one:

// ==UserScript==
// @name         Lemmings Fix
// @version      1.0
// @description  Redirect to your local Lemmy instance
// @author       @lemmy.world/u/soy
// @match        https://*/c/*
// @icon         https://join-lemmy.org/static/assets/icons/favicon.svg
// ==/UserScript==

const localLemmy = "sh.itjust.works";
var isLemmy =
  document.head.querySelector("[name~=Description][content]").content ===
  "Lemmy";

if (isLemmy) {
  // Get URL info
  var splitUrl = location.href.split("/");
  var instanceUrl = splitUrl[2];
  var community = splitUrl[4];
  var localizedUrl =
    "https://" + localLemmy + "/c/" + community + "@" + instanceUrl;

  // Create redirect button if not on local
  if (instanceUrl !== localLemmy) {
    var zNode = document.createElement("div");
    zNode.innerHTML = "Open in local instance";
    zNode.setAttribute("id", "localizeContainer");
    // add styles to the button embedded
    zNode.setAttribute(
      "style",
      "cursor: pointer; padding: 16px; background-color: red; border-radius: 10%; border-width: 3px; border-style: solid; padding: 3px; z-index: 10;max-width:200px;position:fixed;top:0;right:0;"
    );
    zNode.addEventListener("click", onLocalize);
    document.body.appendChild(zNode);
  }
}

function onLocalize() {
  window.location.replace(localizedUrl);
}
TCGM@lemmy.world · 3 pts · 3y (4 replies)

https://greasyfork.org/en/scripts/468521-lemmings-fix

Threw yours up on greasyfork so people can easily install it, just poke me if you'd like me to take it down so you can put your own up

god@sh.itjust.works · 3 pts · 3y (2 replies)

if you're willing could you tell me how to upload a script there?

TCGM@lemmy.world · 2 pts · 3y (1 reply)

First you need to sign in or up here:

https://greasyfork.org/en/users/sign_in

Then you need to visit this page and fill out the form, including with the script

https://greasyfork.org/en/script_versions/new

god@sh.itjust.works · 2 pts · 3y

ty, i'll add a reminder to check this out 2moro when i'm more awake

god@sh.itjust.works · 2 pts · 3y

i tried to upload it to tampermonkey and failed lol. if i knew how i'd do it. i'm always making userscripts and it'd be good to have them all somewhere.

dopwop@lemmy.world · 2 pts · 3y
[ removed ]
TRBoom@lemmy.world · 2 pts · 3y

Excellent work!

ambystoma@feddit.de · 2 pts · 3y
[ removed ]
lodion@aussie.zone · 2 pts · 3y (1 reply)

Giving this a test now... where does the button show up? I haven't spotted it

lodion@aussie.zone · 5 pts · 3y

Ah nevermind, botton right of the browser window :)

TCGM@lemmy.world · 1 pts · 3y

If someone wouldn't mind throwing this up on, say, userforks or similar, that would be great.

god@lemmy.world · 1 pts · 3y
[ removed ]
god@sh.itjust.works · 1 pts · 3y

i made a new userscript for submitting forms with Ctrl + Enter. Is that something you'd find useful?

// ==UserScript==
// @name         Lemmy Form Submit with Ctrl+Enter
// @version      1.0
// @description  Submit forms with Ctrl+Enter in Lemmy instances so you don't have to click the button every time you want to post something.
// @author       God (https://sh.itjust.works/u/god)
// @match        https://*/post/*
// @match        https://*/comment/*
// @icon         https://join-lemmy.org/static/assets/icons/favicon.svg
// ==/UserScript==

var isLemmy =
  document.head.querySelector("[name~=Description][content]").content ===
  "Lemmy";

if (isLemmy) {
  // Define a global variable to keep track of the currently focused textarea.
  var currentFocusedTextarea = null;

  // Function to attach focus and blur event handlers to all textareas.
  function attachEventHandlers() {
    document.querySelectorAll("textarea").forEach((textarea) => {
      if (!textarea.dataset.ctrlEnterHandled) {
        textarea.dataset.ctrlEnterHandled = true;

        // Check if this textarea is currently focused
        const wasFocused = document.activeElement === textarea;

        textarea.addEventListener("focus", function () {
          currentFocusedTextarea = this;
        });

        textarea.addEventListener("blur", function () {
          currentFocusedTextarea = null;
        });

        // If this textarea was focused, blur and re-focus it to ensure event handlers get triggered
        if (wasFocused) {
          textarea.blur();
          textarea.focus();
        }
      }
    });
  }

  // Attach a keydown event handler to the entire document.
  document.addEventListener("keydown", function (event) {
    // If Ctrl + Enter is pressed
    if (event.ctrlKey && event.key === "Enter") {
      // If a textarea is focused and contains text
      if (
        currentFocusedTextarea &&
        currentFocusedTextarea.value.trim() !== ""
      ) {
        // Your submit logic here
        handleSubmit(currentFocusedTextarea);
      }
    }
  });

  function handleSubmit(textarea) {
    // find the closest type="submit" button and press it.
    textarea.closest("form").querySelector('[type="submit"]').click();
  }

  // Call the function initially to cover textareas that exist when the page is first loaded.
  attachEventHandlers();

  // Observe the document for changes and reattach event handlers when new textareas are added.
  const observer = new MutationObserver(function (mutations) {
    mutations.forEach((mutation) => {
      if (mutation.type === "childList") {
        attachEventHandlers();
      }
    });
  });

  observer.observe(document.body, { childList: true, subtree: true });
}