IP.Chat - Nickname Users

Add secondary nicknames for users - shown only in IP.Chat.

  1. // ==UserScript==
  2. // @name IP.Chat - Nickname Users
  3. // @namespace Makaze
  4. // @include *
  5. // @grant none
  6. // @version 1.0
  7. // @description Add secondary nicknames for users - shown only in IP.Chat.
  8. // ==/UserScript==
  9.  
  10. var MakazeScriptStyles,
  11. IPChatMenuItems,
  12. reference,
  13. nicknamedUsersMenu,
  14. menuButton,
  15. styleElem,
  16. leaveImgSrc,
  17. i = 0;
  18.  
  19. // Classes constructor
  20.  
  21. function ClassHandler() {
  22. var self = this;
  23.  
  24. this.classList = function(elem) {
  25. return elem.className.trim().split(/[\b\s]/);
  26. };
  27.  
  28. this.hasClass = function(elem, className) {
  29. var classes = self.classList(elem),
  30. has = false,
  31. i = 0;
  32.  
  33. for (i = 0; i < classes.length; i++) {
  34. if (classes[i] === className) {
  35. has = true;
  36. break;
  37. }
  38. }
  39.  
  40. return (has);
  41. };
  42.  
  43. this.addClass = function(elem, className) {
  44. var classes;
  45.  
  46. if (!self.hasClass(elem, className)) {
  47. classes = self.classList(elem);
  48. classes.push(className);
  49. elem.className = classes.join(' ').trim();
  50. }
  51.  
  52. return self;
  53. };
  54.  
  55. this.removeClass = function(elem, className) {
  56. var classes = self.classList(elem),
  57. i = 0;
  58.  
  59. for (i = 0; i < classes.length; i++) {
  60. if (classes[i] === className) {
  61. classes.splice(i, 1);
  62. }
  63. }
  64.  
  65. elem.className = classes.join(' ').trim();
  66.  
  67. return self;
  68. };
  69.  
  70. this.toggleClass = function(elem, className) {
  71. var classes;
  72.  
  73. if (self.hasClass(elem, className)) {
  74. self.removeClass(elem, className);
  75. } else {
  76. classes = self.classList(elem);
  77. classes.push(className);
  78. elem.className = classes.join(' ').trim();
  79. }
  80.  
  81. return self;
  82. };
  83. }
  84.  
  85. // Initialize
  86.  
  87. var Classes = new ClassHandler();
  88.  
  89. // End Classes constructor
  90.  
  91. function empty(elem) {
  92. while (elem.hasChildNodes()) {
  93. elem.removeChild(elem.lastChild);
  94. }
  95. }
  96.  
  97. function createElement(type, callback) {
  98. var element = document.createElement(type);
  99.  
  100. callback(element);
  101.  
  102. return element;
  103. }
  104.  
  105. function fade(elem, type, speed) {
  106. var defaultOpacity,
  107. currentDisplay = elem.style.display || window.getComputedStyle(elem).display;
  108.  
  109. elem.style.opacity = '';
  110. defaultOpacity = window.getComputedStyle(elem).opacity;
  111. elem.style.opacity = 0;
  112.  
  113. // Default values:
  114.  
  115. switch (arguments.length) {
  116. case 1:
  117. type = 'toggle';
  118. case 2:
  119. speed = 300;
  120. break;
  121. }
  122.  
  123. switch (type) {
  124. case 'in':
  125. elem.style.display = '';
  126. setTimeout(function() {
  127. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  128. elem.style.opacity = defaultOpacity;
  129. setTimeout(function() {
  130. elem.style.transition = '';
  131. elem.style.opacity = '';
  132. }, speed + 10);
  133. }, 1);
  134. break;
  135. case 'out':
  136. elem.style.transition = '';
  137. elem.style.opacity = defaultOpacity;
  138. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  139. elem.style.opacity = 0;
  140. setTimeout(function() {
  141. elem.style.display = 'none';
  142. elem.style.transition = '';
  143. elem.style.opacity = '';
  144. }, speed + 10);
  145. break;
  146. case 'toggle':
  147. default:
  148. if (currentDisplay === 'none') {
  149. elem.style.display = '';
  150. setTimeout(function() {
  151. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  152. elem.style.opacity = defaultOpacity;
  153. setTimeout(function() {
  154. elem.style.transition = '';
  155. elem.style.opacity = '';
  156. }, speed + 10);
  157. }, 1);
  158. } else {
  159. elem.style.transition = '';
  160. elem.style.opacity = defaultOpacity;
  161. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  162. elem.style.opacity = 0;
  163. setTimeout(function() {
  164. elem.style.display = 'none';
  165. elem.style.transition = '';
  166. elem.style.opacity = '';
  167. }, speed + 10);
  168. }
  169. }
  170. }
  171.  
  172. function nickname(userID, nick, elem, isNicknamed) {
  173. var currRef,
  174. nickInList,
  175. username,
  176. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  177. nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
  178. i = 0,
  179. j = 0;
  180.  
  181. if (typeof isNicknamed === 'undefined') {
  182. isNicknamed = false;
  183.  
  184. for (i = 0; i < nicknameList.length; i++) {
  185. if (nicknameList[i].user === userID) {
  186. isNicknamed = true;
  187. break;
  188. }
  189. }
  190. }
  191.  
  192. if (arguments.length > 2) {
  193. currRef = elem;
  194. } else {
  195. currRef = document.getElementById(document.getElementById('nickname_' + userID).parentNode.parentNode.id.split('_menucontent')[0]);
  196. }
  197.  
  198. nickInList = currRef.getElementsByClassName('nickname')[0];
  199.  
  200. if (nickInList != null) {
  201. nickInList.childNodes[0].nodeValue = nick;
  202. } else {
  203. currRef.appendChild(document.createTextNode(' '));
  204. currRef.appendChild(createElement('span', function(span) {
  205. span.className = 'nickname';
  206. span.appendChild(document.createTextNode(nick));
  207. }));
  208. }
  209.  
  210. for (j = 0; j < document.getElementsByClassName('nicknamedUser' + userID).length; j++) {
  211. document.getElementsByClassName('nicknamedUser' + userID)[j].childNodes[0].nodeValue = nick;
  212. }
  213.  
  214. if (isNicknamed) {
  215. nicknameList[i].nick = nick;
  216. } else {
  217. username = currRef.getElementsByTagName('span')[0].textContent.trim();
  218.  
  219. nicknameList.push({ 'user': userID, 'name': username, 'nick': nick });
  220. }
  221.  
  222. document.getElementById('unnickname_' + userID).style.display = '';
  223.  
  224. opts.ipc_nickname_list = nicknameList;
  225. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  226. getNicknamedUsers();
  227. }
  228.  
  229. function removeNick(userID, elem) {
  230. var currRef,
  231. nickInList,
  232. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  233. nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
  234. i = 0;
  235.  
  236. for (i = 0; i < nicknameList.length; i++) {
  237. if (nicknameList[i].user === userID) {
  238. break;
  239. }
  240. }
  241.  
  242. if (arguments.length > 2) {
  243. currRef = elem;
  244. } else {
  245. currRef = document.getElementById(document.getElementById('nickname_' + userID).parentNode.parentNode.id.split('_menucontent')[0]);
  246. }
  247.  
  248. nickInList = currRef.getElementsByClassName('nickname')[0];
  249.  
  250. if (nickInList != null) {
  251. nickInList.remove();
  252. }
  253.  
  254. while (document.getElementsByClassName('nicknamedUser' + userID)[0] != null) {
  255. document.getElementsByClassName('nicknamedUser' + userID)[0].previousSibling.nodeValue = document.getElementsByClassName('nicknamedUser' + userID)[0].previousSibling.nodeValue.slice(0, -1);
  256. document.getElementsByClassName('nicknamedUser' + userID)[0].remove();
  257. }
  258.  
  259. document.getElementById('unnickname_' + userID).style.display = 'none';
  260.  
  261. opts.ipc_nickname_list.splice(i, 1);
  262.  
  263. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  264. getNicknamedUsers();
  265. }
  266.  
  267. function createNicknameOptions(reference) {
  268. if (document.getElementById(reference.id + '_menucontent').getElementsByTagName('a')[0] == null) {
  269. return false;
  270. }
  271.  
  272. var userID = reference.parentNode.parentNode.getElementsByTagName('a')[0].id.split('link_')[1],
  273. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  274. nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
  275. changeNicknameOption,
  276. removeNicknameOption,
  277. menuParent = document.getElementById(reference.id + '_menucontent'),
  278. username = reference.getElementsByTagName('span')[0].textContent.trim(),
  279. isNicknamed = false,
  280. i = 0;
  281.  
  282. changeNicknameOption = createElement('li', function(option) {
  283. option.setAttribute('style', 'z-index: 10000;');
  284. option.appendChild(createElement('a', function(link) {
  285. link.href = 'javascript:void(0)';
  286. link.className = 'nickname_user';
  287. link.id = 'nickname_' + userID;
  288. link.title = 'Add/Change Nickname';
  289. link.setAttribute('style', 'z-index: 10000;');
  290.  
  291. link.appendChild(createElement('img', function(icon) {
  292. icon.src = 'http://i.minus.com/iRdCI3MO4Vlvn.png';
  293. icon.alt = 'Icon';
  294. icon.style.zIndex = 10000;
  295. icon.style.height = '16px';
  296. }));
  297.  
  298. link.appendChild(document.createTextNode(' Add/Change Nickname'));
  299.  
  300. link.onclick = function() {
  301. var user = this.id.split('nickname_')[1],
  302. nickRequest = createElement('div', function(request) {
  303. request.id = 'nick_request';
  304. request.className = 'MakazeScriptMenu';
  305. request.style.display = 'none';
  306.  
  307. request.appendChild(createElement('h3', function(title) {
  308. title.appendChild(document.createTextNode('New nickname for: '));
  309. title.appendChild(createElement('span', function(usrname) {
  310. usrname.id = 'nick_request_user';
  311. usrname.appendChild(document.createTextNode(username));
  312. }));
  313. }));
  314.  
  315. request.appendChild(createElement('div', function(cont) {
  316. cont.appendChild(createElement('input', function(input) {
  317. input.id = 'nick_request-new_nick';
  318. input.type = 'text';
  319. input.style.width = '100%';
  320. input.placeholder = 'New nickname';
  321. input.addEventListener('keydown', function(e) {
  322. if (e.keyCode === 13) {
  323. document.getElementById('nick_request_submit').click();
  324. }
  325. }, false);
  326. }));
  327. }));
  328.  
  329. request.appendChild(createElement('div', function(footer) {
  330. footer.className = 'submitButtons';
  331.  
  332. footer.appendChild(createElement('a', function(okay) {
  333. okay.id = 'nick_request_submit';
  334. okay.className = 'ipsButton_secondary';
  335. okay.style.marginRight = '5px';
  336. okay.href = 'javascript:void(0)';
  337. okay.title = 'OK';
  338. okay.appendChild(document.createTextNode('OK'));
  339. okay.onclick = function() {
  340. nickname(user, document.getElementById('nick_request-new_nick').value, reference);
  341.  
  342. fade(document.getElementById('nick_request'), 'out');
  343. setTimeout(function() {
  344. document.getElementById('nick_request').remove();
  345. }, 310);
  346. };
  347. }));
  348.  
  349. footer.appendChild(createElement('a', function(cancel) {
  350. cancel.className = 'ipsButton_secondary';
  351. cancel.href = 'javascript:void(0)';
  352. cancel.title = 'Cancel';
  353. cancel.appendChild(document.createTextNode('Cancel'));
  354. cancel.onclick = function() {
  355. fade(document.getElementById('nick_request'), 'out');
  356. setTimeout(function() {
  357. document.getElementById('nick_request').remove();
  358. }, 310);
  359. };
  360. }));
  361. }));
  362. });
  363. document.body.appendChild(nickRequest);
  364.  
  365. fade(document.getElementById('nick_request'), 'in');
  366.  
  367. document.getElementById('nick_request-new_nick').focus();
  368. };
  369. }));
  370. });
  371.  
  372. for (i = 0; i < nicknameList.length; i++) {
  373. if (nicknameList[i].user === userID) {
  374. isNicknamed = true;
  375. break;
  376. }
  377. }
  378.  
  379. menuParent.appendChild(changeNicknameOption);
  380.  
  381. removeNicknameOption = createElement('li', function(option) {
  382. option.setAttribute('style', 'z-index: 10000;');
  383. option.appendChild(createElement('a', function(link) {
  384. link.href = 'javascript:void(0)';
  385. link.className = 'unnickname_user';
  386. link.id = 'unnickname_' + userID;
  387. link.title = 'Remove Nickname';
  388. link.setAttribute('style', 'z-index: 10000;');
  389. link.style.display = (isNicknamed) ? '' : 'none';
  390.  
  391. link.appendChild(createElement('img', function(icon) {
  392. icon.src = leaveImgSrc;
  393. icon.alt = 'Icon';
  394. icon.style.zIndex = 10000;
  395. }));
  396.  
  397. link.appendChild(document.createTextNode(' Remove Nickname'));
  398.  
  399. link.onclick = function() {
  400. var user = this.id.split('unnickname_')[1];
  401. removeNick(user, reference);
  402. };
  403. }));
  404. });
  405.  
  406. menuParent.appendChild(removeNicknameOption);
  407.  
  408. if (isNicknamed) {
  409. reference.appendChild(document.createTextNode(' '));
  410. reference.appendChild(createElement('span', function(span) {
  411. span.className = 'nickname';
  412. span.appendChild(document.createTextNode(nicknameList[i].nick));
  413. }));
  414.  
  415. if (nicknameList[i].name !== username) {
  416. opts.ipc_nickname_list[i].name = username;
  417. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  418. }
  419. }
  420. }
  421.  
  422. function getNicknamedUsers() {
  423. var container = document.getElementById('nicknamedUsers').getElementsByClassName('scrollableContent')[0],
  424. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  425. nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
  426. ID,
  427. username,
  428. nick,
  429. i = 0;
  430.  
  431. empty(container);
  432.  
  433. function createNick(id, name, nick) {
  434. return createElement('a', function(link) {
  435. link.setAttribute('data-userid', id);
  436. link.href = 'javascript:void(0)';
  437. link.title = 'Remove Nickname';
  438. link.style.whiteSpace = 'pre';
  439.  
  440. link.appendChild(createElement('img', function(img) {
  441. img.src = leaveImgSrc;
  442. }));
  443.  
  444. link.appendChild(document.createTextNode(' ' + nick + ' => ' + name));
  445.  
  446. link.onclick = function() {
  447. removeNick(id);
  448. fade(this, 'out');
  449. };
  450. });
  451. }
  452.  
  453. for (i = 0; i < nicknameList.length; i++) {
  454. ID = nicknameList[i].user;
  455. username = nicknameList[i].name;
  456. nick = nicknameList[i].nick;
  457.  
  458. container.appendChild(createNick(ID, username, nick));
  459. }
  460. }
  461.  
  462. if (document.body.id === 'ipboard_body' && document.getElementById('storage_chatroom') != null) {
  463. // Styling
  464.  
  465. if (document.getElementById('MakazeScriptStyles') == null) {
  466. MakazeScriptStyles = createElement('style', function(style) {
  467. style.id = 'MakazeScriptStyles';
  468. style.type = 'text/css';
  469. });
  470. document.head.appendChild(MakazeScriptStyles);
  471. }
  472.  
  473. styleElem = document.getElementById('MakazeScriptStyles');
  474.  
  475. if (styleElem.hasChildNodes()) {
  476. styleElem.childNodes[0].nodeValue += '\n\n';
  477. } else {
  478. styleElem.appendChild(document.createTextNode(''));
  479. }
  480.  
  481. if (!styleElem.childNodes[0].nodeValue.match('.MakazeScriptMenu')) {
  482. 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';
  483. }
  484.  
  485. styleElem.childNodes[0].nodeValue +=
  486. '#nicknamedUsers {\n' +
  487. 'margin-left: -168px;\n' +
  488. 'margin-top: -110px;\n' +
  489. '}\n\n' +
  490.  
  491. '#nicknamedUsers .scrollableContent > a {\n' +
  492. 'display: inline-block;\n' +
  493. 'background-color: #eee;\n' +
  494. 'box-shadow: 0px 0px 3px #aaa;\n' +
  495. 'border: 2px solid #fff;\n' +
  496. 'padding: 1px 4px;\n' +
  497. 'border-radius: 2px;\n' +
  498. 'margin-right: 10px;\n' +
  499. 'margin-bottom: 10px;\n' +
  500. 'font-size: 10px;\n' +
  501. '}\n\n' +
  502.  
  503. '#nicknamedUsers .scrollableContent > a > img {\n' +
  504. 'height: 12px;\n' +
  505. '}\n\n' +
  506.  
  507. '.nickname {\n' +
  508. 'font-weight: lighter;\n' +
  509. '}\n\n' +
  510.  
  511. '.nickname:before {\n' +
  512. 'content: \'(\'\n' +
  513. '}\n\n' +
  514.  
  515. '.nickname:after {\n' +
  516. 'content: \')\'\n' +
  517. '}\n\n' +
  518.  
  519. '#nick_request {\n' +
  520. 'width: 250px;\n' +
  521. 'margin-left: -135px;\n' +
  522. 'margin-top: -52px;\n' +
  523. '}\n\n' +
  524.  
  525. '#nick_request h3 {\n' +
  526. 'margin-bottom: 1em;\n' +
  527. '}\n\n' +
  528.  
  529. '#nick_request .submitButtons {\n' +
  530. 'text-align: right;\n' +
  531. 'margin-top: 10px;\n' +
  532. '}';
  533.  
  534. // Menu creation
  535.  
  536. nicknamedUsersMenu = createElement('div', function(menu) {
  537. menu.id = 'nicknamedUsers';
  538. menu.className = 'MakazeScriptMenu';
  539. menu.style.display = 'none';
  540.  
  541. menu.appendChild(createElement('div', function(title) {
  542. title.className = 'menuTitle';
  543. title.appendChild(document.createTextNode('Nicknames'));
  544. }));
  545.  
  546. menu.appendChild(createElement('div', function(scroll) {
  547. scroll.className = 'scrollableContent';
  548. }));
  549.  
  550. menu.appendChild(createElement('div', function(save) {
  551. save.className = 'menu-save';
  552.  
  553. save.appendChild(createElement('a', function(link) {
  554. link.href = 'javascript:void(0)';
  555. link.id = 'nicknamedUsers_close';
  556. link.appendChild(document.createTextNode('Close'));
  557. link.onclick = function() {
  558. fade(this.parentNode.parentNode, 'out');
  559. };
  560. }));
  561. }));
  562. });
  563.  
  564. document.body.appendChild(nicknamedUsersMenu);
  565.  
  566. // Button creation
  567.  
  568. if (document.getElementById('IPChatMenuItems') == null) {
  569. IPChatMenuItems = createElement('div', function(menu) {
  570. menu.id = 'IPChatMenuItems';
  571. menu.style.textAlign = 'right';
  572. });
  573. document.getElementById('chatters-online-wrap').nextSibling.nextSibling.getElementsByTagName('ul')[0].appendChild(IPChatMenuItems);
  574. }
  575.  
  576. if (document.getElementById('IPChatMenuItems').innerHTML.length) {
  577. document.getElementById('IPChatMenuItems').appendChild(document.createElement('br'));
  578. }
  579.  
  580. menuButton = createElement('a', function(button) {
  581. button.id = 'nicknamedUsersMenuButton';
  582. button.className = 'ipsButton_secondary';
  583. button.href = 'javascript:void(0)';
  584. button.style.marginTop = '10px';
  585. button.appendChild(document.createTextNode('Manage Nicknames'));
  586.  
  587. button.onclick = function() {
  588. var menu = document.getElementById('nicknamedUsers');
  589.  
  590. if (menu.style.display === 'none') {
  591. getNicknamedUsers();
  592. }
  593.  
  594. fade(menu);
  595. };
  596. });
  597. document.getElementById('IPChatMenuItems').appendChild(menuButton);
  598.  
  599. // Get leaving image source
  600.  
  601. leaveImgSrc = document.getElementById('leave_room').getElementsByTagName('img')[0].src;
  602.  
  603. // Add nicknaming links
  604.  
  605. if (document.getElementById('chatters-online-wrap') != null) {
  606. for (i = 0; i < document.getElementById('chatters-online-wrap').getElementsByClassName('chatmodmenu').length; i++) {
  607. reference = document.getElementById('chatters-online-wrap').getElementsByClassName('chatmodmenu')[i];
  608. createNicknameOptions(reference);
  609. }
  610. }
  611.  
  612. document.addEventListener('DOMNodeInserted', function(event) {
  613. // Add nicknaming links to new users
  614.  
  615. if (event.target.nodeType === 1 && Classes.hasClass(event.target, 'kickmenu')) {
  616. var checkForPartner = setInterval(function() {
  617. var link = document.getElementById(event.target.id.split('_menucontent')[0]);
  618. if (link != null) {
  619. createNicknameOptions(link);
  620. clearTimeout(checkForPartner);
  621. }
  622. }, 1);
  623. return false;
  624. }
  625.  
  626. // Nickname users in chat
  627.  
  628. if (event.target.nodeType !== 1 || event.target.id !== 'storage_chatroom') {
  629. return false;
  630. }
  631.  
  632. var opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  633. nicknameList = (opts.hasOwnProperty('ipc_nickname_list')) ? opts.ipc_nickname_list : [],
  634. latestNick,
  635. i = 0;
  636.  
  637. if (!nicknameList.length) {
  638. return false;
  639. }
  640.  
  641. latestNick = event.target.parentNode.getElementsByTagName('label')[event.target.parentNode.getElementsByTagName('label').length - 1];
  642.  
  643. if (!Classes.hasClass(latestNick.parentNode, 'post')) {
  644. return false;
  645. }
  646.  
  647. if (latestNick.getElementsByClassName('nickname')[0] != null) {
  648. return false;
  649. }
  650.  
  651. function createNickInChat(index) {
  652. return createElement('span', function(span) {
  653. span.className = 'nickname nicknamedUser' + nicknameList[index].user;
  654. span.appendChild(document.createTextNode(nicknameList[index].nick));
  655. });
  656. }
  657.  
  658. for (i = 0; i < nicknameList.length; i++) {
  659. if (nicknameList[i].name === latestNick.textContent.trim()) {
  660. latestNick.appendChild(document.createTextNode(' '));
  661. latestNick.appendChild(createNickInChat(i));
  662. break;
  663. }
  664. }
  665. });
  666. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址