Greasy Fork is available in English.

WEX.nz (Btc-e) Chat Filter

(Btc-e) Chat Filter. Show message only select users.

// ==UserScript==
// @name        WEX.nz (Btc-e) Chat Filter
// @name:en     WEX.nz (Btc-e) Chat Filter
// @name:ru     WEX.nz (Btc-e) Chat Filter (Фильтр сообщений для чата WEX.nz (Btc-e))
// @namespace   WexChatFilter
// @description (Btc-e) Chat Filter. Show message only select users. 
// @description:en WEX.nz (Btc-e) Chat Filter. Show message only select users. 
// @description:ru Расширение-фильтр для чата wex.nz. Отображает сообщения только выбраных пользователей.
// @include     https://wex.nz/*
// @version     0.1.2
// @grant       none
// ==/UserScript==
'use strict'
var lists={};
var WCFActive = 1;
lists['whiteList'] = ['admin', 'admin1', 'support', 'system','QWERTAS'];
lists['readList'] = [ 'aclon','tar730'];
lists['blackList'] = [ 'ddr3','tar729'];
// имя пользователя для которого открыто дополнительное меню
var cMenuUsername='';
/*список всех ников пользователей, от которых есть сообщения в чате*/
var usersInChat = {};
$( document ).ready(function() {
    console.log('Wex chat filter script load!');
    restoreLocal();
    if(!auth)nChatEnableRefresh();
    if(auth_login && !checkUserInList(auth_login, 'whiteList'))
        changeList(auth_login, 'whiteList');
    setInterval(function(){
        userActive();
    }, 300000);
    chatChannel.unbind("msg", nChatPutMsg);
	chatChannel.bind("msg", (x)=>{
        auth ? nChatPutMsg(x):nChatPutMsg_unlogin(x);
        parseChatMessage($( ".chatmessage").last());
        checkRealTarget($( ".chatmessage").last());
        check();
    })
    createAdditionButtons();
    firstStart();
    check();
});
function restoreLocal(){
    WCFActive = localStorage.getItem('WCFActive');
    if(WCFActive == undefined){
        WCFActive = 1;
	    localStorage.setItem('WCFActive', WCFActive);
    }
    loadFromlocalStorage("whiteList");
    loadFromlocalStorage("readList");
    loadFromlocalStorage("blackList");
}    
function createUserMenuButton(bName, bText, bTextDel){
    $('#cMenuIgnore-text').parent().append($('#cMenuIgnore-text').clone().attr('id', bName+'-text').text(bText));
    $('#cMenuIgnore-text').parent().append($('#cMenuIgnore-text').clone().attr('id', bName+'-text-del').text(bTextDel));
    let $cMenu = $('#cMenu');
    let $newButton = $('#cMenuProfile').clone();
    $newButton.attr("id",bName);
    $cMenu.append($newButton);
    $("#nChat").on("click", ".chatmessage > a", function(){
        cMenuUsername = $(this).text();
        let user = $(this).parent().data('userdata');
        onClickUser(user);
    });
    $("#nChat").on("click", ".chatmessage > span >a", function(){
        cMenuUsername = $(this).text();
        let user = $(this).parent().parent().data('userdata');
        onClickUser(user);
    });
    function onClickUser(user){
        if(user){
            if(user.Name == cMenuUsername){
                //menu open for main user
            }else{
                //menu open for user message target
                if(user.realTarget && user.Target){
                    cMenuUsername = user.Target;
                    //hide unusable options
                    $('#cMenuProfile').hide();
                    $('#cMenuInChat').hide();
                    $('#cMenuPM').hide();
                    $('#cMenuIgnore').hide();
                }
            }
        }
        let additionText = '';
        if(checkUserInList(cMenuUsername, bName))
            additionText = '-del';
        $("#"+bName).show().html("<a href='javascript:void(0)' class='profileBtn'>"+$("#"+bName+"-text"+additionText).html()+"</a>");
    }

    $("#"+bName).on("click", "a.profileBtn", function(){
        changeList(cMenuUsername, bName);
    });
}
function createAdditionButtons(){
    createUserMenuButton('whiteList', 'To whitelist', 'Drop from whitelist');
    createUserMenuButton('readList', 'To readable', 'Drop from readable');
    createUserMenuButton('blackList', 'To blacklist', 'Drop from blacklist');
    let $nChatSettings = $('#nChatSettings');
    let $newUl = $('<ul></ul>');
    $nChatSettings.css("height","14%")
                  .css( "padding-left", "+=15")
                  .find('a').wrap('<li>');
    $nChatSettings.find('li').each(function(i,elem) {
        $newUl.append($(elem));
    })
    $nChatSettings.empty()
                  .append($newUl);
    $newUl.css("width","100%");
    function createChatMenuButton(bElemId, bText, bTitle, bFunc){
        let $newLi = $("<li><a href='javascript:void(0)' title = '"+bTitle+"' id = '"+bElemId+"'>"+bText+"</a></li>");
        $newUl.append($newLi);
        $newLi.click(bFunc);
    }
    $newUl.append($("<a><span style='color:red'>W</span>ex <span style='color:red'>C</span>hat <span style='color:red'>F</span>ilter options:</a>"));
    createChatMenuButton('cTurnOnOffWCF-text', 'Turn on/off WCF','', turnOnOffWCF);
    //createChatMenuButton('cClearAllIgnored', 'Clear ignore list','Attention! Clear you ignore list!', clearIgnoreList);
    setTurnOnOffText();
}
function setTurnOnOffText(){
    let textDescribe = (WCFActive == 1)?'Turn Off WCF ':'Turn On WCF ';
    $('#cTurnOnOffWCF-text').text(textDescribe);  
}
function clearIgnoreList(){
    //chat_ignored = {"900828":"makewebuy","923838":"vors"};
    nChatSettingsToggle(1);
    if(WCFActive != 1)return;
    for(let ignor in chat_ignored){
        nChatIgnoreDel(ignor);
        setTimeout(clearIgnoreList, 250);
        break;
    }
}
function turnOnOffWCF(){
    console.log("Change WCFActive call");
    nChatSettingsToggle(1);
    if(WCFActive == 1){
        WCFActive = 0;
        $('.chatmessage').each(function(i,elem) {
            $(elem).show();
        });
    }else{
        WCFActive =1;
        check();
    }
    localStorage.setItem('WCFActive', WCFActive);
    setTurnOnOffText();
}
function changeList(username, listname){
    for(let l in lists){
        let i=lists[l].indexOf(username);
        if(i==-1){
            if(l == listname)
                lists[listname].push(username);
        }else{
            //пользователь уже в списке -> удаляем
            lists[l].splice(i,1);
        }
        saveTolocalStorage(l);
    }
    check();
}
function loadFromlocalStorage(listname){
    let loc = localStorage.getItem(listname);
	(!loc) ? localStorage.setItem(listname, lists[listname]):lists[listname] = loc.split(',');
}
function saveTolocalStorage(listname){
	localStorage.setItem(listname, lists[listname]);
}
function checkUserInList(username, listname){
    return lists[listname].some((x) => x == username);
}
function nChatPutMsg_unlogin(a){
    a=JSON.parse(a);
    if(nChatCheckForIgnore(a.uid))
        return!0;
    var b=new RegExp("\\b"+auth_login+"\\b","ig");
    let u_style=a.login==auth_login?
    "color: #193477 !important;":
    "color: "+a.usr_clr;
    let m_style = "";
    b="<p id='msg"+a.msg_id+"' class='chatmessage uid"+a.uid+"' style='"+m_style+"display:none'>"+("<a title='"+a.date+"' style='"+u_style+" !important; font-weight: bold;' href='javascript:void(0)' onclick='nChatMenu("+a.uid+', "'+a.login+'", '+a.msg_id+", event)'>"+a.login+"</a>")+": <span>"+a.msg+"</span></p>";
    $("#nChat").append(b);
    let old_msg_size=0;
    512<$("#nChat p").length&&(old_msg_size=$("#nChat p").first().outerHeight(!0),$("#nChat p").first().remove());
    $("#msg"+a.msg_id).fadeIn(100);
    let new_msg_size=$("#msg"+a.msg_id).outerHeight(!0);
    nChatScroll(new_msg_size,old_msg_size)
}
function firstStart(){
    console.log('firstStart() call');
    $('.chatmessage').each(function(i,elem) {
        parseChatMessage($(elem));
    })
    $('.chatmessage').each(function(i,elem) {
        checkRealTarget($(elem));
    })
    //console.log('usersInChat: '+JSON.stringify(usersInChat));    
}
function parseChatMessage($elem){
    if($elem.data('userdata'))return;
    let text = $elem.text();
    let html = $elem.html();
    let splitText = text.split(':');

    let user = {
        'Id': html.match(/(nChatMenu\()(\d{1,8})/)[2],
        'Name': splitText[0],
        'Target': getTagretUserFromMessage(splitText[1]),
        'realTarget': 0
    }
    usersInChat[user.Name] = user.Id;
    $elem.data('userdata', user);
    //console.log(JSON.stringify(user));
}
function checkRealTarget($elem){
    let user = $elem.data('userdata');
    if(!user)return;
    /*флаг того, что ответ-цитирование обращено к реальному пользователю*/
    if(usersInChat[user.Target]){
        user.realTarget = 1;
        $elem.find('span').html('<a style="color: #524949" href="javascript:void(0)" onclick="nChatMenu(206642, \''+user.Target+'\', 345345, event)">'+user.Target+'</a><span>'+$elem.text().slice(user.Name.length+2+user.Target.length))+'</span>';
    }
}
function check(){
    if(WCFActive != 1)return;
    console.log('check() call');
    //массив юзеров, для которых есть ответы цитированием от юзеров с whitelist
    let targetList = [];
    $('.chatmessage').each(function(i,elem) {
        let user = $(elem).data('userdata');
        if(!user)return;
       // console.log(JSON.stringify(user));
        /*Отображаются все сообщения пользователей с белого списка, кроме тех, которые
        адрессованы пользователям с черного списка*/
        if(checkUserInList(user.Name,'whiteList')){
            if(!user.realTarget ){
                $(elem).show();
            }else{         
                if(!checkUserInList(user.Target,'blackList')){
                    targetList.push(user.Target);
                    $(elem).show();
                }else{
                    $(elem).hide();
                }
            }
            return;
        }else{
            /*Отображаются только сообщения никому не адрессованные или
            адресованные юзерам с белого списка*/
            if(checkUserInList(user.Name,'readList')){
                if(!user.realTarget ){
                    $(elem).show();
                }else{         
                    if(checkUserInList(user.Target,'whiteList')){
                        $(elem).show();
                    }else{
                        $(elem).hide();
                    }
                }
                return;
            }
            $(elem).hide();        
        }
    });
    /*не все сообщения от юзеров, которые цитируются пользователями
     с whitelist отображаются в чате. Не отображаются сообщения
     таргет юзера, которые адресованы людям не из whitelist*/
    targetList.forEach((val)=>$("#nChat .uid"+usersInChat[val]).each(function(i, elem){
        let quotes = getTagretUserFromMessage($(elem).text().split(':')[1]);
        if(lists['whiteList'].some((x) => x == quotes) 
           || usersInChat[quotes]==='undefined' 
           || quotes =='' ){
            $(elem).show();
            //console.log(quotes+'**'+usersInChat[quotes])
        }
    })); 
    console.log('End check()');
}
function getTagretUserFromMessage(message){
    if(!message)return '';
    let target = message.split(',')[0];
    if(target.length<=1)return '';
    target = target.slice(1);
    if(target && target.split(' ').length === 1)return target;
    return '';
}