您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add secondary nicknames for users - shown only in IP.Chat.
// ==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; } } }); }