// ==UserScript==
// @name IP.Chat Ignore
// @namespace Makaze
// @include *
// @grant none
// @version 1.1.7
// @description Allows you to ignore chat messages from specific users.
// ==/UserScript==
var MakazeScriptStyles,
IPChatMenuItems,
reference,
ignoredUsersMenu,
menuButton,
styleElem,
leaveImgSrc,
i = 0;
// Classes constructor
function ClassHandler() {
var self = this;
this.classList = function(elem) {
return elem.className.trim().split(/[\b\s]/);
};
this.hasClass = function(elem, className) {
var classes = self.classList(elem),
has = false,
i = 0;
for (i = 0; i < classes.length; i++) {
if (classes[i] === className) {
has = true;
break;
}
}
return (has);
};
this.addClass = function(elem, className) {
var classes;
if (!self.hasClass(elem, className)) {
classes = self.classList(elem);
classes.push(className);
elem.className = classes.join(' ').trim();
}
return self;
};
this.removeClass = function(elem, className) {
var classes = self.classList(elem),
i = 0;
for (i = 0; i < classes.length; i++) {
if (classes[i] === className) {
classes.splice(i, 1);
}
}
elem.className = classes.join(' ').trim();
return self;
};
this.toggleClass = function(elem, className) {
var classes;
if (self.hasClass(elem, className)) {
self.removeClass(elem, className);
} else {
classes = self.classList(elem);
classes.push(className);
elem.className = classes.join(' ').trim();
}
return self;
};
}
// Initialize
var Classes = new ClassHandler();
// End Classes constructor
function empty(elem) {
while (elem.hasChildNodes()) {
elem.removeChild(elem.lastChild);
}
}
function createElement(type, callback) {
var element = document.createElement(type);
callback(element);
return element;
}
function fade(elem, type, speed) {
var defaultOpacity,
currentDisplay = elem.style.display || window.getComputedStyle(elem).display;
elem.style.opacity = '';
defaultOpacity = window.getComputedStyle(elem).opacity;
elem.style.opacity = 0;
// Default values:
switch (arguments.length) {
case 1:
type = 'toggle';
case 2:
speed = 300;
break;
}
switch (type) {
case 'in':
elem.style.display = '';
setTimeout(function() {
elem.style.transition = 'all ' + speed + 'ms ease-in-out';
elem.style.opacity = defaultOpacity;
setTimeout(function() {
elem.style.transition = '';
elem.style.opacity = '';
}, speed + 10);
}, 1);
break;
case 'out':
elem.style.transition = '';
elem.style.opacity = defaultOpacity;
elem.style.transition = 'all ' + speed + 'ms ease-in-out';
elem.style.opacity = 0;
setTimeout(function() {
elem.style.display = 'none';
elem.style.transition = '';
elem.style.opacity = '';
}, speed + 10);
break;
case 'toggle':
default:
if (currentDisplay === 'none') {
elem.style.display = '';
setTimeout(function() {
elem.style.transition = 'all ' + speed + 'ms ease-in-out';
elem.style.opacity = defaultOpacity;
setTimeout(function() {
elem.style.transition = '';
elem.style.opacity = '';
}, speed + 10);
}, 1);
} else {
elem.style.transition = '';
elem.style.opacity = defaultOpacity;
elem.style.transition = 'all ' + speed + 'ms ease-in-out';
elem.style.opacity = 0;
setTimeout(function() {
elem.style.display = 'none';
elem.style.transition = '';
elem.style.opacity = '';
}, speed + 10);
}
}
}
function toggleIgnoreStatus(userID, elem) {
var currRef,
ignoreLink,
isIgnored = false,
name,
opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
ignoreList = (opts.hasOwnProperty('ipc_ignores')) ? opts.ipc_ignores : [],
i = 0,
j = 0;
for (i = 0; i < ignoreList.length; i++) {
if (ignoreList[i].user === userID) {
isIgnored = true;
break;
}
}
ignoreLink = document.getElementById('block_all_' + userID);
if (ignoreLink != null) {
if (arguments.length > 1) {
currRef = elem;
} else {
currRef = document.getElementById(ignoreLink.parentNode.parentNode.id.split('_menucontent')[0]);
}
if (isIgnored) {
currRef.style.textDecoration = '';
currRef.style.fontStyle = '';
ignoreLink.childNodes[1].nodeValue = ' Ignore All Chats';
} else {
currRef.style.textDecoration = 'line-through';
currRef.style.fontStyle = 'oblique';
ignoreLink.childNodes[1].nodeValue = ' Stop Ignoring All Chats';
}
}
if (isIgnored) {
for (j = 0; j < document.getElementsByClassName('ignoredUser' + userID).length; j++) {
document.getElementsByClassName('ignoredUser' + userID)[j].style.display = '';
Classes.removeClass(document.getElementsByClassName('ignoredUser' + userID)[j], 'ignoredUser' + userID);
}
opts.ipc_ignores.splice(i, 1);
localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
} else {
if (arguments.length > 1) {
currRef = elem;
} else {
currRef = document.getElementById(ignoreLink.parentNode.parentNode.id.split('_menucontent')[0]);
}
name = currRef.getElementsByTagName('span')[0].textContent.trim();
opts.ipc_ignores.push({ 'user': userID, 'name': name });
localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
}
getIgnoredUsers();
}
function createIgnoreLink(reference) {
if (document.getElementById(reference.id + '_menucontent').getElementsByTagName('a')[0] == null) {
return false;
}
var userID = reference.parentNode.parentNode.getElementsByTagName('a')[0].id.split('link_')[1],
opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
ignoreList = (opts.hasOwnProperty('ipc_ignores')) ? opts.ipc_ignores : [],
blockCloneSrc = document.getElementById(reference.id + '_menucontent').getElementsByClassName('block_user')[0] || document.getElementById(reference.id + '_menucontent').getElementsByClassName('unblock_user')[0],
blockClone = blockCloneSrc.parentNode.cloneNode(true),
blockCloneParent = blockCloneSrc.parentNode.parentNode,
ignoreLink = blockClone.getElementsByTagName('a')[0],
name = reference.getElementsByTagName('span')[0].textContent.trim(),
isIgnored = false,
i = 0;
ignoreLink.onclick = null;
ignoreLink.href = 'javascript:void(0)';
ignoreLink.className = 'block_all_user';
ignoreLink.id = 'block_all_' + userID;
ignoreLink.title = 'Ignore All Chats';
for (i = 0; i < ignoreList.length; i++) {
if (ignoreList[i].user === userID) {
isIgnored = true;
reference.style.textDecoration = 'line-through';
reference.style.fontStyle = 'oblique';
if (ignoreList.name !== name) {
opts.ipc_ignores[i].name = name;
localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
}
break;
}
}
ignoreLink.childNodes[1].nodeValue = (isIgnored) ? ' Stop Ignoring All Chats' : ' Ignore All Chats';
ignoreLink.onclick = function() {
var user = this.id.split('block_all_')[1];
toggleIgnoreStatus(user, reference);
};
blockCloneParent.appendChild(blockClone);
}
function getIgnoredUsers() {
var container = document.getElementById('ignoredUsers').getElementsByClassName('scrollableContent')[0],
opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
ignoreList = (opts.hasOwnProperty('ipc_ignores')) ? opts.ipc_ignores : [],
ignoredUsrID,
ignoredUsrName,
i = 0;
empty(container);
function createUnignore(id, name) {
return createElement('a', function(link) {
link.setAttribute('data-userid', id);
link.href = 'javascript:void(0)';
link.title = 'Unignore this user';
link.appendChild(createElement('img', function(img) {
img.src = leaveImgSrc;
}));
link.appendChild(document.createTextNode(' ' + name));
link.onclick = function() {
toggleIgnoreStatus(id);
fade(this, 'out');
};
});
}
for (i = 0; i < ignoreList.length; i++) {
ignoredUsrID = ignoreList[i].user;
ignoredUsrName = ignoreList[i].name;
container.appendChild(createUnignore(ignoredUsrID, ignoredUsrName));
}
}
if (document.body.id === 'ipboard_body' && document.getElementById('storage_chatroom') != null) {
// Styling
if (document.getElementById('MakazeScriptStyles') == null) {
MakazeScriptStyles = createElement('style', function(style) {
style.id = 'MakazeScriptStyles';
style.type = 'text/css';
});
document.head.appendChild(MakazeScriptStyles);
}
styleElem = document.getElementById('MakazeScriptStyles');
if (styleElem.hasChildNodes()) {
styleElem.childNodes[0].nodeValue += '\n\n';
} else {
styleElem.appendChild(document.createTextNode(''));
}
if (!styleElem.childNodes[0].nodeValue.match('.MakazeScriptMenu')) {
styleElem.childNodes[0].nodeValue += '.MakazeScriptMenu { position: fixed; z-index: 99999; top: 50%; left: 50%; padding: 10px; background-color: rgba(255, 255, 255, .85); box-shadow: 0px 0px 3px #888; border-radius: 5px; } .MakazeScriptMenu th { font-weight: bolder; } .MakazeScriptMenu th, .MakazeScriptMenu td { padding: 3px; } .MakazeScriptMenu .menu-save { text-align: center; margin-top: 6px; } .MakazeScriptMenu .menu-save > a { padding: 2px 10px; border: 1px solid #ccc; border-radius: 3px; font-weight: bolder; cursor: pointer; } .MakazeScriptMenu .menuTitle { margin-bottom: 10px; font-weight: bolder; } .MakazeScriptMenu .scrollableContent { width: 312px; height: 150px; overflow: auto; padding: 2px; } .MakazeScriptMenu textarea, .MakazeScriptMenu input[type=text], .MakazeScriptMenu input[type=number] { font-family: Consolas, Ubuntu Mono, sans-serif; font-size: 10px; color: #333; padding: 3px; box-sizing: border-box; }\n\n';
}
styleElem.childNodes[0].nodeValue +=
'#ignoredUsers {\n' +
'margin-left: -168px;\n' +
'margin-top: -110px;\n' +
'}\n\n' +
'#ignoredUsers .scrollableContent > a {\n' +
'display: inline-block;\n' +
'background-color: #eee;\n' +
'box-shadow: 0px 0px 3px #aaa;\n' +
'border: 2px solid #fff;\n' +
'padding: 1px 4px;\n' +
'border-radius: 2px;\n' +
'margin-right: 10px;\n' +
'margin-bottom: 10px;\n' +
'font-size: 10px;\n' +
'}\n\n' +
'#ignoredUsers .scrollableContent > a > img {\n' +
'height: 12px;\n' +
'}';
// Menu creation
ignoredUsersMenu = createElement('div', function(menu) {
menu.id = 'ignoredUsers';
menu.className = 'MakazeScriptMenu';
menu.style.display = 'none';
menu.appendChild(createElement('div', function(title) {
title.className = 'menuTitle';
title.appendChild(document.createTextNode('Ignored Users'));
}));
menu.appendChild(createElement('div', function(scroll) {
scroll.className = 'scrollableContent';
}));
menu.appendChild(createElement('div', function(save) {
save.className = 'menu-save';
save.appendChild(createElement('a', function(link) {
link.href = 'javascript:void(0)';
link.id = 'ignoredUsers_close';
link.appendChild(document.createTextNode('Close'));
link.onclick = function() {
fade(this.parentNode.parentNode, 'out');
};
}));
}));
});
document.body.appendChild(ignoredUsersMenu);
getIgnoredUsers();
// Button creation
if (document.getElementById('IPChatMenuItems') == null) {
IPChatMenuItems = createElement('div', function(menu) {
menu.id = 'IPChatMenuItems';
menu.style.textAlign = 'right';
});
document.getElementById('chatters-online-wrap').nextSibling.nextSibling.getElementsByTagName('ul')[0].appendChild(IPChatMenuItems);
}
if (document.getElementById('IPChatMenuItems').innerHTML.length) {
document.getElementById('IPChatMenuItems').appendChild(document.createElement('br'));
}
menuButton = createElement('a', function(button) {
button.id = 'gnoredUsersMenuButton';
button.className = 'ipsButton_secondary';
button.href = 'javascript:void(0)';
button.style.marginTop = '10px';
button.appendChild(document.createTextNode('Manage Ignored Users'));
button.onclick = function() {
var menu = document.getElementById('ignoredUsers');
if (menu.style.display === 'none') {
getIgnoredUsers();
}
fade(menu);
};
});
document.getElementById('IPChatMenuItems').appendChild(menuButton);
// Get leaving image source
leaveImgSrc = document.getElementById('leave_room').getElementsByTagName('img')[0].src;
// Add ignore links
if (document.getElementById('chatters-online-wrap') != null) {
for (i = 0; i < document.getElementById('chatters-online-wrap').getElementsByClassName('chatmodmenu').length; i++) {
reference = document.getElementById('chatters-online-wrap').getElementsByClassName('chatmodmenu')[i];
createIgnoreLink(reference);
}
}
document.addEventListener('DOMNodeInserted', function(event) {
// Add ignore link to new users
if (event.target.nodeType === 1 && Classes.hasClass(event.target, 'kickmenu')) {
var checkForPartner = setInterval(function() {
var link = document.getElementById(event.target.id.split('_menucontent')[0]);
if (link != null) {
createIgnoreLink(link);
clearTimeout(checkForPartner);
}
}, 1);
return false;
}
// Ignore messages in chat
if (event.target.nodeType !== 1 || event.target.id !== 'storage_chatroom') {
return false;
}
var nick,
curr,
opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
ignoreList = (opts.hasOwnProperty('ipc_ignores')) ? opts.ipc_ignores : [],
latestMessage,
i = 0;
if (!ignoreList.length) {
return false;
}
latestMessage = event.target.parentNode.getElementsByTagName('div')[event.target.parentNode.getElementsByTagName('div').length - 1];
if (!Classes.hasClass(latestMessage.parentNode, 'post')) {
return false;
}
if (Classes.hasClass(latestMessage.parentNode, 'chat-moderator')) {
return false;
}
nick = null;
curr = latestMessage.parentNode;
while (nick === null) {
if (curr.getElementsByTagName('label').length) {
nick = curr.getElementsByTagName('label')[0].textContent;
} else {
curr = curr.previousSibling;
}
}
for (i = 0; i < ignoreList.length; i++) {
if (ignoreList[i].name === nick) {
latestMessage.parentNode.style.display = 'none';
Classes.addClass(latestMessage.parentNode, 'ignoredUser' + ignoreList[i].user);
break;
}
}
});
}