uwuifyer

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

Stan na 18-08-2026. Zobacz najnowsza wersja.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==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);
})();