var before = wsHook.before = function (data, url, wsObject) { return data; }; var after = wsHook.after = function (e, url, wsObject) { return e; }; var modifyUrl = wsHook.modifyUrl = function(url) { return url; }; wsHook.resetHooks = function () { wsHook.before = before; wsHook.after = after; wsHook.modifyUrl = modifyUrl; };
var _WS = WebSocket; WebSocket = function (url, protocols) { var WSObject; url = wsHook.modifyUrl(url) || url; this.url = url; this.protocols = protocols; if (!this.protocols) { WSObject = new _WS(url); } else { WSObject = new _WS(url, protocols); }
var _send = WSObject.send; WSObject.send = function (data) { arguments[0] = wsHook.before(data, WSObject.url, WSObject) || data; _send.apply(this, arguments); };
// Events needs to be proxied and bubbled down. WSObject._addEventListener = WSObject.addEventListener; WSObject.addEventListener = function () { var eventThis = this; // if eventName is 'message' if (arguments[0] === 'message') { arguments[1] = (function (userFunc) { return function instrumentAddEventListener () { arguments[0] = wsHook.after(new MutableMessageEvent(arguments[0]), WSObject.url, WSObject); if (arguments[0] === null) return; userFunc.apply(eventThis, arguments); }; })(arguments[1]); } return WSObject._addEventListener.apply(this, arguments); };
Object.defineProperty(WSObject, 'onmessage', { 'set': function () { var eventThis = this; var userFunc = arguments[0]; var onMessageHandler = function () { arguments[0] = wsHook.after(new MutableMessageEvent(arguments[0]), WSObject.url, WSObject); if (arguments[0] === null) return; userFunc.apply(eventThis, arguments); }; WSObject._addEventListener.apply(this, ['message', onMessageHandler, false]); } });
return WSObject; }; })();
function addUser(event) { var username_field = document.getElementById("inputuser"); var users = getUsers(); users.push(username_field.value); updateUsers(users); }
function removeUser(event) { var users = getUsers(); var index = users.indexOf(event.target.parentNode.dataset.sid); users.splice(index, 1); updateUsers(users); return; }
function getUsers() { var users = JSON.parse(localStorage.getItem("muted_users")); if (users == null) { users = []; } return users; }
function updateUsers(users) { var content = document.querySelector(".userlist"); var user_list = content.children[1]; var temp_user = document.createElement("template"); user_list.replaceChildren(); users.forEach((user) => { temp_user.innerHTML = `
I love this program!
Here is my version of it, I add filter words, and to totally hide messages from ignored users so that you do not see their obscene name or profile pic
// ==UserScript==
// @name Chatango Word Filter and User Blocker
// @namespace http://tampermonkey.net/
// @version 2024-09-02
// @description Automatically block messages containing specific words and from specific users in Chatango
// @author SkeletalRemains (based on code from sillycritter)
// @match https://st.chatango.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=chatango.com
// @grant none
// @run-at document-start
// ==/UserScript==
// List of words to filter (in lowercase)
const filteredWords = [
'word1', 'word2', 'word3', 'word4', 'word5'
];
var wsHook = {};
(function () {
// Mutable MessageEvent.
// Subclasses MessageEvent and makes data, origin and other MessageEvent properties mutable.
function MutableMessageEvent(o) {
this.bubbles = o.bubbles || false;
this.cancelBubble = o.cancelBubble || false;
this.cancelable = o.cancelable || false;
this.currentTarget = o.currentTarget || null;
this.data = o.data || null;
this.defaultPrevented = o.defaultPrevented || false;
this.eventPhase = o.eventPhase || 0;
this.lastEventId = o.lastEventId || '';
this.origin = o.origin || '';
this.path = o.path || new Array(0);
this.ports = o.parts || new Array(0);
this.returnValue = o.returnValue || true;
this.source = o.source || null;
this.srcElement = o.srcElement || null;
this.target = o.target || null;
this.timeStamp = o.timeStamp || null;
this.type = o.type || 'message';
this.__proto__ = o.__proto__ || MessageEvent.__proto__;
}
var before = wsHook.before = function (data, url, wsObject) {
return data;
};
var after = wsHook.after = function (e, url, wsObject) {
return e;
};
var modifyUrl = wsHook.modifyUrl = function(url) {
return url;
};
wsHook.resetHooks = function () {
wsHook.before = before;
wsHook.after = after;
wsHook.modifyUrl = modifyUrl;
};
var _WS = WebSocket;
WebSocket = function (url, protocols) {
var WSObject;
url = wsHook.modifyUrl(url) || url;
this.url = url;
this.protocols = protocols;
if (!this.protocols) {
WSObject = new _WS(url);
} else {
WSObject = new _WS(url, protocols);
}
var _send = WSObject.send;
WSObject.send = function (data) {
arguments[0] = wsHook.before(data, WSObject.url, WSObject) || data;
_send.apply(this, arguments);
};
// Events needs to be proxied and bubbled down.
WSObject._addEventListener = WSObject.addEventListener;
WSObject.addEventListener = function () {
var eventThis = this;
// if eventName is 'message'
if (arguments[0] === 'message') {
arguments[1] = (function (userFunc) {
return function instrumentAddEventListener () {
arguments[0] = wsHook.after(new MutableMessageEvent(arguments[0]), WSObject.url, WSObject);
if (arguments[0] === null) return;
userFunc.apply(eventThis, arguments);
};
})(arguments[1]);
}
return WSObject._addEventListener.apply(this, arguments);
};
Object.defineProperty(WSObject, 'onmessage', {
'set': function () {
var eventThis = this;
var userFunc = arguments[0];
var onMessageHandler = function () {
arguments[0] = wsHook.after(new MutableMessageEvent(arguments[0]), WSObject.url, WSObject);
if (arguments[0] === null) return;
userFunc.apply(eventThis, arguments);
};
WSObject._addEventListener.apply(this, ['message', onMessageHandler, false]);
}
});
return WSObject;
};
})();
function addUser(event) {
var username_field = document.getElementById("inputuser");
var users = getUsers();
users.push(username_field.value);
updateUsers(users);
}
function removeUser(event) {
var users = getUsers();
var index = users.indexOf(event.target.parentNode.dataset.sid);
users.splice(index, 1);
updateUsers(users);
return;
}
function getUsers() {
var users = JSON.parse(localStorage.getItem("muted_users"));
if (users == null) {
users = [];
}
return users;
}
function updateUsers(users) {
var content = document.querySelector(".userlist");
var user_list = content.children[1];
var temp_user = document.createElement("template");
user_list.replaceChildren();
users.forEach((user) => {
temp_user.innerHTML = `
`;
temp_user.content.children[0].children[1].onclick = removeUser;
user_list.append(temp_user.content.children[0]);
});
localStorage.setItem("muted_users", JSON.stringify(users));
}
function changeVisibility() {
var dialog = document.getElementById("BLOCKDIALOG");
dialog.hidden = !dialog.hidden;
}
var temp_element = document.createElement("template");
temp_element.innerHTML = '
';
var block_element = temp_element.content.children[0];
block_element.onclick = changeVisibility;
temp_element.innerHTML = '
';
var menu_element = temp_element.content.children[0];
menu_element.children[0].children[1].onclick = changeVisibility;
wsHook.before = function (data, url, wsObject) {
return data;
};
wsHook.after = function (data, url, wsObject) {
var users = getUsers();
if (data.data == null) {
return data;
} else if (data.data == "inited") { // Ready to add elements
let footer = document.getElementById("FTR_RIGHT");
footer.prepend(block_element);
document.body.append(menu_element);
updateUsers(getUsers());
var input_field = document.getElementById("adduser");
input_field.onclick = addUser;
} else if (data.data.startsWith("b:")) {
var data_items = data.data.split(':');
if (users.includes(data_items[2])) { // User is in the mute list
data_items[10] = "";
data.data = "";
} else {
var message = data_items[10].toLowerCase();
if (filteredWords.some(word => message.includes(word))) {
data_items[10] = "<filtered>";
data.data = data_items.join(':');
}
}
}
return data;
};