- // ==UserScript==
- // @name IP.Chat - Nickname Users
- // @namespace Makaze
- // @include *
- // @grant none
- // @version 1.0
- // @description Add secondary nicknames for users - shown only in IP.Chat.
- // ==/UserScript==
-
- var MakazeScriptStyles,
- IPChatMenuItems,
- reference,
- nicknamedUsersMenu,
- 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 nickname(userID, nick, elem, isNicknamed) {
- var currRef,
- nickInList,
- username,
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
- i = 0,
- j = 0;
-
- if (typeof isNicknamed === 'undefined') {
- isNicknamed = false;
-
- for (i = 0; i < nicknameList.length; i++) {
- if (nicknameList[i].user === userID) {
- isNicknamed = true;
- break;
- }
- }
- }
-
- if (arguments.length > 2) {
- currRef = elem;
- } else {
- currRef = document.getElementById(document.getElementById('nickname_' + userID).parentNode.parentNode.id.split('_menucontent')[0]);
- }
-
- nickInList = currRef.getElementsByClassName('nickname')[0];
-
- if (nickInList != null) {
- nickInList.childNodes[0].nodeValue = nick;
- } else {
- currRef.appendChild(document.createTextNode(' '));
- currRef.appendChild(createElement('span', function(span) {
- span.className = 'nickname';
- span.appendChild(document.createTextNode(nick));
- }));
- }
-
- for (j = 0; j < document.getElementsByClassName('nicknamedUser' + userID).length; j++) {
- document.getElementsByClassName('nicknamedUser' + userID)[j].childNodes[0].nodeValue = nick;
- }
-
- if (isNicknamed) {
- nicknameList[i].nick = nick;
- } else {
- username = currRef.getElementsByTagName('span')[0].textContent.trim();
-
- nicknameList.push({ 'user': userID, 'name': username, 'nick': nick });
- }
-
- document.getElementById('unnickname_' + userID).style.display = '';
-
- opts.ipc_nickname_list = nicknameList;
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
-
- getNicknamedUsers();
- }
-
- function removeNick(userID, elem) {
- var currRef,
- nickInList,
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
- i = 0;
-
- for (i = 0; i < nicknameList.length; i++) {
- if (nicknameList[i].user === userID) {
- break;
- }
- }
-
- if (arguments.length > 2) {
- currRef = elem;
- } else {
- currRef = document.getElementById(document.getElementById('nickname_' + userID).parentNode.parentNode.id.split('_menucontent')[0]);
- }
-
- nickInList = currRef.getElementsByClassName('nickname')[0];
-
- if (nickInList != null) {
- nickInList.remove();
- }
-
- while (document.getElementsByClassName('nicknamedUser' + userID)[0] != null) {
- document.getElementsByClassName('nicknamedUser' + userID)[0].previousSibling.nodeValue = document.getElementsByClassName('nicknamedUser' + userID)[0].previousSibling.nodeValue.slice(0, -1);
- document.getElementsByClassName('nicknamedUser' + userID)[0].remove();
- }
-
- document.getElementById('unnickname_' + userID).style.display = 'none';
-
- opts.ipc_nickname_list.splice(i, 1);
-
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
-
- getNicknamedUsers();
- }
-
- function createNicknameOptions(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')) : {},
- nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
- changeNicknameOption,
- removeNicknameOption,
- menuParent = document.getElementById(reference.id + '_menucontent'),
- username = reference.getElementsByTagName('span')[0].textContent.trim(),
- isNicknamed = false,
- i = 0;
-
- changeNicknameOption = createElement('li', function(option) {
- option.setAttribute('style', 'z-index: 10000;');
- option.appendChild(createElement('a', function(link) {
- link.href = 'javascript:void(0)';
- link.className = 'nickname_user';
- link.id = 'nickname_' + userID;
- link.title = 'Add/Change Nickname';
- link.setAttribute('style', 'z-index: 10000;');
-
- link.appendChild(createElement('img', function(icon) {
- icon.src = 'http://i.minus.com/iRdCI3MO4Vlvn.png';
- icon.alt = 'Icon';
- icon.style.zIndex = 10000;
- icon.style.height = '16px';
- }));
-
- link.appendChild(document.createTextNode(' Add/Change Nickname'));
-
- link.onclick = function() {
- var user = this.id.split('nickname_')[1],
- nickRequest = createElement('div', function(request) {
- request.id = 'nick_request';
- request.className = 'MakazeScriptMenu';
- request.style.display = 'none';
-
- request.appendChild(createElement('h3', function(title) {
- title.appendChild(document.createTextNode('New nickname for: '));
- title.appendChild(createElement('span', function(usrname) {
- usrname.id = 'nick_request_user';
- usrname.appendChild(document.createTextNode(username));
- }));
- }));
-
- request.appendChild(createElement('div', function(cont) {
- cont.appendChild(createElement('input', function(input) {
- input.id = 'nick_request-new_nick';
- input.type = 'text';
- input.style.width = '100%';
- input.placeholder = 'New nickname';
- input.addEventListener('keydown', function(e) {
- if (e.keyCode === 13) {
- document.getElementById('nick_request_submit').click();
- }
- }, false);
- }));
- }));
-
- request.appendChild(createElement('div', function(footer) {
- footer.className = 'submitButtons';
-
- footer.appendChild(createElement('a', function(okay) {
- okay.id = 'nick_request_submit';
- okay.className = 'ipsButton_secondary';
- okay.style.marginRight = '5px';
- okay.href = 'javascript:void(0)';
- okay.title = 'OK';
- okay.appendChild(document.createTextNode('OK'));
- okay.onclick = function() {
- nickname(user, document.getElementById('nick_request-new_nick').value, reference);
-
- fade(document.getElementById('nick_request'), 'out');
- setTimeout(function() {
- document.getElementById('nick_request').remove();
- }, 310);
- };
- }));
-
- footer.appendChild(createElement('a', function(cancel) {
- cancel.className = 'ipsButton_secondary';
- cancel.href = 'javascript:void(0)';
- cancel.title = 'Cancel';
- cancel.appendChild(document.createTextNode('Cancel'));
- cancel.onclick = function() {
- fade(document.getElementById('nick_request'), 'out');
- setTimeout(function() {
- document.getElementById('nick_request').remove();
- }, 310);
- };
- }));
- }));
- });
-
- document.body.appendChild(nickRequest);
-
- fade(document.getElementById('nick_request'), 'in');
-
- document.getElementById('nick_request-new_nick').focus();
- };
- }));
- });
-
- for (i = 0; i < nicknameList.length; i++) {
- if (nicknameList[i].user === userID) {
- isNicknamed = true;
- break;
- }
- }
-
- menuParent.appendChild(changeNicknameOption);
-
- removeNicknameOption = createElement('li', function(option) {
- option.setAttribute('style', 'z-index: 10000;');
- option.appendChild(createElement('a', function(link) {
- link.href = 'javascript:void(0)';
- link.className = 'unnickname_user';
- link.id = 'unnickname_' + userID;
- link.title = 'Remove Nickname';
- link.setAttribute('style', 'z-index: 10000;');
- link.style.display = (isNicknamed) ? '' : 'none';
-
- link.appendChild(createElement('img', function(icon) {
- icon.src = leaveImgSrc;
- icon.alt = 'Icon';
- icon.style.zIndex = 10000;
- }));
-
- link.appendChild(document.createTextNode(' Remove Nickname'));
-
- link.onclick = function() {
- var user = this.id.split('unnickname_')[1];
- removeNick(user, reference);
- };
- }));
- });
-
- menuParent.appendChild(removeNicknameOption);
-
- if (isNicknamed) {
- reference.appendChild(document.createTextNode(' '));
- reference.appendChild(createElement('span', function(span) {
- span.className = 'nickname';
- span.appendChild(document.createTextNode(nicknameList[i].nick));
- }));
-
- if (nicknameList[i].name !== username) {
- opts.ipc_nickname_list[i].name = username;
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
- }
- }
- }
-
- function getNicknamedUsers() {
- var container = document.getElementById('nicknamedUsers').getElementsByClassName('scrollableContent')[0],
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
- ID,
- username,
- nick,
- i = 0;
-
- empty(container);
-
- function createNick(id, name, nick) {
- return createElement('a', function(link) {
- link.setAttribute('data-userid', id);
- link.href = 'javascript:void(0)';
- link.title = 'Remove Nickname';
- link.style.whiteSpace = 'pre';
-
- link.appendChild(createElement('img', function(img) {
- img.src = leaveImgSrc;
- }));
-
- link.appendChild(document.createTextNode(' ' + nick + ' => ' + name));
-
- link.onclick = function() {
- removeNick(id);
- fade(this, 'out');
- };
- });
- }
-
- for (i = 0; i < nicknameList.length; i++) {
- ID = nicknameList[i].user;
- username = nicknameList[i].name;
- nick = nicknameList[i].nick;
-
- container.appendChild(createNick(ID, username, nick));
- }
- }
-
- 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 +=
- '#nicknamedUsers {\n' +
- 'margin-left: -168px;\n' +
- 'margin-top: -110px;\n' +
- '}\n\n' +
-
- '#nicknamedUsers .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' +
-
- '#nicknamedUsers .scrollableContent > a > img {\n' +
- 'height: 12px;\n' +
- '}\n\n' +
-
- '.nickname {\n' +
- 'font-weight: lighter;\n' +
- '}\n\n' +
-
- '.nickname:before {\n' +
- 'content: \'(\'\n' +
- '}\n\n' +
-
- '.nickname:after {\n' +
- 'content: \')\'\n' +
- '}\n\n' +
-
- '#nick_request {\n' +
- 'width: 250px;\n' +
- 'margin-left: -135px;\n' +
- 'margin-top: -52px;\n' +
- '}\n\n' +
-
- '#nick_request h3 {\n' +
- 'margin-bottom: 1em;\n' +
- '}\n\n' +
-
- '#nick_request .submitButtons {\n' +
- 'text-align: right;\n' +
- 'margin-top: 10px;\n' +
- '}';
-
- // Menu creation
-
- nicknamedUsersMenu = createElement('div', function(menu) {
- menu.id = 'nicknamedUsers';
- menu.className = 'MakazeScriptMenu';
- menu.style.display = 'none';
-
- menu.appendChild(createElement('div', function(title) {
- title.className = 'menuTitle';
- title.appendChild(document.createTextNode('Nicknames'));
- }));
-
- 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 = 'nicknamedUsers_close';
- link.appendChild(document.createTextNode('Close'));
- link.onclick = function() {
- fade(this.parentNode.parentNode, 'out');
- };
- }));
- }));
- });
-
- document.body.appendChild(nicknamedUsersMenu);
-
- // 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 = 'nicknamedUsersMenuButton';
- button.className = 'ipsButton_secondary';
- button.href = 'javascript:void(0)';
- button.style.marginTop = '10px';
- button.appendChild(document.createTextNode('Manage Nicknames'));
-
- button.onclick = function() {
- var menu = document.getElementById('nicknamedUsers');
-
- if (menu.style.display === 'none') {
- getNicknamedUsers();
- }
-
- fade(menu);
- };
- });
-
- document.getElementById('IPChatMenuItems').appendChild(menuButton);
-
- // Get leaving image source
-
- leaveImgSrc = document.getElementById('leave_room').getElementsByTagName('img')[0].src;
-
- // Add nicknaming 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];
- createNicknameOptions(reference);
- }
- }
-
- document.addEventListener('DOMNodeInserted', function(event) {
- // Add nicknaming links 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) {
- createNicknameOptions(link);
- clearTimeout(checkForPartner);
- }
- }, 1);
- return false;
- }
-
- // Nickname users in chat
-
- if (event.target.nodeType !== 1 || event.target.id !== 'storage_chatroom') {
- return false;
- }
-
- var opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
- latestNick,
- i = 0;
-
- if (!nicknameList.length) {
- return false;
- }
-
- latestNick = event.target.parentNode.getElementsByTagName('label')[event.target.parentNode.getElementsByTagName('label').length - 1];
-
- if (!Classes.hasClass(latestNick.parentNode, 'post')) {
- return false;
- }
-
- if (latestNick.getElementsByClassName('nickname')[0] != null) {
- return false;
- }
-
- function createNickInChat(index) {
- return createElement('span', function(span) {
- span.className = 'nickname nicknamedUser' + nicknameList[index].user;
- span.appendChild(document.createTextNode(nicknameList[index].nick));
- });
- }
-
- for (i = 0; i < nicknameList.length; i++) {
- if (nicknameList[i].name === latestNick.textContent.trim()) {
- latestNick.appendChild(document.createTextNode(' '));
- latestNick.appendChild(createNickInChat(i));
- break;
- }
- }
- });
- }