Greasy Fork is available in English.

Ye Olde Lemmy

A handy toggle for a familiar desktop experience for lemmy. Quickly switch from {instance} to o.opnxng.com/{instance} and back

// ==UserScript==
// @name         Ye Olde Lemmy
// @namespace    https://github.com/appel/userscripts
// @version      0.0.6
// @description  A handy toggle for a familiar desktop experience for lemmy. Quickly switch from {instance} to o.opnxng.com/{instance} and back
// @author       appel
// @match        *://*.lemmy.ml/*
// @match        *://*.lemmy.world/*
// @match        *://*.lemm.ee/*
// @match        *://*.sh.itjust.works/*
// @match        *://*.beehaw.org/*
// @match        *://lemmy.dbzer0.com/*
// @match        *://*.lemmy.zip/*
// @match        *://*.feddit.nl/*
// @match        *://*.lemmy.today/*
// @match        *://*.jlai.lu/*
// @match        *://*.ani.social/*
// @match        *://*.lemy.lol/*
// @match        *://*.discuss.online/*
// @match        *://*.iusearchlinux.fyi/*
// @match        *://*.monero.town/*
// @match        *://o.opnxng.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    "use strict";

    // Check if the script is running in an iframe or not
    if (window.self !== window.top) {
        return; // Return if inside an iframe
    }

    // MutationObserver watches for changes in the document
    let observer = new MutationObserver(function () {
        if (document.querySelector(".toggle-switch")) {
            return;
        }

        const url = window.location.href;
        const domainMatch = url.match(/https?:\/\/([^\/]+)\//);
        const currentDomain = domainMatch ? domainMatch[1] : null;
        let btnColor, btnText, btnTitle, newUrl;

        if (currentDomain && currentDomain.includes('opnxng.com')) {
            const instanceMatch = url.match(/https:\/\/o\.opnxng\.com\/([^\/]+)\/(.*)/);
            const instance = instanceMatch[1];
            const pathAndQuery = instanceMatch[2] || ''; // Get the remaining path if any
            btnColor = "#333";
            btnText = "L";
            btnTitle = "Switch to original Lemmy Instance";
            newUrl = `https://${instance}/${pathAndQuery}`; // Correct the URL construction
        } else if (currentDomain) {
            const pathAndQuery = url.substring(url.indexOf(currentDomain) + currentDomain.length);
            btnColor = "#ff6c60";
            btnText = "O";
            btnTitle = `Switch to Ye Olde Lemmy`;
            newUrl = `https://o.opnxng.com/${currentDomain}${pathAndQuery}`; // Include path and query
        }

        if (!newUrl) {
            return;
        }

        // Create button
        let btn = document.createElement("button");
        btn.classList.add("toggle-switch");
        btn.textContent = btnText;
        btn.title = btnTitle;
        btn.style.position = "fixed";
        btn.style.bottom = "1rem";
        btn.style.right = "1rem";
        btn.style.zIndex = "9999";
        btn.style.backgroundColor = btnColor;
        btn.style.color = "white";
        btn.style.borderRadius = "50%";
        btn.style.width = "24px";
        btn.style.height = "24px";
        btn.style.border = "none";
        btn.style.cursor = "pointer";
        btn.style.fontFamily = "-apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif";
        btn.style.fontSize = "14px";
        btn.style.fontWeight = "700";
        btn.style.textAlign = "center";
        btn.style.padding = "0";
        btn.style.lineHeight = "24px";
        btn.style.transition = "transform .15s ease";

        // Add button to page
        document.body.appendChild(btn);

        btn.addEventListener("click", function (event) {
            // Add "pop" animation
            this.style.transform = "scale(1.2)";
            setTimeout(() => (this.style.transform = "scale(1)"), 150);

            if (event.ctrlKey) {
                // Open in a new tab
                window.open(newUrl, '_blank').focus();
            } else {
                // Navigate in the current tab
                window.location.href = newUrl;
            }
        });
    });

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