uwuifyer

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

2026-08-18 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

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

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         uwuifyer
// @namespace    http://tampermonkey.net
// @version      1.0
// @description  Detects and converts ONLY what you type into uwu style across all Discord locations.
// @author       You
// @license      MIT
// @match        https://*://
// @match        https://*://*
// @match        https://*://
// @match        https://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');
    }

    // Intercept keyboard commands right before Discord processes them
    document.addEventListener('keydown', function(event) {
        // Only run when pressing Enter without Shift (which means sending a message)
        if (event.key === 'Enter' && !event.shiftKey) {
            const target = event.target;

            // Confirm the target is the active chat box or an input field
            if (target && (target.getAttribute('contenteditable') === 'true' || target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) {
                
                // 1. Process Discord's Rich Text Editor Chatbox
                if (target.getAttribute('contenteditable') === 'true') {
                    // Pull Discord's hidden framework controller data
                    const reactKey = Object.keys(target).find(key => key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$'));
                    if (!reactKey) return;

                    try {
                        let node = target[reactKey];
                        while (node) {
                            if (node.memoizedProps && node.memoizedProps.editor) {
                                const editor = node.memoizedProps.editor;
                                
                                // Fetch original unsent text buffer
                                const originalText = target.innerText || "";
                                const uwuText = uwuify(originalText);

                                if (originalText !== uwuText) {
                                    // Stop the original 'Enter' from firing on normal text
                                    event.stopImmediatePropagation();
                                    event.preventDefault();

                                    // Replace the internal state data
                                    editor.selectAll();
                                    editor.insertText(uwuText);

                                    // Safely resubmit the updated message event
                                    setTimeout(() => {
                                        const enterEvent = new KeyboardEvent('keydown', {
                                            key: 'Enter',
                                            code: 'Enter',
                                            keyCode: 13,
                                            which: 13,
                                            bubbles: true,
                                            cancelable: true
                                        });
                                        target.dispatchEvent(enterEvent);
                                    }, 10);
                                }
                                break;
                            }
                            node = node.return;
                        }
                    } catch (err) {
                        console.error("State intercept failed:", err);
                    }
                } 
                // 2. Process standard plain-text input boxes (search bars, status bars)
                else if (target.value !== undefined) {
                    const originalText = target.value;
                    const uwuText = uwuify(originalText);
                    if (originalText !== uwuText) {
                        target.value = uwuText;
                        target.dispatchEvent(new Event('input', { bubbles: true }));
                    }
                }
            }
        }
    }, true); // Setting to 'true' intercepts the event before Discord can process it
})();