☰

uwuifyer

Detects and converts ONLY what you type into uwu style across all Discord locations.

Version vom 18.08.2026. Aktuellste Version

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Violentmonkey installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Violentmonkey installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Userscripts installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey installieren.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

(Ich habe bereits einen Benutzerstil Verwaltung, ich möchte ihn installieren!)

// ==UserScript==
// @name         uwuifyer
// @namespace    http://tampermonkey.net
// @version      0.8
// @description  Detects and converts ONLY what you type into uwu style across all Discord locations.
// @author       You
// @license      MIT
// @match        *://*://*
// @match        *://://discord.com*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // Function to convert regular text to uwu style
    function uwuify(text) {
        return text
            .replace(/[lr]/g, 'w')
            .replace(/[LR]/g, 'W')
            .replace(/n([aeiou])/g, 'ny$1')
            .replace(/N([aeiou])/g, 'Ny$1')
            .replace(/N([AEIOU])/g, 'NY$1')
            .replace(/ove/g, 'uv');
    }

    // Force Discord's text engine to accept the changes
    function dispatchTextChange(target, newText) {
        // Find Discord's secret react/slate interface handler
        const slateKey = Object.keys(target).find(key => key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$'));
        if (!slateKey) return false;

        try {
            // Drill down into Discord's internal state machine
            let node = target[slateKey];
            while (node) {
                if (node.memoizedProps && node.memoizedProps.editor) {
                    const editor = node.memoizedProps.editor;
                    
                    // Wipe out old text, insert the uwuified text cleanly
                    editor.selectAll();
                    editor.insertText(newText);
                    return true;
                }
                node = node.return;
            }
        } catch (e) {
            console.error("Failed to sync text with Discord:", e);
        }
        return false;
    }

    function handleDetection(event) {
        const target = event.target;
        if (!target) return;

        // Handle standard Discord inputs/search boxes
        if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
            const original = target.value;
            const converted = uwuify(original);
            if (original !== converted) {
                const start = target.selectionStart;
                const end = target.selectionEnd;
                target.value = converted;
                target.setSelectionRange(start, end);
                target.dispatchEvent(new Event('input', { bubbles: true }));
            }
            return;
        }

        // Handle Discord's main chat boxes
        if (target.getAttribute('contenteditable') === 'true') {
            if (target.dataset.isUwUing) return;
            target.dataset.isUwUing = 'true';

            const original = target.innerText || "";
            const converted = uwuify(original);

            if (original !== converted && converted.trim() !== "") {
                // Pass text directly to Discord's background processes
                dispatchTextChange(target, converted);
            }

            delete target.dataset.isUwUing;
        }
    }

    // Bind execution to user input routines
    document.addEventListener('input', handleDetection, true);
})();