NGA论坛AC娘表情包(明日方舟ver)

为 NGA 论坛添加额外的表情包发送功能

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         NGA论坛AC娘表情包(明日方舟ver)
// @namespace    http://kayanoruiko.cc
// @version      1.3.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 main = {
    stickers: [
        {
            class: 'smile_a2',
            src: './mon_202207/22/-klbw3Q2q-jij8K5T8S2s-2s.gif',
            alt: '有何贵干',
            name: '灵知'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-5mbmK5T8S2s-2s.gif',
            alt: '呆',
            name: '闪灵'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/22/-klbw3Q2q-9iy2K5T8S2s-2s.gif',
            alt: '壁咚',
            name: '傀影'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-g6sjK6T8S2s-2s.gif',
            alt: '哼',
            name: '黑键'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-cbsqK7T8S2s-2s.gif',
            alt: 'goodjob',
            name: '莫斯提马'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-1odzK7T8S2s-2s.gif',
            alt: '黑枪',
            name: '安比尔'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-fl71K6T8S2s-2s.gif',
            alt: '哭笑',
            name: '老鲤'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/22/-klbw3Q2q-90w2K6T8S2s-2s.gif',
            alt: '嘲笑',
            name: '年'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/23/-klbw3Q2q-6vorK7T8S2s-2s.gif',
            alt: '咦',
            name: '非亚梅塔'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/23/-klbw3Q2q-178sK6T8S28-2f.gif',
            alt: '闪光',
            name: '银灰'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/25/-klbw3Q2q-krugK6T8S2n-2n.gif',
            alt: '威吓',
            name: '史尔特尔'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/25/-klbw3Q2q-9abvK5T8S2s-2s.gif',
            alt: '抢镜头',
            name: '阿米娅'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/26/-klbw3Q2q-db9rK6T8S2s-2s.gif',
            alt: '恨',
            name: '刻俄柏'
        },
        {
            class: '',
            src: './mon_202207/26/-klbw3Q2q-6mvpK6T8S2s-2s.gif',
            alt: '恨[饼]',
            name: '刻俄柏[饼]'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/26/-klbw3Q2q-ik14K5T8S2d-1y.gif',
            alt: '羡慕',
            name: '雪雉'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/31/-klbw3Q0-3piyK4T8S2i-2i.gif',
            alt: '怒',
            name: '送葬人'
        },
        {
            class: 'smile_a2',
            src: './mon_202207/31/-klbw3Q0-l8qzK7T8S2s-2s.gif',
            alt: 'lucky',
            name: '梅'
        },
        {
            class: 'smile_ac',
            src: './mon_202207/31/-klbw3Q0-e1z6K7T8S2s-2s.gif',
            alt: '怒',
            name: '伊芙利特'
        }
    ],
    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 sticker of this.stickers) {
            html += `<img height="60px" style="margin: 0px 2px;" onclick="postfunc.addText('[img]${sticker.src}[/img]');postfunc.selectSmilesw._.hide();" src="https://img.nga.178.com/attachments/${sticker.src.slice(2)}" alt="${sticker.name} ${sticker.alt}" title="${sticker.name} ${sticker.alt}">`;
        }
        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') ?? '';
            const className = element.getAttribute('class') ?? '';
            const sticker = this.stickers.find(e => {
                return e.class === className && e.alt === alt;
            });
            if (sticker) {
                element.setAttribute('src', `https://img.nga.178.com/attachments/${sticker.src.slice(2)}`);
            }
        });
    }
};
main.init();