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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

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