AyrA icon

Reddit /robin spam blocker

AyrA | PRO | 04/02/16 12:04:03 AM UTC | 0 ⭐ | 2576 👁️ | Never ⏰ | []
JavaScript |

7.56 KB

|

None

|

0 👍

/

0 👎

// ==UserScript==
// @name         robin-spam-filter
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  Robin Spam Filter
// @author       u/AyrA_ch
// @match        https://www.reddit.com/robin*
// @grant        none
// ==/UserScript==
 
function injectMessage(message)
{
    var d2=function(q)
    {
        if(q<10)
        {
            return "0"+q;
        }
        return q;
    };
    var dt=new Date();
    var time=(dt.getHours()>12?dt.getHours()-12:dt.getHours())+":"+d2(dt.getMinutes())+":"+d2(dt.getSeconds())+" "+(dt.getHours()>=12?"PM":"AM");
    var template="<div class=\"robin-message robin--flair-class--no-flair robin--message-class--message robin--user-class--system\">"+
        "<span class=\"robin-message--timestamp\">"+time+"</span>"+
        "<span class=\"robin-message--from robin--username\">[SCRIPT]</span>"+
        "<span class=\"robin-message--message\">"+message+"</span>"+
        "</div>";
    document.querySelector('#robinChatMessageList').innerHTML+=template;
    return template;
}
 
function spamFilterInit(){
    //CONFIG HERE//
    
    //Add stuff to block in the list below. Be sure to add commas except after the last item
    var Block=[
        "voted to GROW",
        "voted to STAY",
        "voted to ABANDON",
        "/4cyqiy",
        "/4cwk2s",
        "Current grow(",
        "Current stay(",
        "Current abandon(",
        "Available commands:",
        "[Robin Autovoter",
        "[Silent Robin",
        "Current standings [",
        "RobinFacts",
        "[Robin-",
        "[STATS]",
        "Autovote",
        "autovote",
        "oooooooooooo",
        "卐",
        "http://",
        "https://",
        "www.",
        "---DEV---",
        "doot",
        "777",
        ">>>",
        " - - -"
    ];
    
    //Add users to block here:
    var Users=[];
    
    //Add users to never block here. Same comma rule as with the "Users" variable above
    var Whitelist=[
        "AyrA_ch",
        "[robin]"
    ];
    
    //set to true, to see notes in the console when a message is blocked
    var printer=false;
    //set to true, to hide text containing excessive unicode crap
    var HideUnicode=true;
    //set the unicode cutoff. Lower removes more messages, but might hide legit messages too
    var UnicodeSegments=20;
    //Hides uppercase spam if it exceeds 1/4 of all chars
    var HideUppercase=true;
    
    //STOP HERE//
    
    //generic stuff
    var title=document.title.split(" ")[2];
    var usercount=title.length/2;
    var target=document.querySelector('#robinChatMessageList');
    var txtBox=$("#robinSendMessage > input[type='text']");
 
    if(localStorage.getItem("robin.blockedUsers"))
    {
        Users=Users.concat(localStorage.getItem("robin.blockedUsers").split(','));
        console.debug("Loaded blocked users list:",Users);
    }
    
    var isUnicodeSpam=function(m)
    {
        return encodeURIComponent(m).replace(/\%20/g,"_").split("%").length>UnicodeSegments;
    };
    
    var isUppercaseSpam=function(m)
    {
        var uc="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        return m.split("").filter(function(v){return uc.indexOf(v)>=0;}).length>m.length/4;
    };
    
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            var hide=function()
            {
                mutation.addedNodes[0].style.display = "none";
            };
            var msg = mutation.addedNodes[0].lastElementChild.textContent;
            var username = mutation.addedNodes[0].lastElementChild.previousElementSibling.textContent;
            
            //if the username is the time, because it was missing. We add it from the previous node
            if(mutation.addedNodes[0].lastElementChild.previousElementSibling.nodeName===document.createElement("time").nodeName)
            {
                username=mutation.addedNodes[0].previousElementSibling.lastElementChild.previousElementSibling.textContent;
                var ele=document.createElement("span");
                ele.textContent=username;
                ele.setAttribute("class","robin-message--from robin--username");
                mutation.addedNodes[0].insertBefore(ele,mutation.addedNodes[0].lastElementChild);
                console.debug("detected user:",username);
            }
            
            //always show our messages and system messages
            if(username===$(".user > a").text() || Whitelist.indexOf(username)>=0)
            {
                return;
            }
            
            mutation.addedNodes[0].lastElementChild.previousElementSibling.onclick=function()
            {
                if(confirm("block "+username+"?"))
                {
                    Users.push(username);
                    localStorage.setItem("robin.blockedUsers",Users.join(","));
                    injectMessage("User blocked: "+username);
                }
            };
            
            if(Users.indexOf(username)>=0)
            {
                hide();
                if(printer)
                {
                    console.log("[USER] blocked:",username);
                }
                return;
            }
            for(var x in Block)
            {
                if(msg.indexOf(Block[x])>=0)
                {
                    hide();
                    if(printer)
                    {
                        console.log("[CONTENT] blocked:",Block[x]);
                    }
                    return;
                }
            }
            if(HideUppercase && isUppercaseSpam(msg))
            {
                hide();
                if(printer)
                {
                    console.log("[UPPERCASE] blocked");
                }
            }
            if(HideUnicode && isUnicodeSpam(msg))
            {
                hide();
                if(printer)
                {
                    console.log("[UNICODE] blocked");
                }
            }
        });
    });
    observer.observe(target, {childList: true});
    
    txtBox.on("keyup",function(e){
        if(e.keyCode==13)
        {
            if(txtBox.val().indexOf("/unblock ")===0)
            {
                var param=txtBox.val().split(' ')[1];
                if(Users.indexOf(param)>=0)
                {
                    Users=Users.filter(function(v){return v!=param;});
                    txtBox.val("");
                    injectMessage("Unblocked "+param);
                }
                else
                {
                    injectMessage("This user is not in the block list. Use /blist to show blocked users");
                }
            }
            else if(txtBox.val()=="/blist")
            {
                txtBox.val("");
                injectMessage("List of blocked users:\r\n"+Users.join(", "));
            }
            else if(txtBox.val()=="/cls")
            {
                txtBox.val("");
                target.innerHTML=injectMessage("Chat cleared");
            }
            else if(txtBox.val()=="/title")
            {
                txtBox.val("");
                injectMessage(title);
            }
        }
    });
    console.debug("Spam filter ready");
    injectMessage("Spam filter ready");
    injectMessage(title);
    injectMessage(usercount+" users here");
}
           
//setTimeout(spamFilterInit, 5000);
 
if(typeof($)==typeof(undefined))
{
    console.debug("no jQuery");
}
else
{
    spamFilterInit();
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎