// ==UserScript== // @name NGA论坛AC娘表情包(明日方舟ver) // @namespace http://kayanoruiko.cc // @version 1.2.0 // @author kayanouriko // @description 为 NGA 论坛添加额外的表情包发送功能 // @homepage https://bbs.nga.cn/read.php?tid=32772711 // @icon https://ak.hypergryph.com/favicon.ico // @license MIT // @match *://bbs.nga.cn/thread.php?* // @match *://bbs.nga.cn/read.php?* // @match *://bbs.nga.cn/post.php?* // @match *://ngabbs.com/thread.php?* // @match *://ngabbs.com/read.php?* // @match *://ngabbs.com/post.php?* // @match *://nga.178.com/thread.php?* // @match *://nga.178.com/read.php?* // @match *://nga.178.com/post.php?* // @grant GM.setValue // @grant GM.getValue // @downloadURL none // ==/UserScript== "use strict"; const isValidkey = (key, object) => { return key in object; }; const main = { stickersMap: { 有何贵干: './mon_202207/22/-klbw3Q2q-jij8K5T8S2s-2s.gif', 呆: './mon_202207/22/-klbw3Q2q-5mbmK5T8S2s-2s.gif', 壁咚: './mon_202207/22/-klbw3Q2q-9iy2K5T8S2s-2s.gif', 哼: './mon_202207/22/-klbw3Q2q-g6sjK6T8S2s-2s.gif', goodjob: './mon_202207/22/-klbw3Q2q-cbsqK7T8S2s-2s.gif', 黑枪: './mon_202207/22/-klbw3Q2q-1odzK7T8S2s-2s.gif', 哭笑: './mon_202207/22/-klbw3Q2q-fl71K6T8S2s-2s.gif', 嘲笑: './mon_202207/22/-klbw3Q2q-90w2K6T8S2s-2s.gif', 咦: './mon_202207/23/-klbw3Q2q-6vorK7T8S2s-2s.gif', 闪光: './mon_202207/23/-klbw3Q2q-178sK6T8S28-2f.gif', 威吓: './mon_202207/25/-klbw3Q2q-krugK6T8S2n-2n.gif', 抢镜头: './mon_202207/25/-klbw3Q2q-9abvK5T8S2s-2s.gif', 恨: './mon_202207/26/-klbw3Q2q-db9rK6T8S2s-2s.gif', 恨2: './mon_202207/26/-klbw3Q2q-6mvpK6T8S2s-2s.gif', 羡慕: './mon_202207/26/-klbw3Q2q-ik14K5T8S2d-1y.gif' // 雪雉 }, init() { this.addObserver(); this.onload(); }, addObserver() { const callback = async (mutationList) => { const isReplace = await GM.getValue('acchan-stickers-replace', false); if (isReplace) { this.replaceAllMatchStickers(); } const mutation = mutationList.find(mutation => { return mutation.type === 'childList' && mutation.addedNodes.length < 2; }); mutation?.addedNodes.forEach(node => { const element = node; if (/^commonwindow\d+$/.test(element.id) && element.querySelector('.tip_title .title').innerText === '插入表情') { this.addButton(element.id); } }); }; const observer = new MutationObserver(callback); observer.observe(document.body, { childList: true, subtree: true }); }, addButton(boxId) { if (document.getElementById('acchan-arknights')) return; const lastButtonElement = document.querySelector(`#${boxId} .div3 .block_txt_big:last-child`); lastButtonElement?.insertAdjacentHTML('afterend', ``); document.getElementById('acchan-arknights')?.addEventListener('click', () => { this.buttonOnClickAction(); }); const lastDivElement = document.querySelector(`#${boxId} .div3 > span > div:last-child`); lastDivElement?.insertAdjacentHTML('afterend', ``); }, addStickers() { let html = ''; for (const key in this.stickersMap) { if (isValidkey(key, this.stickersMap)) { const sticker = this.stickersMap[key]; html += `${key}`; } } return html; }, async buttonOnClickAction() { const boxElement = document.getElementById('acchan-arknights-stickers'); if (boxElement) { if (boxElement.style.display === 'none') { boxElement.style.display = ''; const divs = boxElement.parentElement?.parentElement?.querySelectorAll('span > div:not(#acchan-arknights-stickers)'); divs?.forEach(node => { const element = node; element.style.display = 'none'; }); } const spanElement = boxElement.parentElement?.parentElement?.querySelector('div > span'); if (spanElement) { const isReplace = await GM.getValue('acchan-stickers-replace', false); const element = spanElement; element.innerHTML = `

降夜飞霜@NGA制作 `; const checkboxElement = document.getElementById('acchan-arknights-stickers-checkbox'); checkboxElement?.addEventListener('change', event => { const isChecked = event.target.checked; GM.setValue('acchan-stickers-replace', isChecked); }); } } }, async onload() { const isReplace = await GM.getValue('acchan-stickers-replace', false); if (!isReplace) return ''; window.onload = this.replaceAllMatchStickers(); }, replaceAllMatchStickers() { const images = document.querySelectorAll('img.smile_ac,img.smile_a2'); images.forEach(image => { const element = image; const alt = element.getAttribute('alt') ?? ''; if (isValidkey(alt, this.stickersMap)) { const sticker = this.stickersMap[alt]; element.setAttribute('src', `https://img.nga.178.com/attachments/${sticker.slice(2)}`); } }); } }; main.init();