TXTbonk

Bonk!

目前為 2023-03-12 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         TXTbonk
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Bonk!
// @author       tharglet
// @license      MIT
// @match        https://myfigurecollection.net/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=myfigurecollection.net
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==
//Polyfill for GM_addStyle for Greasemonkey...
if(typeof GM_addStyle == 'undefined') {
    GM_addStyle = (aCss) => {
        'use strict';
        let head = document.getElementsByTagName('head')[0];
        if (head) {
            let style = document.createElement('style');
            style.setAttribute('type', 'text/css');
            style.textContent = aCss;
            head.appendChild(style);
            return style;
        }
        return null;
    };
}

GM_addStyle(`
.bonk_menu {
  position: relative;
  display: inline-block;
  cursor: pointer;
}

.bonk_menu-body {
  display: none;
  position: absolute;
  background-color: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  padding: 12px 16px;
  z-index: 1;
}

.bonk_alert {
  padding: 20px;
  font-size: 50px;
  background:#f7f7f7;
  border: 2px black solid;
  color: green;
  position:fixed;
  left:25%;
  top:40%;
}
`);

(function() {
    'use strict';
    // The default graphic
    let bonkGraphic = 'data:image/png;base64,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'
    // Array of {itemId: {toBonk: bool, date: Date}}
    let bonkables = JSON.parse(GM_getValue('txtbonk', '{}'));
    //Stores the alert timeout
    let alertDivTimeout;
    let ONE_WEEK_AGO = new Date(Date.now() - 604800000);

    // Main "bonk" action to change the image of a .TXT icon
    let bonk = (imgTag) => {
        imgTag.setAttribute('src', bonkGraphic);
    };

    // Saves if a NSFW+ item should be "bonked" or not to the cache array
    let saveBonkable = (itemId, toBonk) => {
        bonkables[itemId] = {toBonk: toBonk, date: (new Date()).toString()}
        GM_setValue("txtbonk", JSON.stringify(bonkables));
    };

    // Fetches the item page for a NSFW+ item and see if it should be "bonked"
    // The result is stored in the bonkables array so that items do not have to be constantly checked
    let fetchIfBonkable = (itemId, imgTag) => {
        fetch(`/item/${itemId}`).then((response) => {
                    return response.text();
                }).then((html) => {
                    var parser = new DOMParser();
                    var doc = parser.parseFromString(html, 'text/html');
                    var img = doc.querySelector('.item-picture');
                    if(!img) {
                        saveBonkable(itemId, true);
                        bonk(imgTag);
                    } else {
                        saveBonkable(itemId, false);
                    }
                }).catch(function (err) {
                    console.warn('Something went wrong.', err);
                });
    };

    // Function that scans the page for bonkable thumbnails
    let scanForBonkables = (icons, cacheReset) => {
        for(let icon of icons) {
            let imgTag = icon.getElementsByTagName('img')[0];
            if(imgTag.getAttribute('alt').startsWith('[NSFW+]')) {
                let metaTag = icon.getElementsByTagName('meta')[0];
                let itemId = metaTag.getAttribute('content').substring(2);
                let bonkable = bonkables[itemId];
                if(bonkable) {
                    if(new Date(bonkable.date) < ONE_WEEK_AGO || cacheReset) {
                        fetchIfBonkable(itemId, imgTag);
                    } else if(bonkable.toBonk) {
                        bonk(imgTag);
                    }
                } else {
                    fetchIfBonkable(itemId, imgTag);
                }
            }
        };
    }

    // Toggle menu display on click
    let clickBonkMenu = () => {
        let bonkMenu = document.querySelector('.bonk_menu-body');
        if(bonkMenu.style.display === 'block') {
            bonkMenu.style.display = 'none';
        } else {
            bonkMenu.style.display = 'block';
        }
    }

    // Hides the alert div
    let hideAlertDiv = () => {
        let alertDiv = document.querySelector('.bonk_alert');
        alertDiv.style.display = 'none';
        if(alertDivTimeout) {
            window.clearTimeout(alertDivTimeout);
        }
    }

    // Shows the alert div with given message
    let showAlertDiv = (message) => {
        if(alertDivTimeout) {
            window.clearTimeout(alertDivTimeout);
        }
        let alertDiv = document.querySelector('.bonk_alert');
        alertDiv.innerText = message;
        alertDiv.style.display = 'block';
        alertDivTimeout = window.setTimeout(hideAlertDiv, 5000);
    }

    // Scans page again for bonkables
    let resetCache = () => {
        scanForBonkables(icons, true);
        showAlertDiv('Refreshed');
    }

    // Sets up the alert div for displaying messages
    let setupAlertDiv = () => {
        let alertDiv = document.createElement('div');
        alertDiv.classList.add('bonk_alert');
        alertDiv.style.display = 'none';
        alertDiv.addEventListener('click', hideAlertDiv, false);
        let innerText = document.createTextNode('bonk');
        alertDiv.appendChild(innerText);
        let body = document.querySelector('body');
        body.appendChild(alertDiv);
    }

    // Sets up the bonkable menu
    let setupMenu = () => {
        let pageMenuDesktop = document.querySelector('.h1-meta-actions.desktop');
        if(!pageMenuDesktop) {
            pageMenuDesktop = document.querySelector('.h1-meta-actions');
        }
        let pageMenuMobile = document.querySelector('.h1-meta-actions.mobile');

        let menuContainer = document.createElement('a');
        menuContainer.classList.add('bonk_menu', 'action');
        menuContainer.addEventListener('click', clickBonkMenu, false);
        let innerSpanIcon = document.createElement('span');
        innerSpanIcon.classList.add('icon', 'icon-sliders');
        let innerText = document.createTextNode('Bonk!');
        menuContainer.appendChild(innerSpanIcon);
        menuContainer.appendChild(innerText);
        pageMenuDesktop.appendChild(menuContainer);

        let menuBody = document.createElement('div');
        menuBody.classList.add('bonk_menu-body');
        let menuItemsUl = document.createElement('ul');
        let resetCacheLi = document.createElement('li');
        let resetCacheText = document.createTextNode('Reset cache & and reload for this page');
        resetCacheLi.appendChild(resetCacheText);
        resetCacheLi.addEventListener('click', resetCache, false);
        menuItemsUl.appendChild(resetCacheLi);

        menuBody.appendChild(menuItemsUl);
        menuContainer.appendChild(menuBody);

        if(pageMenuMobile) {
            //Setup mobile menu
        }

    }

    // Bonk initialisation
    let icons = document.getElementsByClassName('item-icon');
    if(icons) {
        setupMenu();
        setupAlertDiv();
        scanForBonkables(icons, false);
    }
})();