obfuscateObsceneLexicon

When entering something in textarea of russian-speaking room, this script replace cyrillic letters in roots of obscene words on similar unicode symbol, correctly displayed on browser and not containing control characters of unicode. Made by 060uDy_qpuJIbTp (https://www.kongregate.com/accounts/060uDy_qpuJIbTp) for russian-speaking room ("Room: Московский Кремль") on Kongregate (www.kongregate.com).

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name     obfuscateObsceneLexicon
// @name:en    obfuscateObsceneLexicon
// @name:ru    замена обсценных слов
// @namespace operationsWithObsceneLexicon
// @description:en When entering something in textarea of russian-speaking room, this script replace cyrillic letters in roots of obscene words on similar unicode symbol, correctly displayed on browser and not containing control characters of unicode. Made by 060uDy_qpuJIbTp (https://www.kongregate.com/accounts/060uDy_qpuJIbTp) for russian-speaking room ("Room: Московский Кремль") on Kongregate (www.kongregate.com).
// @description:ru Этот скрипт при вводе текста в русскоговорящей комнате заменяет буквы в корнях матерных слов на похожие символы юникода, правильно отображаемые в браузере и не содержащие управляющие символы юникода. Сделано 060uDy_qpuJIbTp (https://www.kongregate.com/accounts/060uDy_qpuJIbTp) для русскоговорящей комнаты ("Room: Московский Кремль") на Kongregate (www.kongregate.com).
// @author      060uDy_qpuJIbTp
// @version  1.0.1
// @grant    none
// @include https://www.kongregate.com/*
// @include http://www.kongregate.com/*
// @run-at      document-end
// @description When entering something in textarea of russian-speaking room, this script replace cyrillic letters in roots of obscene words on similar unicode symbol, correctly displayed on browser and not containing control characters of unicode. Made by 060uDy_qpuJIbTp (https://www.kongregate.com/accounts/060uDy_qpuJIbTp) for russian-speaking room ("Room: Московский Кремль") on Kongregate (www.kongregate.com).
// ==/UserScript==


/*
made by 060uDy_qpuJIbTp (https://www.kongregate.com/accounts/060uDy_qpuJIbTp) for russian-speaking room ("Room: Московский Кремль") on www.kongregate.com

https://pastebin.com/uZG3823z

*/

window.addEventListener("load", pageFullyLoaded_);

var Random_ = {
    
    getRandomInt: function(min, max) /* min = 0, max = 999999999999999 || 2147483647*/
    {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
};

function getGlobalRegExp(find){
    return new RegExp(find, 'g');
}

function replaceAll(str_, find, replace) {
    return str_.replace(getGlobalRegExp(find), replace);
}

/*    [original_letter, [letters_for_replace...]] */

/* all: */

var letters = [
    ["А", ["Ӑ", "Ӓ", "Α"]],
    ["Б", ["Ҕ"]],
    ["В", ["ϐ", "Β"]],
    ["Г", ["Ӷ", "Ѓ", "Ґ", "Ғ", "Ӻ", "Γ"]],
    ["Д", ["Ꚉ", "Ꚁ"]],
    ["Е", ["Ҽ", "Ҿ", "Ε"]],
    ["Ж", ["Җ", "Ӂ"]],
    ["З", ["Ҙ", "Ѯ", "Ӟ", "Ӡ", "Ȝ"]],
    ["И", ["Ͷ"]],
    ["Й", ["Ҋ"]],
    ["К", ["Қ", "Ќ", "Ҝ", "Ҟ", "Ҡ", "Κ"]],
    ["Л", ["Ӆ", "Ԓ", "Λ"]],
    ["М", ["Ӎ", "Ϻ", "Μ"]],
    ["Н", ["Ң", "Ҥ", "Ӈ", "Ӊ", "Ԋ", "Η"]],
    ["О", ["Ӧ", "Ο"]],
    ["П", ["Ԥ", "Π"]],
    ["Р", ["Ҏ", "Ρ", "Ⲣ"]],
    ["С", ["Ҫ", "Ҁ", "Ϲ"]],
    ["Т", ["Ҭ", "Ͳ", "Τ", "Ƭ", "Ț"]],
    ["У", ["Ӯ", "Ӱ", "Ӳ"]],
    ["Ф", ["Φ"]],
    ["Х", ["Ҳ", "Ӽ", "Ӿ", "Χ", "᙭", "Ⲭ"]],
    ["Ц", ["Ꚏ"]],
    ["Ч", ["Ҷ", "Ҹ", "Ӌ", "Ӵ"]],
    ["Ш", ["Ⲽ", "Ɯ"]],
    ["Щ", ["Ꚗ"]],
    ["Ъ", []],
    ["Ы", ["Ӹ"]],
    ["Ь", ["Ꙏ"]],
    ["Э", ["Ӭ"]],
    ["Ю", ["ꀒ", "ꆉ"]],
    ["Я", []],
    ["а", ["ӓ", "ӑ", "α", "ɑ"]],
    ["б", ["ҕ"]],
    ["в", ["β"]],
    ["г", ["ӷ", "ѓ", "ґ", "ғ", "ӻ"]],
    ["д", ["ꚉ", "ꚁ"]],
    ["е", ["ҽ", "ҿ", "ε"]],
    ["ж", ["җ", "ӝ"]],
    ["з", ["ҙ", "ѯ", "ӟ", "ӡ", "ȝ"]],
    ["и", ["ᴎ", "ͷ"]],
    ["й", ["ҋ", "ӣ"]],
    ["к", ["қ", "ќ", "ҡ", "κ"]],
    ["л", ["ӆ", "ԓ"]],
    ["м", ["ӎ", "ϻ"]],
    ["н", ["ң", "ҥ", "ӈ", "ӊ", "ԋ"]],
    ["о", ["ӧ", "ο"]],
    ["п", ["ԥ", "π"]],
    ["р", ["ҏ", "ρ", "ⲣ"]],
    ["с", ["ҫ", "ϲ"]],
    ["т", ["ҭ"]],
    ["у", ["ў", "ӳ"]],
    ["ф", ["ϕ", "ȹ"]],
    ["х", ["ҳ", "ӽ", "ӿ", "χ", "ⲭ"]],
    ["ц", ["ꚏ"]],
    ["ч", ["ҷ", "ҹ", "ӌ", "ӵ"]],
    ["ш", ["ⲽ", "ɯ"]],
    ["щ", ["ꚗ", "ꗌ"]],
    ["ъ", ["ꙏ","ᕹ"]],
    ["ы", ["ӹ"]],
    ["ь", ["Ⱃ"]],
    ["э", ["ӭ"]],
    ["ю", ["ꀒ", "ꆉ"]],
    ["я", ["ᴙ"]]
];


/* minimal: */
/*
var letters = [
    ["А", ["Α"]],
    ["Б", ["Ƃ"]],
    ["В", ["Β"]],
    ["Г", ["Γ"]],
    ["Д", ["Ꚉ", "Ꚁ"]],
    ["Е", ["Ε"]],
    ["Ж", ["Җ", "Ӂ"]],
    ["З", ["Ӡ", "Ȝ"]],
    ["И", ["Ͷ"]],
    ["Й", ["Ҋ"]],
    ["К", ["Κ"]],
    ["Л", ["Λ"]],
    ["М", ["Μ"]],
    ["Н", ["Η"]],
    ["О", ["Ο"]],
    ["П", ["Π"]],
    ["Р", ["Ρ"]],
    ["С", ["Ϲ"]],
    ["Т", ["Τ"]],
    ["У", ["Ӯ", "Ӱ", "Ӳ"]],
    ["Ф", ["Φ"]],
    ["Х", ["Χ"]],
    ["Ц", ["Ꚏ"]],
    ["Ч", ["Ҷ", "Ҹ", "Ӌ", "Ӵ"]],
    ["Ш", ["Ɯ"]],
    ["Щ", ["Ꚗ"]],
    ["Ъ", []],
    ["Ы", ["Ӹ"]],
    ["Ь", ["Ƅ", "Ꙏ"]],
    ["Э", ["Ӭ"]],
    ["Ю", ["ꀒ", "ꆉ"]],
    ["Я", []],
    ["а", ["α", "ɑ"]],
    ["б", ["ҕ", "ƃ"]],
    ["в", ["β"]],
    ["г", ["ӷ", "ґ"]],
    ["д", ["ꚉ", "ꚁ"]],
    ["е", ["ҽ"]],
    ["ж", ["җ", "ӝ"]],
    ["з", ["ӡ", "ȝ"]],
    ["и", ["ᴎ"]],
    ["й", ["ӣ"]],
    ["к", ["κ"]],
    ["л", ["ӆ", "ԓ"]],
    ["м", ["ӎ", "ϻ"]],
    ["н", ["ң", "ҥ", "ӊ", "ԋ"]],
    ["о", ["ο"]],
    ["п", ["π"]],
    ["р", ["ρ"]],
    ["с", ["ϲ"]],
    ["т", ["ҭ"]],
    ["у", ["ў", "ӳ"]],
    ["ф", ["ϕ", "ȹ"]],
    ["х", ["ҳ", "ӽ", "ӿ", "χ"]],
    ["ц", ["ꚏ"]],
    ["ч", ["ҷ", "ҹ", "ӌ", "ӵ"]],
    ["ш", ["ɯ"]],
    ["щ", ["ꚗ"]],
    ["ъ", ["ꙏ","ᕹ"]],
    ["ы", ["ӹ"]],
    ["ь", ["Ⱃ"]],
    ["э", ["ӭ"]],
    ["ю", ["ꀒ", "ꆉ"]],
    ["я", ["ᴙ"]]
];
*/

var obscene_roots = [
    "ху[ийеё]",
    "(на|по)х",
    "хрен",
    "хер",
    "хул[иеь]",
    "п[ие]д[ао]р",
    "п[иеё]зд",
    "бл",
    "[её]б",
    "жоп",
    "муд",
    "сра",
    "с[еёи]р",
    "с[оа]с",
    "член",
    "сса",
    "сик",
    "кук",
    "г[оа]вн",
    "убл",
    "манд",
    "фиг",
    "л[ао][хш]",
    "г[ао]нд",
    "елд",
    "залуп",
    "п[её]р[дн]*",
    "бзд",
    "дрист",
    "дер",
    "идио",
    "ан",
    "ваг",
    "др[юо]ч",
    "я[ий][цч]",
    "трах",
    "сн[ао]ш",
    "г[ао]м",
    "ге[ейи]",
    "дилд",
    "дод",
    "д[ао]лб",
    "су[кч]"
];

function findObscene(str)
{
    var obsceneContains = false;
    for(var i = 0; !obsceneContains && i < obscene_roots.length; i++)
    {
        obsceneContains = str.match(new RegExp(obscene_roots[i]));
    }
    return obsceneContains;
}

function obfuscate(str)
{
    for(var i = 0; i < letters.length; i++)
    {
        var lettersForReplace = letters[i][1];
        var lettersForReplaceAmount = lettersForReplace.length;
        if(lettersForReplaceAmount > 0)
        {
            var replace_ = "";
            if(lettersForReplaceAmount == 1){
                replace_ = lettersForReplace[0];
            }
            else
            {
                var indx_letter = Random_.getRandomInt(0, lettersForReplaceAmount - 1);
                replace_ = lettersForReplace[indx_letter];
            }
            str = replaceAll(str, letters[i][0], replace_);
        }
    }
    return str;
}

function obfuscateObscene(str)
{
    var new_str_ = str;
    var str_for_find = str.toLocaleLowerCase();
    for(var i = 0; i < obscene_roots.length; i++)
    {
        finded_ = str_for_find.match(new RegExp(obscene_roots[i]));
        if(finded_ !== null)
        {
            for(var j = 0; j < finded_.length; j++)
            {
                new_str_ = new_str_.replace(finded_[j], obfuscate(finded_[j]));
            }
        }
    }
    return new_str_;
}



function actionWithSavePosition(chat_input, action)
{
    var selectionStart_ = chat_input.selectionStart;
    var selectionEnd_ = chat_input.selectionEnd;
    
    action();
    
    chat_input.setSelectionRange(selectionStart_, selectionEnd_);
}

function oninputObfuscateHandler()
{
    function obfuscateRussianChat(){ russianChatInput.value = obfuscateObscene(russianChatInput.value); }
    actionWithSavePosition(russianChatInput, obfuscateRussianChat);
}

var chatLoadedChecker;
var russianChatInput;

function chatLoadedCheck()
{
    var chats_inputs = document.querySelectorAll("textarea.chat_input");
    russianChatInput = chats_inputs[2];
    if(russianChatInput != undefined)
    {
        clearInterval(chatLoadedChecker);
        russianChatInput.oninput = oninputObfuscateHandler;
    }
}

function pageFullyLoaded_()
{
    chatLoadedChecker = setInterval(chatLoadedCheck, 1000);
}