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).

질문, 리뷰하거나, 이 스크립트를 신고하세요.
// ==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);
}