free cum tribute Live cams!
Click Here to register for a free forum account
Simple 1-step registration process. Be able to upload photos/post topics/PM/Chat, remove pop-up ADs, subscribe to topics and access many more features.

HOWTO: Blocking chat spammers

Includes forum games such as Fuck Marry Kill, Queen of Cum game, What would you do to her game, and a topic to post your Y!M and MSN and SKYPE for live cam cumming General non cumming on pictures chat
Forum rules
18+

Re: HOWTO: Blocking chat spammers

Unread postby Persona non grata » Wed Apr 15, 2015 4:08 am

bnl wrote:I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid setting are: maxPics, maxSize, maxText, maxCapsWords
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.

Cheers for maintaining this, m8.

Karma for ya. ;)
>>>Retired<<<
User avatar
Persona non grata
Respected Member
Respected Member
 
Posts: 2939
Joined: Wed May 18, 2011 8:03 pm
Karma: 1776

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 15, 2015 4:17 am

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid setting are: maxPics, maxSize, maxText, maxCapsWords
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/*
// @version     5.1
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var maxPics, maxSize, maxText, maxCapsWords;
            var banArray, imageArray, textContent, capsWords;
            var stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {};

            //Default config
            maxPics = 3;
            maxSize = '640';
            maxText = 2200;
            maxCapsWords = 15;
            banArray = [
                'rightsaidfred',
                'michaelangelofoto',
                'chantal4master',
                'chris19',
                'xphoooto',
                'dirtycreamwhores',
                'nigelfarage'
            ];

            var removeIdiots = function (posts) {
                posts.not('.cppHidden').each(function () {
                    var $node = e(this);
                    var profile = $node.find('#profile a').text();
                    e.each(banArray, function (banKey, banValue) {
                        if ($node.find('#profile a').text().toLowerCase() === banValue) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length > maxPics) {
                        console.info('Blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    textContent = $node.find('div.content').text();
                    if (textContent.length > maxText) {
                        console.info('Blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > maxCapsWords) {
                        console.info('Blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                });
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                case 'maxpics':
                    maxPics = value;
                    localStorage.maxPics = maxPics;
                    alertify.log('maxPics set to ' + maxPics, 'success', 5000);
                    break;
                case 'maxsize':
                    maxSize = value;
                    localStorage.maxSize = maxSize;
                    e('#chat .content img').css({
                        'max-width': maxSize + 'px',
                        'max-height': maxSize + 'px'
                    });
                    alertify.log('maxSize set to ' + maxSize + 'px', 'success', 5000);
                    break;
                case 'maxtext':
                    maxText = value;
                    localStorage.maxText = maxText;
                    alertify.log('maxText set to ' + maxText + ' characters', 'success', 5000);
                    break;
                case 'maxcapswords':
                    maxCapsWords = value;
                    localStorage.maxCapsWords = maxCapsWords;
                    alertify.log('maxCapsWords set to ' + maxCapsWords, 'success', 5000);
                    break;
                }
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/i.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/i)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    param1 = input.match(/(\w+)/g)[1];
                    if (param1) {
                        param1 = param1.toLowerCase();
                    }
                    param2 = input.match(/(\w+)/g)[2];

                    switch (command) {
                    case 'ignore':
                        if (!param1) {
                            alertify.log('An username to ignore is needed', 'error', 5000);
                        } else {
                            if (banArray.indexOf(param1) > -1) {
                                alertify.log(param1 + ' is already ignored', '', 5000);
                            } else {
                                banArray.push(param1);
                                localStorage.banArray = JSON.stringify(banArray);
                                reloadParams();
                                alertify.log(param1 + ' added to the ignore list',
                                    'success', 5000);
                            }
                        }
                        break;
                    case 'unignore':
                        if (!param1) {
                            alertify.log('An username to unignore is needed', 'error', 5000);
                        } else {
                            if (banArray.indexOf(param1) === -1) {
                                alertify.log(param1 + ' is not ignored', '', 5000);
                            } else {
                                banArray.splice(banArray.indexOf(param1), 1);
                                localStorage.banArray = JSON.stringify(banArray);
                                reloadParams();
                                alertify.log(param1 + ' removed from the ignore list',
                                    'success', 5000);
                            }
                        }
                        break;
                    case 'listignored':
                        alertify.alert(
                            '<strong>Ignored users:</strong> <br><br>' + banArray.toString()
                            .replace(/,/g, ', ')
                        );
                        break;
                    case 'listsettings':
                        alertify.alert(
                            '<strong>Current settings:</strong> <br><br>' +
                            'maxPics = ' + maxPics + '<br>' +
                            'maxSize = ' + maxSize + '<br>' +
                            'maxText = ' + maxText + '<br>' +
                            'maxCapsWords = ' + maxCapsWords + '<br>'
                        );
                        break;
                    case 'set':
                        if (/maxPics|maxSize|maxText|maxCapsWords/i.test(param1)) {
                            if (!param2) {
                                alertify.log('A value must be provided.', 'error', 5000);
                            } else if (isNaN(param2)) {
                                alertify.log('The value must be a valid number.', 'error',
                                    5000);
                            } else {
                                setParam(param1, param2);
                            }
                        } else {
                            alertify.log(
                                'Unknow setting. Valid settings are: maxPics, maxSize, maxText, maxCapsWords',
                                'error', 5000);
                        }
                        break;
                    case 'stats':
                        alertify.alert(
                            '<strong>Stats for session:</strong> <br><br>' +
                            'Total banned users: ' + banArray.length + '<br>' +
                            'Messages blocked this session: ' + stat_TotalBlocked +
                            '<br>' +
                            'Blocked users: ' + JSON.stringify(stat_BlockedUsers) +
                            '<br>' +
                            'Blocked images: ' + JSON.stringify(stat_BlockedImages) +
                            '<br>' +
                            'Wall of text: ' + JSON.stringify(stat_BlockedText) +
                            '<br>' +
                            'Caps Lock Malfunction: ' + JSON.stringify(stat_BlockedCaps)
                        );
                        break;
                    case 'help':
                        alertify.alert(
                            '<strong>List of valid commands:</strong> <br><br>' +
                            '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                            '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                            '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                            '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                            '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                            '&emsp;&emsp;<em>Valid setting are: maxPics, maxSize, maxText, maxCapsWords</em><br>' +
                            '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                            '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                        );
                        break;
                    default:
                        alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            }

            var init = function () {
                // get config
                if (!localStorage.banArray) {
                    localStorage.maxPics = maxPics;
                    localStorage.maxSize = maxSize;
                    localStorage.maxText = maxText;
                    localStorage.maxCapsWords = maxCapsWords;
                    localStorage.banArray = JSON.stringify(banArray);
                } else {
                    maxPics = localStorage.maxPics;
                    maxSize = localStorage.maxSize;
                    maxText = localStorage.maxText;
                    maxCapsWords = localStorage.maxCapsWords;
                    banArray = JSON.parse(localStorage.banArray);
                }

                // style
                e('<style type="text/css">' +
                    '  #chat .content img {' +
                    '    max-width:' + maxSize + 'px;' +
                    '    max-height:' + maxSize + 'px;' +
                    '    width:auto;' +
                    '    height:auto;' +
                    '    display:inline-block' +
                    '  }' +
                    '  .cppHidden {' +
                    '    display: none;' +
                    '  }' +
                    '  .alertify, .alertify-log {' +
                    '    font-size: 125%;' +
                    '  }' +
                    '  .alertify-logs {' +
                    '    position: fixed;' +
                    '    z-index: 5000;' +
                    '    top: 50px; left: 50%;' +
                    '    width: 300px;' +
                    '    margin-left: -150px;' +
                    '  }' +
                    '</style>'
                ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 15, 2015 4:47 am

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid setting are: maxPics, maxSize, maxText, maxCapsWords
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/*
// @version     5.2
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var maxPics, maxSize, maxText, maxCapsWords;
            var banArray, imageArray, textContent, capsWords;
            var stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {};

            //Default config
            maxPics = 3;
            maxSize = '640';
            maxText = 2200;
            maxCapsWords = 15;
            banArray = [
                'rightsaidfred',
                'michaelangelofoto',
                'chantal4master',
                'chris19',
                'xphoooto',
                'dirtycreamwhores',
                'nigelfarage'
            ];

            var removeIdiots = function (posts) {
                posts.not('.cppHidden').each(function () {
                    var $node = e(this);
                    var profile = $node.find('#profile a').text();
                    e.each(banArray, function (banKey, banValue) {
                        if ($node.find('#profile a').text().toLowerCase() === banValue) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': maxSize + 'px',
                            'max-height': maxSize + 'px'
                        });
                    }
                    if (imageArray.length > maxPics) {
                        console.info('Blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    textContent = $node.find('div.content').text();
                    if (textContent.length > maxText) {
                        console.info('Blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > maxCapsWords) {
                        console.info('Blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                });
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                    case 'maxpics':
                        maxPics = value;
                        localStorage.maxPics = maxPics;
                        alertify.log('maxPics set to ' + maxPics, 'success', 5000);
                        break;
                    case 'maxsize':
                        maxSize = value;
                        localStorage.maxSize = maxSize;
                        alertify.log('maxSize set to ' + maxSize + 'px', 'success', 5000);
                        break;
                    case 'maxtext':
                        maxText = value;
                        localStorage.maxText = maxText;
                        alertify.log('maxText set to ' + maxText + ' characters', 'success', 5000);
                        break;
                    case 'maxcapswords':
                        maxCapsWords = value;
                        localStorage.maxCapsWords = maxCapsWords;
                        alertify.log('maxCapsWords set to ' + maxCapsWords, 'success', 5000);
                        break;
                }
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/i.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/i)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    param1 = input.match(/(\w+)/g)[1];
                    if (param1) {
                        param1 = param1.toLowerCase();
                    }
                    param2 = input.match(/(\w+)/g)[2];

                    switch (command) {
                        case 'ignore':
                            if (!param1) {
                                alertify.log('An username to ignore is needed', 'error', 5000);
                            } else {
                                if (banArray.indexOf(param1) > -1) {
                                    alertify.log(param1 + ' is already ignored', '', 5000);
                                } else {
                                    banArray.push(param1);
                                    localStorage.banArray = JSON.stringify(banArray);
                                    reloadParams();
                                    alertify.log(param1 + ' added to the ignore list',
                                                 'success', 5000);
                                }
                            }
                            break;
                        case 'unignore':
                            if (!param1) {
                                alertify.log('An username to unignore is needed', 'error', 5000);
                            } else {
                                if (banArray.indexOf(param1) === -1) {
                                    alertify.log(param1 + ' is not ignored', '', 5000);
                                } else {
                                    banArray.splice(banArray.indexOf(param1), 1);
                                    localStorage.banArray = JSON.stringify(banArray);
                                    reloadParams();
                                    alertify.log(param1 + ' removed from the ignore list',
                                                 'success', 5000);
                                }
                            }
                            break;
                        case 'listignored':
                            alertify.alert(
                                '<strong>Ignored users:</strong> <br><br>' + banArray.toString()
                                .replace(/,/g, ', ')
                            );
                            break;
                        case 'listsettings':
                            alertify.alert(
                                '<strong>Current settings:</strong> <br><br>' +
                                'maxPics = ' + maxPics + '<br>' +
                                'maxSize = ' + maxSize + '<br>' +
                                'maxText = ' + maxText + '<br>' +
                                'maxCapsWords = ' + maxCapsWords + '<br>'
                            );
                            break;
                        case 'set':
                            if (/maxPics|maxSize|maxText|maxCapsWords/i.test(param1)) {
                                if (!param2) {
                                    alertify.log('A value must be provided.', 'error', 5000);
                                } else if (isNaN(param2)) {
                                    alertify.log('The value must be a valid number.', 'error',
                                                 5000);
                                } else {
                                    setParam(param1, param2);
                                }
                            } else {
                                alertify.log(
                                    'Unknow setting. Valid settings are: maxPics, maxSize, maxText, maxCapsWords',
                                    'error', 5000);
                            }
                            break;
                        case 'stats':
                            alertify.alert(
                                '<strong>Stats for session:</strong> <br><br>' +
                                'Total banned users: ' + banArray.length + '<br>' +
                                'Messages blocked this session: ' + stat_TotalBlocked +
                                '<br>' +
                                'Blocked users: ' + JSON.stringify(stat_BlockedUsers) +
                                '<br>' +
                                'Blocked images: ' + JSON.stringify(stat_BlockedImages) +
                                '<br>' +
                                'Wall of text: ' + JSON.stringify(stat_BlockedText) +
                                '<br>' +
                                'Caps Lock Malfunction: ' + JSON.stringify(stat_BlockedCaps)
                            );
                            break;
                        case 'help':
                            alertify.alert(
                                '<strong>List of valid commands:</strong> <br><br>' +
                                '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                                '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                                '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                                '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                                '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                                '&emsp;&emsp;<em>Valid setting are: maxPics, maxSize, maxText, maxCapsWords</em><br>' +
                                '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                                '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                            );
                            break;
                        default:
                            alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            }

            var init = function () {
                // get config
                if (!localStorage.banArray) {
                    localStorage.maxPics = maxPics;
                    localStorage.maxSize = maxSize;
                    localStorage.maxText = maxText;
                    localStorage.maxCapsWords = maxCapsWords;
                    localStorage.banArray = JSON.stringify(banArray);
                } else {
                    maxPics = localStorage.maxPics;
                    maxSize = localStorage.maxSize;
                    maxText = localStorage.maxText;
                    maxCapsWords = localStorage.maxCapsWords;
                    banArray = JSON.parse(localStorage.banArray);
                }

                // style
                e('<style type="text/css">' +
                  '  #chat .content img {' +
                  '    width:auto;' +
                  '    height:auto;' +
                  '    display:inline-block' +
                  '  }' +
                  '  .cppHidden {' +
                  '    display: none;' +
                  '  }' +
                  '  .alertify, .alertify-log {' +
                  '    font-size: 125%;' +
                  '  }' +
                  '  .alertify-logs {' +
                  '    position: fixed;' +
                  '    z-index: 5000;' +
                  '    top: 50px; left: 50%;' +
                  '    width: 300px;' +
                  '    margin-left: -150px;' +
                  '  }' +
                  '</style>'
                 ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 15, 2015 12:34 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid settings are:
      • maxPicsBlock messages with more than x pictures.
      • maxSizeResize pictures in messages to x pixels wide.
      • maxTextBlock messages with more than x characters.
      • maxCapsWordsBlock messages with more than x uppercase words.
      • maxPosts
      • floodRange
           Flood detection: allow (maxPosts) identical messages per (floodRange) number of messages.
           Default allows 1 identical message per 10 messages
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.
  • Version 5.3: Automatic flood detection.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/chat.php
// @include     http://www.cumonprintedpics.com/index.php
// @version     5.3
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var cppConfig,
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {},
                stat_BlockedFlood = {};

            //Default config
            cppConfig = {
                maxPics: 3,
                maxSize: '640',
                maxText: 2200,
                maxCapsWords: 15,
                maxPosts: 1,
                floodRange: 10,
                banArray: []
            };

            var removeIdiots = function (posts) {
                var $node, profile, imageArray, textContent, capsWords, nextNodes, checkNodes;
                checkNodes = (parseInt(cppConfig.maxPosts) + 1 > cppConfig.floodRange && parseInt(
                        cppConfig.maxPosts)) ||
                    parseInt(cppConfig.floodRange) - 1;
                posts.not('.cppHidden').each(function () {
                    $node = e(this);
                    profile = $node.find('#profile a').text();
                    e.each(cppConfig.banArray, function (banKey, banValue) {
                        if (profile.toLowerCase() === banValue.toLowerCase()) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': cppConfig.maxSize + 'px',
                            'max-height': cppConfig.maxSize + 'px'
                        });
                    }
                    if (imageArray.length > cppConfig.maxPics) {
                        console.info(profile, 'blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    textContent = $node.find('div.content').text();
                    if (textContent.length > cppConfig.maxText) {
                        console.info(profile, 'blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > cppConfig.maxCapsWords) {
                        console.info(profile, 'blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    nextNodes = $node.nextAll().slice(0, checkNodes)
                        .filter(function () {
                            return e('div.content', this).text().toLowerCase().trim() ===
                                textContent.toLowerCase().trim() && e('#profile a', this).text()
                                .toLowerCase() === profile.toLowerCase();
                        });
                    if (nextNodes && nextNodes.length > parseInt(cppConfig.maxPosts) - 1) {
                        if (nextNodes.filter('.cppHidden').length < nextNodes.length) {
                            console.info(profile, 'blocked, flood:', nextNodes.length);
                            if (stat_BlockedFlood[profile] === undefined) {
                                stat_BlockedFlood[profile] = 1;
                            } else {
                                stat_BlockedFlood[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            nextNodes.addClass('cppHidden');
                        }
                    }
                });
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                stat_BlockedFlood = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                case 'maxpics':
                    cppConfig.maxPics = value;
                    alertify.log('maxPics set to ' + cppConfig.maxPics, 'success', 5000);
                    break;
                case 'maxsize':
                    cppConfig.maxSize = value;
                    alertify.log('maxSize set to ' + cppConfig.maxSize + 'px', 'success', 5000);
                    break;
                case 'maxtext':
                    cppConfig.maxText = value;
                    alertify.log('maxText set to ' + cppConfig.maxText + ' characters', 'success', 5000);
                    break;
                case 'maxcapswords':
                    cppConfig.maxCapsWords = value;
                    alertify.log('maxCapsWords set to ' + cppConfig.maxCapsWords, 'success', 5000);
                    break;
                case 'maxposts':
                    value = (value > 0 && value) || 1;
                    cppConfig.maxPosts = value;
                    alertify.log('maxPosts set to ' + cppConfig.maxPosts, 'success', 5000);
                    break;
                case 'floodrange':
                    value = (value > 3 && value) || 3;
                    cppConfig.floodRange = value;
                    alertify.log('floodRange set to ' + cppConfig.floodRange, 'success', 5000);
                    break;
                }
                localStorage.cppConfig = JSON.stringify(cppConfig);
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/i.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/i)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    param1 = input.match(/(\w+)/g)[1];
                    if (param1) {
                        param1 = param1.toLowerCase();
                    }
                    param2 = input.match(/(\w+)/g)[2];

                    switch (command) {
                    case 'ignore':
                        if (!param1) {
                            alertify.log('An username to ignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) > -1) {
                                alertify.log(param1 + ' is already ignored', '', 5000);
                            } else {
                                cppConfig.banArray.push(param1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' added to the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'unignore':
                        if (!param1) {
                            alertify.log('An username to unignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) === -1) {
                                alertify.log(param1 + ' is not ignored', '', 5000);
                            } else {
                                cppConfig.banArray.splice(cppConfig.banArray.indexOf(param1), 1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' removed from the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'listignored':
                        alertify.alert(
                            '<strong>Ignored users:</strong> <br><br>' + cppConfig.banArray.toString()
                            .replace(/,/g, ', ')
                        );
                        break;
                    case 'listsettings':
                        alertify.alert(
                            '<strong>Current settings:</strong> <br><br>' +
                            'maxPics = ' + cppConfig.maxPics +
                            '&nbsp;<em>pictures per message.</em><br>' +
                            'maxSize = ' + cppConfig.maxSize + '&nbsp;<em>pixels wide.</em><br>' +
                            'maxText = ' + cppConfig.maxText +
                            '&nbsp;<em>characters per message.</em><br>' +
                            'maxCapsWords = ' + cppConfig.maxCapsWords +
                            '&nbsp;<em>uppercase words per message.</em><br>' +
                            'maxPosts = ' + cppConfig.maxPosts + '<br>' +
                            'floodRange = ' + cppConfig.floodRange + '<br>' +
                            '&emsp;&emsp;<em>' + cppConfig.maxPosts + ' identical message per ' +
                            cppConfig.floodRange + ' messages allowed.</em>'
                        );
                        break;
                    case 'set':
                        if (/maxPics|maxSize|maxText|maxCapsWords|maxPosts|floodRange/i.test(param1)) {
                            if (!param2) {
                                alertify.log('A value must be provided.', 'error', 5000);
                            } else if (isNaN(param2)) {
                                alertify.log('The value must be a valid number.', 'error', 5000);
                            } else {
                                setParam(param1, param2);
                            }
                        } else {
                            alertify.log(
                                'Unknow setting. Valid settings are:<br>' +
                                '&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                '&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                '&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                '&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                '&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                '&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em>',
                                'error', 5000);
                        }
                        break;
                    case 'stats':
                        alertify.alert(
                            '<strong>Stats for session:</strong> <br><br>' +
                            '<strong>Total banned users:</strong>&emsp;' + cppConfig.banArray.length +
                            '<br>' +
                            '<strong>Messages blocked this session:</strong>&emsp;' +
                            stat_TotalBlocked +
                            '<br>' +
                            '<strong>Blocked users:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedUsers).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Blocked images:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedImages).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Flood:</strong>&emsp;' + JSON.stringify(stat_BlockedFlood).replace(
                                /\{|\}|\"/g, '').replace(/(\:|\,)/g, '$1 ') +
                            '<br>' +
                            '<strong>Wall of text:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedText).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Caps Lock Malfunction:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedCaps).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ')
                        );
                        break;
                    case 'help':
                        alertify.alert(
                            '<strong>List of valid commands:</strong> <br><br>' +
                            '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                            '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                            '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                            '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                            '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                            '&emsp;&emsp;Unknow setting. Valid settings are:<br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPosts</strong><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em><br>' +
                            '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                            '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                        );
                        break;
                    default:
                        alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            };

            var init = function () {
                // get config
                if (!localStorage.cppConfig) {
                    localStorage.cppConfig = JSON.stringify(cppConfig);
                }
                e.each(cppConfig, function (key) {
                    cppConfig[key] = (localStorage.cppConfig && JSON.parse(localStorage.cppConfig)[
                        key]) || cppConfig[key];
                });
                localStorage.cppConfig = JSON.stringify(cppConfig);

                // style
                e('<style type="text/css">' +
                    '  #chat .content img {' +
                    '    width:auto;' +
                    '    height:auto;' +
                    '    display:inline-block' +
                    '  }' +
                    '  .cppHidden {' +
                    '    display: none;' +
                    '  }' +
                    '  .shouts, .onlinelist {' +
                    '    height: 600px;' +
                    '  }' +
                    '  .alertify, .alertify-log {' +
                    '    font-size: 125%;' +
                    '  }' +
                    '  .alertify-logs {' +
                    '    position: fixed;' +
                    '    z-index: 5000;' +
                    '    top: 50px; left: 50%;' +
                    '    width: 550px;' +
                    '    margin-left: -275px;' +
                    '  }' +
                    '</style>'
                ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 15, 2015 3:00 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid settings are:
      • maxPicsBlock messages with more than x pictures.
      • maxSizeResize pictures in messages to x pixels wide.
      • maxTextBlock messages with more than x characters.
      • maxCapsWordsBlock messages with more than x uppercase words.
      • maxPosts
      • floodRange
           Flood detection: allow (maxPosts) identical messages per (floodRange) number of messages.
           Default allows 1 identical message per 10 messages
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.
  • Version 5.3: Automatic flood detection.
  • Version 5.4: Bugfix for usernames with symbols.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/chat.php*
// @include     http://www.cumonprintedpics.com/index.php*
// @version     5.4
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var cppConfig,
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {},
                stat_BlockedFlood = {};

            //Default config
            cppConfig = {
                maxPics: 3,
                maxSize: '640',
                maxText: 2200,
                maxCapsWords: 15,
                maxPosts: 1,
                floodRange: 10,
                banArray: []
            };

            var removeIdiots = function (posts) {
                var $node, profile, imageArray, textContent, capsWords, nextNodes, checkNodes;
                checkNodes = (parseInt(cppConfig.maxPosts) + 1 > cppConfig.floodRange && parseInt(
                    cppConfig.maxPosts)) ||
                    parseInt(cppConfig.floodRange) - 1;
                posts.not('.cppHidden').each(function () {
                    $node = e(this);
                    profile = $node.find('#profile a').text();
                    e.each(cppConfig.banArray, function (banKey, banValue) {
                        if (profile.toLowerCase() === banValue.toLowerCase()) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': cppConfig.maxSize + 'px',
                            'max-height': cppConfig.maxSize + 'px'
                        });
                    }
                    if (imageArray.length > cppConfig.maxPics) {
                        console.info(profile, 'blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    textContent = $node.find('div.content').text();
                    if (textContent.length > cppConfig.maxText) {
                        console.info(profile, 'blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > cppConfig.maxCapsWords) {
                        console.info(profile, 'blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    nextNodes = $node.nextAll().slice(0, checkNodes)
                    .filter(function () {
                        return e('div.content', this).text().toLowerCase().trim() ===
                            textContent.toLowerCase().trim() && e('#profile a', this).text()
                        .toLowerCase() === profile.toLowerCase();
                    });
                    if (nextNodes && nextNodes.length > parseInt(cppConfig.maxPosts) - 1) {
                        if (nextNodes.filter('.cppHidden').length < nextNodes.length) {
                            console.info(profile, 'blocked, flood:', nextNodes.length);
                            if (stat_BlockedFlood[profile] === undefined) {
                                stat_BlockedFlood[profile] = 1;
                            } else {
                                stat_BlockedFlood[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            nextNodes.addClass('cppHidden');
                        }
                    }
                });
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                stat_BlockedFlood = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                    case 'maxpics':
                        cppConfig.maxPics = value;
                        alertify.log('maxPics set to ' + cppConfig.maxPics, 'success', 5000);
                        break;
                    case 'maxsize':
                        cppConfig.maxSize = value;
                        alertify.log('maxSize set to ' + cppConfig.maxSize + 'px', 'success', 5000);
                        break;
                    case 'maxtext':
                        cppConfig.maxText = value;
                        alertify.log('maxText set to ' + cppConfig.maxText + ' characters', 'success', 5000);
                        break;
                    case 'maxcapswords':
                        cppConfig.maxCapsWords = value;
                        alertify.log('maxCapsWords set to ' + cppConfig.maxCapsWords, 'success', 5000);
                        break;
                    case 'maxposts':
                        value = (value > 0 && value) || 1;
                        cppConfig.maxPosts = value;
                        alertify.log('maxPosts set to ' + cppConfig.maxPosts, 'success', 5000);
                        break;
                    case 'floodrange':
                        value = (value > 3 && value) || 3;
                        cppConfig.floodRange = value;
                        alertify.log('floodRange set to ' + cppConfig.floodRange, 'success', 5000);
                        break;
                }
                localStorage.cppConfig = JSON.stringify(cppConfig);
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    if (command === 'set') {
                        param1 = (input.match(/^\s*\/\w+\s+(\w+)/) && input.match(/^\s*\/\w+\s+(\w+)/)[1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                        param2 = (input.match(/^\s*\/\w+\s+\w+\s+(\d+)/) && input.match(/^\s*\/\w+\s+\w+\s+(\d+)/)[1]);
                    } else {
                        param1 = (input.match(/^\s*\/\w+\s+(.+)/) && input.match(/^\s*\/\w+\s+(.+)/)[1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                    }

                    switch (command) {
                        case 'ignore':
                            if (!param1) {
                                alertify.log('An username to ignore is needed', 'error', 5000);
                            } else {
                                if (cppConfig.banArray.indexOf(param1) > -1) {
                                    alertify.log(param1 + ' is already ignored', '', 5000);
                                } else {
                                    cppConfig.banArray.push(param1);
                                    localStorage.cppConfig = JSON.stringify(cppConfig);
                                    reloadParams();
                                    alertify.log(param1 + ' added to the ignore list', 'success', 5000);
                                }
                            }
                            break;
                        case 'unignore':
                            if (!param1) {
                                alertify.log('An username to unignore is needed', 'error', 5000);
                            } else {
                                if (cppConfig.banArray.indexOf(param1) === -1) {
                                    alertify.log(param1 + ' is not ignored', '', 5000);
                                } else {
                                    cppConfig.banArray.splice(cppConfig.banArray.indexOf(param1), 1);
                                    localStorage.cppConfig = JSON.stringify(cppConfig);
                                    reloadParams();
                                    alertify.log(param1 + ' removed from the ignore list', 'success', 5000);
                                }
                            }
                            break;
                        case 'listignored':
                            alertify.alert(
                                '<strong>Ignored users:</strong> <br><br>' + cppConfig.banArray.toString()
                                .replace(/,/g, ', ')
                            );
                            break;
                        case 'listsettings':
                            alertify.alert(
                                '<strong>Current settings:</strong> <br><br>' +
                                'maxPics = ' + cppConfig.maxPics +
                                '&nbsp;<em>pictures per message.</em><br>' +
                                'maxSize = ' + cppConfig.maxSize + '&nbsp;<em>pixels wide.</em><br>' +
                                'maxText = ' + cppConfig.maxText +
                                '&nbsp;<em>characters per message.</em><br>' +
                                'maxCapsWords = ' + cppConfig.maxCapsWords +
                                '&nbsp;<em>uppercase words per message.</em><br>' +
                                'maxPosts = ' + cppConfig.maxPosts + '<br>' +
                                'floodRange = ' + cppConfig.floodRange + '<br>' +
                                '&emsp;&emsp;<em>' + cppConfig.maxPosts + ' identical message per ' +
                                cppConfig.floodRange + ' messages allowed.</em>'
                            );
                            break;
                        case 'set':
                            if (/maxPics|maxSize|maxText|maxCapsWords|maxPosts|floodRange/i.test(param1)) {
                                if (!param2) {
                                    alertify.log('A value must be provided.', 'error', 5000);
                                } else if (isNaN(param2)) {
                                    alertify.log('The value must be a valid number.', 'error', 5000);
                                } else {
                                    setParam(param1, param2);
                                }
                            } else {
                                alertify.log(
                                    'Unknow setting. Valid settings are:<br>' +
                                    '&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                    '&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                    '&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                    '&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                    '&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                    '&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                    '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                    '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em>',
                                    'error', 5000);
                            }
                            break;
                        case 'stats':
                            alertify.alert(
                                '<strong>Stats for session:</strong> <br><br>' +
                                '<strong>Total banned users:</strong>&emsp;' + cppConfig.banArray.length +
                                '<br>' +
                                '<strong>Messages blocked this session:</strong>&emsp;' +
                                stat_TotalBlocked +
                                '<br>' +
                                '<strong>Blocked users:</strong>&emsp;' + JSON.stringify(
                                    stat_BlockedUsers).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                                                                        '$1 ') +
                                '<br>' +
                                '<strong>Blocked images:</strong>&emsp;' + JSON.stringify(
                                    stat_BlockedImages).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                                                                         '$1 ') +
                                '<br>' +
                                '<strong>Flood:</strong>&emsp;' + JSON.stringify(stat_BlockedFlood).replace(
                                    /\{|\}|\"/g, '').replace(/(\:|\,)/g, '$1 ') +
                                '<br>' +
                                '<strong>Wall of text:</strong>&emsp;' + JSON.stringify(
                                    stat_BlockedText).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                                                                       '$1 ') +
                                '<br>' +
                                '<strong>Caps Lock Malfunction:</strong>&emsp;' + JSON.stringify(
                                    stat_BlockedCaps).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                                                                       '$1 ')
                            );
                            break;
                        case 'help':
                            alertify.alert(
                                '<strong>List of valid commands:</strong> <br><br>' +
                                '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                                '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                                '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                                '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                                '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                                '&emsp;&emsp;Unknow setting. Valid settings are:<br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                '&emsp;&emsp;&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em><br>' +
                                '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                                '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                            );
                            break;
                        default:
                            alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            };

            var init = function () {
                // get config
                if (!localStorage.cppConfig) {
                    localStorage.cppConfig = JSON.stringify(cppConfig);
                }
                e.each(cppConfig, function (key) {
                    cppConfig[key] = (localStorage.cppConfig && JSON.parse(localStorage.cppConfig)[
                        key]) || cppConfig[key];
                });
                localStorage.cppConfig = JSON.stringify(cppConfig);

                // style
                e('<style type="text/css">' +
                  '  #chat .content img {' +
                  '    width:auto;' +
                  '    height:auto;' +
                  '    display:inline-block' +
                  '  }' +
                  '  .cppHidden {' +
                  '    display: none;' +
                  '  }' +
                  '  .shouts, .onlinelist {' +
                  '    height: 600px;' +
                  '  }' +
                  '  .alertify, .alertify-log {' +
                  '    font-size: 125%;' +
                  '  }' +
                  '  .alertify-logs {' +
                  '    position: fixed;' +
                  '    z-index: 5000;' +
                  '    top: 50px; left: 50%;' +
                  '    width: 550px;' +
                  '    margin-left: -275px;' +
                  '  }' +
                  '</style>'
                 ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 15, 2015 10:31 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid settings are:
      • maxPicsBlock messages with more than x pictures.
      • maxSizeResize pictures in messages to x pixels wide.
      • maxTextBlock messages with more than x characters.
      • maxCapsWordsBlock messages with more than x uppercase words.
      • maxPosts
      • floodRange
           Flood detection: allow (maxPosts) identical messages per (floodRange) number of messages.
           Default allows 1 identical message per 10 messages
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.
  • Version 5.3: Automatic flood detection.
  • Version 5.4: Bugfix for usernames with symbols.
  • Version 5.5: Cosmetic enhancements.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/chat.php*
// @include     http://www.cumonprintedpics.com/index.php*
// @version     5.5
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var cppConfig,
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {},
                stat_BlockedFlood = {};

            //Default config
            cppConfig = {
                maxPics: 3,
                maxSize: '640',
                maxText: 2200,
                maxCapsWords: 15,
                maxPosts: 1,
                floodRange: 10,
                banArray: []
            };

            var removeIdiots = function (posts) {
                var $node, profile, imageArray, textContent, capsWords, nextNodes, checkNodes;
                checkNodes = (parseInt(cppConfig.maxPosts) + 1 > cppConfig.floodRange && parseInt(
                        cppConfig.maxPosts)) ||
                    parseInt(cppConfig.floodRange) - 1;
                posts.not('.cppHidden').each(function () {
                    $node = e(this);
                    profile = $node.find('#profile a').text();
                    e.each(cppConfig.banArray, function (banKey, banValue) {
                        if (profile.toLowerCase() === banValue.toLowerCase()) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': cppConfig.maxSize + 'px',
                            'max-height': cppConfig.maxSize + 'px'
                        });
                    }
                    if (imageArray.length > cppConfig.maxPics) {
                        console.info(profile, 'blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    $node.find('div.content span[style*="font-size"]').filter(function (index) {
                        var fontsize = e(this).attr('style').match(
                            /font-size:\s*(\d+)%/);
                        if (fontsize) {
                            return Number(e(this).attr('style').match(
                                /font-size:\s*(\d+)%/)[1]) > 100;
                        }
                    }).contents().unwrap();
                    textContent = $node.find('div.content').text();
                    if (textContent.length > cppConfig.maxText) {
                        console.info(profile, 'blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > cppConfig.maxCapsWords) {
                        console.info(profile, 'blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    nextNodes = $node.nextAll().slice(0, checkNodes)
                        .filter(function () {
                            return e('div.content', this).text().toLowerCase().trim() ===
                                textContent.toLowerCase().trim() && e('#profile a', this).text()
                                .toLowerCase() === profile.toLowerCase();
                        });
                    if (nextNodes && nextNodes.length > parseInt(cppConfig.maxPosts) - 1) {
                        if (nextNodes.filter('.cppHidden').length < nextNodes.length) {
                            console.info(profile, 'blocked, flood:', nextNodes.length);
                            if (stat_BlockedFlood[profile] === undefined) {
                                stat_BlockedFlood[profile] = 1;
                            } else {
                                stat_BlockedFlood[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            nextNodes.addClass('cppHidden');
                        }
                    }
                });
                posts.removeClass('bg1 bg2');
                posts.not('.cppHidden').filter(':odd').addClass('bg1');
                posts.not('.cppHidden').filter(':even').addClass('bg2');
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                stat_BlockedFlood = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                case 'maxpics':
                    cppConfig.maxPics = value;
                    alertify.log('maxPics set to ' + cppConfig.maxPics, 'success', 5000);
                    break;
                case 'maxsize':
                    cppConfig.maxSize = value;
                    alertify.log('maxSize set to ' + cppConfig.maxSize + 'px', 'success', 5000);
                    break;
                case 'maxtext':
                    cppConfig.maxText = value;
                    alertify.log('maxText set to ' + cppConfig.maxText + ' characters', 'success', 5000);
                    break;
                case 'maxcapswords':
                    cppConfig.maxCapsWords = value;
                    alertify.log('maxCapsWords set to ' + cppConfig.maxCapsWords, 'success', 5000);
                    break;
                case 'maxposts':
                    value = (value > 0 && value) || 1;
                    cppConfig.maxPosts = value;
                    alertify.log('maxPosts set to ' + cppConfig.maxPosts, 'success', 5000);
                    break;
                case 'floodrange':
                    value = (value > 3 && value) || 3;
                    cppConfig.floodRange = value;
                    alertify.log('floodRange set to ' + cppConfig.floodRange, 'success', 5000);
                    break;
                }
                localStorage.cppConfig = JSON.stringify(cppConfig);
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    if (command === 'set') {
                        param1 = (input.match(/^\s*\/\w+\s+(\w+)/) && input.match(/^\s*\/\w+\s+(\w+)/)[
                            1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                        param2 = (input.match(/^\s*\/\w+\s+\w+\s+(\d+)/) && input.match(
                            /^\s*\/\w+\s+\w+\s+(\d+)/)[1]);
                    } else {
                        param1 = (input.match(/^\s*\/\w+\s+(.+)/) && input.match(/^\s*\/\w+\s+(.+)/)[1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                    }

                    switch (command) {
                    case 'ignore':
                        if (!param1) {
                            alertify.log('An username to ignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) > -1) {
                                alertify.log(param1 + ' is already ignored', '', 5000);
                            } else {
                                cppConfig.banArray.push(param1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' added to the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'unignore':
                        if (!param1) {
                            alertify.log('An username to unignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) === -1) {
                                alertify.log(param1 + ' is not ignored', '', 5000);
                            } else {
                                cppConfig.banArray.splice(cppConfig.banArray.indexOf(param1), 1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' removed from the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'listignored':
                        alertify.alert(
                            '<strong>Ignored users:</strong> <br><br>' + cppConfig.banArray.toString()
                            .replace(/,/g, ', ')
                        );
                        break;
                    case 'listsettings':
                        alertify.alert(
                            '<strong>Current settings:</strong> <br><br>' +
                            'maxPics = ' + cppConfig.maxPics +
                            '&nbsp;<em>pictures per message.</em><br>' +
                            'maxSize = ' + cppConfig.maxSize + '&nbsp;<em>pixels wide.</em><br>' +
                            'maxText = ' + cppConfig.maxText +
                            '&nbsp;<em>characters per message.</em><br>' +
                            'maxCapsWords = ' + cppConfig.maxCapsWords +
                            '&nbsp;<em>uppercase words per message.</em><br>' +
                            'maxPosts = ' + cppConfig.maxPosts + '<br>' +
                            'floodRange = ' + cppConfig.floodRange + '<br>' +
                            '&emsp;&emsp;<em>' + cppConfig.maxPosts + ' identical message per ' +
                            cppConfig.floodRange + ' messages allowed.</em>'
                        );
                        break;
                    case 'set':
                        if (/maxPics|maxSize|maxText|maxCapsWords|maxPosts|floodRange/i.test(param1)) {
                            if (!param2) {
                                alertify.log('A value must be provided.', 'error', 5000);
                            } else if (isNaN(param2)) {
                                alertify.log('The value must be a valid number.', 'error', 5000);
                            } else {
                                setParam(param1, param2);
                            }
                        } else {
                            alertify.log(
                                'Unknow setting. Valid settings are:<br>' +
                                '&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                '&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                '&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                '&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                '&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                '&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em>',
                                'error', 5000);
                        }
                        break;
                    case 'stats':
                        alertify.alert(
                            '<strong>Stats for session:</strong> <br><br>' +
                            '<strong>Total banned users:</strong>&emsp;' + cppConfig.banArray.length +
                            '<br>' +
                            '<strong>Messages blocked this session:</strong>&emsp;' +
                            stat_TotalBlocked +
                            '<br>' +
                            '<strong>Blocked users:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedUsers).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Blocked images:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedImages).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Flood:</strong>&emsp;' + JSON.stringify(stat_BlockedFlood).replace(
                                /\{|\}|\"/g, '').replace(/(\:|\,)/g, '$1 ') +
                            '<br>' +
                            '<strong>Wall of text:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedText).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Caps Lock Malfunction:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedCaps).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ')
                        );
                        break;
                    case 'help':
                        alertify.alert(
                            '<strong>List of valid commands:</strong> <br><br>' +
                            '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                            '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                            '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                            '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                            '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                            '&emsp;&emsp;Unknow setting. Valid settings are:<br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPosts</strong><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em><br>' +
                            '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                            '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                        );
                        break;
                    default:
                        alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            };

            var init = function () {
                // get config
                if (!localStorage.cppConfig) {
                    localStorage.cppConfig = JSON.stringify(cppConfig);
                }
                e.each(cppConfig, function (key) {
                    cppConfig[key] = (localStorage.cppConfig && JSON.parse(localStorage.cppConfig)[
                        key]) || cppConfig[key];
                });
                localStorage.cppConfig = JSON.stringify(cppConfig);

                // style
                e('<style type="text/css">' +
                    '  #chat .content img {' +
                    '    width:auto;' +
                    '    height:auto;' +
                    '    display:inline-block' +
                    '  }' +
                    '  .cppHidden {' +
                    '    display: none;' +
                    '  }' +
                    '  .shouts, .onlinelist {' +
                    '    height: 600px;' +
                    '  }' +
                    '  .alertify, .alertify-log {' +
                    '    font-size: 125%;' +
                    '  }' +
                    '  .alertify-logs {' +
                    '    position: fixed;' +
                    '    z-index: 5000;' +
                    '    top: 50px; left: 50%;' +
                    '    width: 550px;' +
                    '    margin-left: -275px;' +
                    '  }' +
                    '</style>'
                ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Thu Apr 16, 2015 6:15 am

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid settings are:
      • maxPicsBlock messages with more than x pictures.
      • maxSizeResize pictures in messages to x pixels wide.
      • maxTextBlock messages with more than x characters.
      • maxCapsWordsBlock messages with more than x uppercase words.
      • maxPosts
      • floodRange
           Flood detection: allow (maxPosts) identical messages per (floodRange) number of messages.
           Default allows 1 identical message per 10 messages
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.
  • Version 5.3: Automatic flood detection.
  • Version 5.4: Bugfix for usernames with symbols.
  • Version 5.5: Cosmetic enhancements.
  • Version 5.6: Final fixes.

Installation
You need:

Then you create a new script or replace the previous version and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @version     5.6
// @include     http://www.cumonprintedpics.com/chat.php*
// @include     http://www.cumonprintedpics.com/index.php*
// @author      bnl
// @license     WTFPL 2.0
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var cppConfig,
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {},
                stat_BlockedFlood = {};

            //Default config
            cppConfig = {
                maxPics: 3,
                maxSize: '640',
                maxText: 2200,
                maxCapsWords: 15,
                maxPosts: 1,
                floodRange: 10,
                banArray: []
            };

            var removeIdiots = function (posts) {
                var $node, profile, imageArray, textContent, capsWords, nextNodes, checkNodes;
                checkNodes = (parseInt(cppConfig.maxPosts) + 1 > cppConfig.floodRange && parseInt(
                        cppConfig.maxPosts)) ||
                    parseInt(cppConfig.floodRange) - 1;
                posts.not('.cppHidden').each(function () {
                    $node = e(this);
                    profile = $node.find('#profile a').text();
                    e.each(cppConfig.banArray, function (banKey, banValue) {
                        if (profile.toLowerCase() === banValue.toLowerCase()) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': cppConfig.maxSize + 'px',
                            'max-height': cppConfig.maxSize + 'px'
                        });
                    }
                    if (imageArray.length > cppConfig.maxPics) {
                        console.info(profile, 'blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    $node.find('div.content span[style*="font-size"]').filter(function (index) {
                        var fontsize = e(this).attr('style').match(
                            /font-size:\s*(\d+)%/);
                        if (fontsize) {
                            return Number(e(this).attr('style').match(
                                /font-size:\s*(\d+)%/)[1]) > 100;
                        }
                    }).contents().unwrap();
                    textContent = $node.find('div.content').text();
                    if (textContent.length > cppConfig.maxText) {
                        console.info(profile, 'blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > cppConfig.maxCapsWords) {
                        console.info(profile, 'blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    nextNodes = $node.prevAll().slice(0, checkNodes)
                        .filter(function () {
                            return e('div.content', this).text().toLowerCase().trim() ===
                                textContent.toLowerCase().trim() && e('#profile a', this).text()
                                .toLowerCase() === profile.toLowerCase();
                        });
                    if (nextNodes && nextNodes.length > parseInt(cppConfig.maxPosts) - 1) {
                        if (nextNodes.filter('.cppHidden').length < nextNodes.length) {
                            console.info(profile, 'blocked, flood:', nextNodes.length);
                            if (stat_BlockedFlood[profile] === undefined) {
                                stat_BlockedFlood[profile] = 1;
                            } else {
                                stat_BlockedFlood[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            nextNodes.addClass('cppHidden');
                        }
                    }
                });
                posts.removeClass('bg1 bg2');
                posts.not('.cppHidden').filter(':odd').addClass('bg1');
                posts.not('.cppHidden').filter(':even').addClass('bg2');
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                stat_BlockedFlood = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                case 'maxpics':
                    cppConfig.maxPics = value;
                    alertify.log('maxPics set to ' + cppConfig.maxPics, 'success', 5000);
                    break;
                case 'maxsize':
                    cppConfig.maxSize = value;
                    alertify.log('maxSize set to ' + cppConfig.maxSize + 'px', 'success', 5000);
                    break;
                case 'maxtext':
                    cppConfig.maxText = value;
                    alertify.log('maxText set to ' + cppConfig.maxText + ' characters', 'success', 5000);
                    break;
                case 'maxcapswords':
                    cppConfig.maxCapsWords = value;
                    alertify.log('maxCapsWords set to ' + cppConfig.maxCapsWords, 'success', 5000);
                    break;
                case 'maxposts':
                    value = (value > 0 && value) || 1;
                    cppConfig.maxPosts = value;
                    alertify.log('maxPosts set to ' + cppConfig.maxPosts, 'success', 5000);
                    break;
                case 'floodrange':
                    value = (value > 3 && value) || 3;
                    cppConfig.floodRange = value;
                    alertify.log('floodRange set to ' + cppConfig.floodRange, 'success', 5000);
                    break;
                }
                localStorage.cppConfig = JSON.stringify(cppConfig);
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    if (command === 'set') {
                        param1 = (input.match(/^\s*\/\w+\s+(\w+)/) && input.match(/^\s*\/\w+\s+(\w+)/)[
                            1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                        param2 = (input.match(/^\s*\/\w+\s+\w+\s+(\d+)/) && input.match(
                            /^\s*\/\w+\s+\w+\s+(\d+)/)[1]);
                    } else {
                        param1 = (input.match(/^\s*\/\w+\s+(.+)/) && input.match(/^\s*\/\w+\s+(.+)/)[1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                    }

                    switch (command) {
                    case 'ignore':
                        if (!param1) {
                            alertify.log('An username to ignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) > -1) {
                                alertify.log(param1 + ' is already ignored', '', 5000);
                            } else {
                                cppConfig.banArray.push(param1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' added to the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'unignore':
                        if (!param1) {
                            alertify.log('An username to unignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) === -1) {
                                alertify.log(param1 + ' is not ignored', '', 5000);
                            } else {
                                cppConfig.banArray.splice(cppConfig.banArray.indexOf(param1), 1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' removed from the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'listignored':
                        alertify.alert(
                            '<strong>Ignored users:</strong> <br><br>' + cppConfig.banArray.toString()
                            .replace(/,/g, ', ')
                        );
                        break;
                    case 'listsettings':
                        alertify.alert(
                            '<strong>Current settings:</strong> <br><br>' +
                            'maxPics = ' + cppConfig.maxPics +
                            '&nbsp;<em>pictures per message.</em><br>' +
                            'maxSize = ' + cppConfig.maxSize + '&nbsp;<em>pixels wide.</em><br>' +
                            'maxText = ' + cppConfig.maxText +
                            '&nbsp;<em>characters per message.</em><br>' +
                            'maxCapsWords = ' + cppConfig.maxCapsWords +
                            '&nbsp;<em>uppercase words per message.</em><br>' +
                            'maxPosts = ' + cppConfig.maxPosts + '<br>' +
                            'floodRange = ' + cppConfig.floodRange + '<br>' +
                            '&emsp;&emsp;<em>' + cppConfig.maxPosts + ' identical message per ' +
                            cppConfig.floodRange + ' messages allowed.</em>'
                        );
                        break;
                    case 'set':
                        if (/maxPics|maxSize|maxText|maxCapsWords|maxPosts|floodRange/i.test(param1)) {
                            if (!param2) {
                                alertify.log('A value must be provided.', 'error', 5000);
                            } else if (isNaN(param2)) {
                                alertify.log('The value must be a valid number.', 'error', 5000);
                            } else {
                                setParam(param1, param2);
                            }
                        } else {
                            alertify.log(
                                'Unknow setting. Valid settings are:<br>' +
                                '&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                '&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                '&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                '&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                '&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                '&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em>',
                                'error', 5000);
                        }
                        break;
                    case 'stats':
                        alertify.alert(
                            '<strong>Stats for session:</strong> <br><br>' +
                            '<strong>Total banned users:</strong>&emsp;' + cppConfig.banArray.length +
                            '<br>' +
                            '<strong>Messages blocked this session:</strong>&emsp;' +
                            stat_TotalBlocked +
                            '<br>' +
                            '<strong>Blocked users:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedUsers).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Blocked images:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedImages).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Flood:</strong>&emsp;' + JSON.stringify(stat_BlockedFlood).replace(
                                /\{|\}|\"/g, '').replace(/(\:|\,)/g, '$1 ') +
                            '<br>' +
                            '<strong>Wall of text:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedText).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Caps Lock Malfunction:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedCaps).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ')
                        );
                        break;
                    case 'help':
                        alertify.alert(
                            '<strong>List of valid commands:</strong> <br><br>' +
                            '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                            '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                            '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                            '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                            '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                            '&emsp;&emsp;Valid settings are:<br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPosts</strong><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em><br>' +
                            '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                            '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                        );
                        break;
                    default:
                        alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            };

            var init = function () {
                // get config
                if (!localStorage.cppConfig) {
                    localStorage.cppConfig = JSON.stringify(cppConfig);
                }
                e.each(cppConfig, function (key) {
                    cppConfig[key] = (localStorage.cppConfig && JSON.parse(localStorage.cppConfig)[
                        key]) || cppConfig[key];
                });
                localStorage.cppConfig = JSON.stringify(cppConfig);

                // style
                e('<style type="text/css">' +
                    '  #chat .content img {' +
                    '    width:auto;' +
                    '    height:auto;' +
                    '    display:inline-block' +
                    '  }' +
                    '  .cppHidden {' +
                    '    display: none;' +
                    '  }' +
                    '  .shouts, .onlinelist {' +
                    '    height: 600px;' +
                    '  }' +
                    '  .alertify, .alertify-log {' +
                    '    font-size: 125%;' +
                    '  }' +
                    '  .alertify-logs {' +
                    '    position: fixed;' +
                    '    z-index: 5000;' +
                    '    top: 50px; left: 50%;' +
                    '    width: 550px;' +
                    '    margin-left: -275px;' +
                    '  }' +
                    '</style>'
                ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Mon Apr 20, 2015 8:51 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

Update version 6: Now with extra lube
Image
Image
Image

Installation
You need:

Then you create a new script or replace the previous version and copy-paste the code available on this page:
http://pastebin.com/rXzt6QxR
(Tips: you can click "Use Script from Clipboard" in Firefox's Greasemonkey):
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Mon Apr 20, 2015 9:43 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.
  • Update version 6: Now with extra lube
    Image
    Image
    Image

    • 6.0.1: fixing some colour issues.

Installation
You need:

Then you create a new script or replace the previous version and copy-paste the code available on this page:
http://pastebin.com/Xb502jAQ
(Tips: you can click "Use Script from Clipboard" in Firefox's Greasemonkey)
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 22, 2015 4:37 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.
  • Update version 6: Now with extra lube
    Image
    Image
    Image

    • 6.0.1: fixing some colour issues.
  • 6.1:Bugfix + smileys support

Installation
You need:

Then you create a new script or replace the previous version and copy-paste the code available on this page:
http://pastebin.com/rDKx5Jfu
(Tips: you can click "Use Script from Clipboard" in Firefox's Greasemonkey)
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 22, 2015 6:27 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

Then you create a new script or replace the previous version and copy-paste the code available on this page:
http://pastebin.com/TByDDRWf
(Tips: you can click "Use Script from Clipboard" in Firefox's Greasemonkey)
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Wed Apr 22, 2015 8:04 pm

bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Fri Apr 24, 2015 9:19 pm

I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.
  • Update version 6: Now with extra lube
    Image
    Image
    Image

    • 6.0.1: fixing some colour issues.
  • 6.1:Bugfix + smileys support
    • 6.1.1: stupid bugfix.
    • 6.1.2: another bugfix

Installation
You need:

Then you create a new script or replace the previous version and copy-paste the code available on this page:
http://pastebin.com/JFTNjN0w
(Tips: you can click "Use Script from Clipboard" in Firefox's Greasemonkey)
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby jaeger014 » Tue Aug 25, 2015 9:13 pm

Does this work on a mobile device?
jaeger014
Respected Member
Respected Member
 
Posts: 870
Joined: Fri Feb 13, 2015 2:21 pm
Karma: 108

Re: HOWTO: Blocking chat spammers

Unread postby moriarty » Thu Aug 27, 2015 7:33 am

+2 karma for you, sir.
Image
User avatar
moriarty
Respected Member
Respected Member
 
Posts: 79
Joined: Tue Aug 10, 2010 1:03 pm
Karma: 13

Re: HOWTO: Blocking chat spammers

Unread postby bnl » Sat Sep 12, 2015 12:29 pm

Guys there's a thread for the latest version here: viewtopic.php?f=6&t=144214
bnl
Normal Poster
 
Posts: 74
Joined: Wed Aug 21, 2013 3:10 am
Karma: 67

Re: HOWTO: Blocking chat spammers

Unread postby Vinnymike » Wed Apr 13, 2016 8:02 pm

bnl wrote:I made a script to block assholes on the chat. It allows blocking some usernames and people who post too many pics at once.

  • Version 3: updated to block wall of text.
  • Version 4.1: updated for Chrome.
  • Version 4.2:
    • Now blocks message with TOO MANY CAPS
    • Code cleanup
  • Version 5:
    You can now use commands in the chat bar:
    • /ignore usernameIgnore username
    • /unignore usernameUnignore username
    • /listignoredDisplay the list of ignored users
    • /listsettingsDisplay automatic ignore settings
    • /set setting valueChange the value of a setting.
        Valid settings are:
      • maxPicsBlock messages with more than x pictures.
      • maxSizeResize pictures in messages to x pixels wide.
      • maxTextBlock messages with more than x characters.
      • maxCapsWordsBlock messages with more than x uppercase words.
      • maxPosts
      • floodRange
           Flood detection: allow (maxPosts) identical messages per (floodRange) number of messages.
           Default allows 1 identical message per 10 messages
    • /statsDisplay statistics about ignored users for this session.
    • /helpDisplay this help message.
  • Version 5.1: Bugfix for stats.
  • Version 5.2: Bugfix for image resizing.
  • Version 5.3: Automatic flood detection.
  • Version 5.4: Bugfix for usernames with symbols.
  • Version 5.5: Cosmetic enhancements.

Installation
You need:

Then you create a new script and copy-paste the following code (you can click "Use Script from Clipboard" in Firefox):

Code: Select all
// ==UserScript==
// @name        cppBan
// @namespace   cppBan
// @include     http://www.cumonprintedpics.com/chat.php*
// @include     http://www.cumonprintedpics.com/index.php*
// @version     5.5
// @grant       none
// ==/UserScript==
(function () {
    function initcppBan() {
        var e = window.jQuery;
        (window.cppBan = function () {
            var cppConfig,
                stat_TotalBlocked = 0,
                stat_BlockedUsers = {},
                stat_BlockedImages = {},
                stat_BlockedText = {},
                stat_BlockedCaps = {},
                stat_BlockedFlood = {};

            //Default config
            cppConfig = {
                maxPics: 3,
                maxSize: '640',
                maxText: 2200,
                maxCapsWords: 15,
                maxPosts: 1,
                floodRange: 10,
                banArray: []
            };

            var removeIdiots = function (posts) {
                var $node, profile, imageArray, textContent, capsWords, nextNodes, checkNodes;
                checkNodes = (parseInt(cppConfig.maxPosts) + 1 > cppConfig.floodRange && parseInt(
                        cppConfig.maxPosts)) ||
                    parseInt(cppConfig.floodRange) - 1;
                posts.not('.cppHidden').each(function () {
                    $node = e(this);
                    profile = $node.find('#profile a').text();
                    e.each(cppConfig.banArray, function (banKey, banValue) {
                        if (profile.toLowerCase() === banValue.toLowerCase()) {
                            console.info('Blocked, user:', profile);
                            if (stat_BlockedUsers[profile] === undefined) {
                                stat_BlockedUsers[profile] = 1;
                            } else {
                                stat_BlockedUsers[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            $node.addClass('cppHidden');
                        }
                    });
                    imageArray = $node.find('img').not(
                        'img[src^=\'./images/smilies/\']'
                    );
                    if (imageArray.length) {
                        imageArray.css({
                            'max-width': cppConfig.maxSize + 'px',
                            'max-height': cppConfig.maxSize + 'px'
                        });
                    }
                    if (imageArray.length > cppConfig.maxPics) {
                        console.info(profile, 'blocked, too many images:', imageArray.length);
                        if (stat_BlockedImages[profile] === undefined) {
                            stat_BlockedImages[profile] = 1;
                        } else {
                            stat_BlockedImages[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    $node.find('div.content span[style*="font-size"]').filter(function (index) {
                        var fontsize = e(this).attr('style').match(
                            /font-size:\s*(\d+)%/);
                        if (fontsize) {
                            return Number(e(this).attr('style').match(
                                /font-size:\s*(\d+)%/)[1]) > 100;
                        }
                    }).contents().unwrap();
                    textContent = $node.find('div.content').text();
                    if (textContent.length > cppConfig.maxText) {
                        console.info(profile, 'blocked, too much text:', textContent.length);
                        if (stat_BlockedText[profile] === undefined) {
                            stat_BlockedText[profile] = 1;
                        } else {
                            stat_BlockedText[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    capsWords = textContent.match(/([A-Z']+)/g);
                    if (capsWords && capsWords.length > cppConfig.maxCapsWords) {
                        console.info(profile, 'blocked, too much caps:', capsWords.length);
                        if (stat_BlockedCaps[profile] === undefined) {
                            stat_BlockedCaps[profile] = 1;
                        } else {
                            stat_BlockedCaps[profile] += 1;
                        }
                        stat_TotalBlocked += 1;
                        $node.addClass('cppHidden');
                    }
                    nextNodes = $node.nextAll().slice(0, checkNodes)
                        .filter(function () {
                            return e('div.content', this).text().toLowerCase().trim() ===
                                textContent.toLowerCase().trim() && e('#profile a', this).text()
                                .toLowerCase() === profile.toLowerCase();
                        });
                    if (nextNodes && nextNodes.length > parseInt(cppConfig.maxPosts) - 1) {
                        if (nextNodes.filter('.cppHidden').length < nextNodes.length) {
                            console.info(profile, 'blocked, flood:', nextNodes.length);
                            if (stat_BlockedFlood[profile] === undefined) {
                                stat_BlockedFlood[profile] = 1;
                            } else {
                                stat_BlockedFlood[profile] += 1;
                            }
                            stat_TotalBlocked += 1;
                            nextNodes.addClass('cppHidden');
                        }
                    }
                });
                posts.removeClass('bg1 bg2');
                posts.not('.cppHidden').filter(':odd').addClass('bg1');
                posts.not('.cppHidden').filter(':even').addClass('bg2');
            };

            var reloadParams = function () {
                stat_TotalBlocked = 0;
                stat_BlockedUsers = {};
                stat_BlockedImages = {};
                stat_BlockedText = {};
                stat_BlockedCaps = {};
                stat_BlockedFlood = {};
                e('.cppHidden').removeClass('cppHidden');
                removeIdiots(e('div#chat > div.post'));
            };

            var setParam = function (param, value) {
                switch (param) {
                case 'maxpics':
                    cppConfig.maxPics = value;
                    alertify.log('maxPics set to ' + cppConfig.maxPics, 'success', 5000);
                    break;
                case 'maxsize':
                    cppConfig.maxSize = value;
                    alertify.log('maxSize set to ' + cppConfig.maxSize + 'px', 'success', 5000);
                    break;
                case 'maxtext':
                    cppConfig.maxText = value;
                    alertify.log('maxText set to ' + cppConfig.maxText + ' characters', 'success', 5000);
                    break;
                case 'maxcapswords':
                    cppConfig.maxCapsWords = value;
                    alertify.log('maxCapsWords set to ' + cppConfig.maxCapsWords, 'success', 5000);
                    break;
                case 'maxposts':
                    value = (value > 0 && value) || 1;
                    cppConfig.maxPosts = value;
                    alertify.log('maxPosts set to ' + cppConfig.maxPosts, 'success', 5000);
                    break;
                case 'floodrange':
                    value = (value > 3 && value) || 3;
                    cppConfig.floodRange = value;
                    alertify.log('floodRange set to ' + cppConfig.floodRange, 'success', 5000);
                    break;
                }
                localStorage.cppConfig = JSON.stringify(cppConfig);
                reloadParams();
            };

            var parseCommand = function () {
                var input = e('input#message').prop('value');
                if (/^\s*\/\w+/.test(input)) {
                    var command, param1, param2;
                    command = input.match(/^\s*\/(\w+)/)[1];
                    if (command) {
                        command = command.toLowerCase();
                    }
                    if (command === 'set') {
                        param1 = (input.match(/^\s*\/\w+\s+(\w+)/) && input.match(/^\s*\/\w+\s+(\w+)/)[
                            1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                        param2 = (input.match(/^\s*\/\w+\s+\w+\s+(\d+)/) && input.match(
                            /^\s*\/\w+\s+\w+\s+(\d+)/)[1]);
                    } else {
                        param1 = (input.match(/^\s*\/\w+\s+(.+)/) && input.match(/^\s*\/\w+\s+(.+)/)[1]);
                        if (param1) {
                            param1 = param1.toLowerCase();
                        }
                    }

                    switch (command) {
                    case 'ignore':
                        if (!param1) {
                            alertify.log('An username to ignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) > -1) {
                                alertify.log(param1 + ' is already ignored', '', 5000);
                            } else {
                                cppConfig.banArray.push(param1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' added to the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'unignore':
                        if (!param1) {
                            alertify.log('An username to unignore is needed', 'error', 5000);
                        } else {
                            if (cppConfig.banArray.indexOf(param1) === -1) {
                                alertify.log(param1 + ' is not ignored', '', 5000);
                            } else {
                                cppConfig.banArray.splice(cppConfig.banArray.indexOf(param1), 1);
                                localStorage.cppConfig = JSON.stringify(cppConfig);
                                reloadParams();
                                alertify.log(param1 + ' removed from the ignore list', 'success', 5000);
                            }
                        }
                        break;
                    case 'listignored':
                        alertify.alert(
                            '<strong>Ignored users:</strong> <br><br>' + cppConfig.banArray.toString()
                            .replace(/,/g, ', ')
                        );
                        break;
                    case 'listsettings':
                        alertify.alert(
                            '<strong>Current settings:</strong> <br><br>' +
                            'maxPics = ' + cppConfig.maxPics +
                            ' <em>pictures per message.</em><br>' +
                            'maxSize = ' + cppConfig.maxSize + ' <em>pixels wide.</em><br>' +
                            'maxText = ' + cppConfig.maxText +
                            ' <em>characters per message.</em><br>' +
                            'maxCapsWords = ' + cppConfig.maxCapsWords +
                            ' <em>uppercase words per message.</em><br>' +
                            'maxPosts = ' + cppConfig.maxPosts + '<br>' +
                            'floodRange = ' + cppConfig.floodRange + '<br>' +
                            '&emsp;&emsp;<em>' + cppConfig.maxPosts + ' identical message per ' +
                            cppConfig.floodRange + ' messages allowed.</em>'
                        );
                        break;
                    case 'set':
                        if (/maxPics|maxSize|maxText|maxCapsWords|maxPosts|floodRange/i.test(param1)) {
                            if (!param2) {
                                alertify.log('A value must be provided.', 'error', 5000);
                            } else if (isNaN(param2)) {
                                alertify.log('The value must be a valid number.', 'error', 5000);
                            } else {
                                setParam(param1, param2);
                            }
                        } else {
                            alertify.log(
                                'Unknow setting. Valid settings are:<br>' +
                                '&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                                '&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                                '&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                                '&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                                '&emsp;&emsp;<strong>maxPosts</strong><br>' +
                                '&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                                '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em>',
                                'error', 5000);
                        }
                        break;
                    case 'stats':
                        alertify.alert(
                            '<strong>Stats for session:</strong> <br><br>' +
                            '<strong>Total banned users:</strong>&emsp;' + cppConfig.banArray.length +
                            '<br>' +
                            '<strong>Messages blocked this session:</strong>&emsp;' +
                            stat_TotalBlocked +
                            '<br>' +
                            '<strong>Blocked users:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedUsers).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Blocked images:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedImages).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Flood:</strong>&emsp;' + JSON.stringify(stat_BlockedFlood).replace(
                                /\{|\}|\"/g, '').replace(/(\:|\,)/g, '$1 ') +
                            '<br>' +
                            '<strong>Wall of text:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedText).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ') +
                            '<br>' +
                            '<strong>Caps Lock Malfunction:</strong>&emsp;' + JSON.stringify(
                                stat_BlockedCaps).replace(/\{|\}|\"/g, '').replace(/(\:|\,)/g,
                                '$1 ')
                        );
                        break;
                    case 'help':
                        alertify.alert(
                            '<strong>List of valid commands:</strong> <br><br>' +
                            '<strong>/ignore username</strong>&emsp;<em>Ignore username</em><br>' +
                            '<strong>/unignore username</strong>&emsp;<em>Unignore username</em><br>' +
                            '<strong>/listignored</strong>&emsp;<em>Display the list of ignored users</em><br>' +
                            '<strong>/listsettings</strong>&emsp;<em>Display automatic ignore settings</em><br>' +
                            '<strong>/set setting value</strong>&emsp;<em>Change the value of a setting.</em><br>' +
                            '&emsp;&emsp;Unknow setting. Valid settings are:<br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPics</strong>&emsp;<em>Block messages with more than x pictures.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxSize</strong>&emsp;<em>Resize pictures in messages to x pixels wide.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxText</strong>&emsp;<em>Block messages with more than x characters.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxCapsWords</strong>&emsp;<em>Block messages with more than x uppercase words.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>maxPosts</strong><br>' +
                            '&emsp;&emsp;&emsp;&emsp;<strong>floodRange</strong>&emsp;<em>Flood detection: allow (maxPosts) identical messages</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>per (floodRange) number of messages.</em><br>' +
                            '&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<em>Default allows 1 identical message per 10 messages</em><br>' +
                            '<strong>/stats</strong>&emsp;<em>Display statistics about ignored users for this session.</em><br>' +
                            '<strong>/help</strong>&emsp;<em>Display this help message.</em>'
                        );
                        break;
                    default:
                        alertify.log('Unknown command: ' + command, 'error', 5000);
                    }
                    e('input#message').prop('value', '');
                } else {
                    handle_send('add', document.getElementById('text'));
                }
            };

            var init = function () {
                // get config
                if (!localStorage.cppConfig) {
                    localStorage.cppConfig = JSON.stringify(cppConfig);
                }
                e.each(cppConfig, function (key) {
                    cppConfig[key] = (localStorage.cppConfig && JSON.parse(localStorage.cppConfig)[
                        key]) || cppConfig[key];
                });
                localStorage.cppConfig = JSON.stringify(cppConfig);

                // style
                e('<style type="text/css">' +
                    '  #chat .content img {' +
                    '    width:auto;' +
                    '    height:auto;' +
                    '    display:inline-block' +
                    '  }' +
                    '  .cppHidden {' +
                    '    display: none;' +
                    '  }' +
                    '  .shouts, .onlinelist {' +
                    '    height: 600px;' +
                    '  }' +
                    '  .alertify, .alertify-log {' +
                    '    font-size: 125%;' +
                    '  }' +
                    '  .alertify-logs {' +
                    '    position: fixed;' +
                    '    z-index: 5000;' +
                    '    top: 50px; left: 50%;' +
                    '    width: 550px;' +
                    '    margin-left: -275px;' +
                    '  }' +
                    '</style>'
                ).appendTo('head');

                // command interception
                e('form#text').attr('onsubmit', '');
                e(document).on("submit", 'form#text', parseCommand);

                //initial cleaning
                removeIdiots(e('div#chat > div.post'));

                //dynamic filtering
                var target = document.getElementById('chat');
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        var newNodes = mutation.addedNodes;
                        if (newNodes !== null) {
                            removeIdiots(e(newNodes));
                            observer.takeRecords();
                        }
                    });
                });
                var config = {
                    attributes: false,
                    childList: true,
                    characterData: false,
                    subtree: true
                };
                observer.observe(target, config);
            };

            init();

        })();
    }

    var loadCss = function (array, callback) {
        var loader = function (src, handler) {
            var css = document.createElement('link');
            css.rel = 'stylesheet';
            css.href = src;
            css.onload = css.onreadystatechange = function () {
                css.onreadystatechange = css.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(css);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    var loadScripts = function (array, callback) {
        var loader = function (src, handler) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = script.onreadystatechange = function () {
                script.onreadystatechange = script.onload = null;
                handler();
            };
            var head = document.getElementsByTagName('head')[0];
            (head || document.body).appendChild(script);
        };
        (function () {
            if (array.length !== 0) {
                loader(array.shift(), arguments.callee);
            } else {
                callback && callback();
            }
        }());
    };

    loadCss([
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.core.min.css',
        'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.bootstrap.min.css'
    ], function () {
        loadScripts([
            'https://cdnjs.domain4sales.com.com/ajax/libs/jquery/2.1.0/jquery.min.js',
            'https://cdnjs.domain4sales.com.com/ajax/libs/alertify.js/0.3.11/alertify.min.js'
        ], function () {
            initcppBan();
        });
    });

}());
Vinnymike
 
Posts: 43
Joined: Wed Apr 13, 2016 10:11 am
Karma: 1

Previous Page

  • Similar topics
    Replies
    Views
    Last post

Return to General Talk

Who is online

Users browsing this forum: AussiBull, Bing [Bot], Brittapiwnjq, Coppacobana, Google [Bot], MC117, sgtasif, ShashBall and 57 guests