Greasy Fork

Greasy Fork is available in English.

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

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

当前为 2022-07-26 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();