Greasy Fork is available in English.
为 NGA 论坛添加额外的表情包发送功能
当前为
// ==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
// ==/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', `<button id="acchan-arknights" class="block_txt_big">AC娘(明日方舟ver)</button>`);
document.getElementById('acchan-arknights')?.addEventListener('click', () => {
this.buttonOnClickAction();
});
const lastDivElement = document.querySelector(`#${boxId} .div3 > span > div:last-child`);
lastDivElement?.insertAdjacentHTML('afterend', `<div id="acchan-arknights-stickers" style="display: none;">${this.addStickers()}</div>`);
},
addStickers() {
let html = '';
for (const key in this.stickersMap) {
if (isValidkey(key, this.stickersMap)) {
const sticker = this.stickersMap[key];
html += `<img height="60px" style="margin: 0px 2px;" onclick="postfunc.addText('[img]${sticker}[/img]');postfunc.selectSmilesw._.hide();" src="https://img.nga.178.com/attachments/${sticker.slice(2)}" alt="${key}" title="${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 = `
<p>
<input type="checkbox" id="acchan-arknights-stickers-checkbox" ${isReplace ? 'checked="checked"' : ''}>
<label for="acchan-arknights-stickers-checkbox">替换帖子内原版AC娘表情</label>
</p>
<a href="/read.php?tid=32772711" target="_blank" style="text-decoration: underline !important;color: rgb(189, 126, 109) !important;float:right !important;">降夜飞霜@NGA制作</a>
`;
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();