ModrinthHelper

自动获取你的follow列表,并更改搜索页面follow的图标

目前为 2024-06-23 提交的版本。查看 最新版本

// ==UserScript==
// @name         ModrinthHelper
// @namespace    http://suzunemaiki.moe/
// @version      0.1
// @description  自动获取你的follow列表,并更改搜索页面follow的图标
// @author       SuzuneMaiki
// @match        http*://modrinth.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=modrinth.com
// @grant        none
// @license      MIT
// ==/UserScript==

(async function () {
    'use strict';
    let JSONFavourite = await getFavourite();
    setInterval(function () {
        let listNode = document.getElementsByClassName('project-card');
        for (let i = 0; i < listNode.length; i++) {
            let node = listNode[i];
            let nodeTitle = node.getElementsByClassName('title')[0].childNodes[0];
            let title = nodeTitle.childNodes[0].innerHTML;
            let boolFind = JSONFavourite[title];
            let favourite = node.childNodes[5].childNodes[1];
            let icon = document.createElement('a');
            if (boolFind) {
                icon.innerHTML = '❤️';
            } else {
                icon.innerHTML = '🤍';
            }
            /*icon.onclick = function () {
                changeFavourite(nodeTitle.href);
            };
            点击无效,原因不明
            */
            let replaced = favourite.childNodes[0];
            favourite.replaceChild(icon, replaced);
        }
    }, 1000);
    //获取页面工具,异步
    async function getPage(url) {
        return new Promise(function (resolve, reject) {
            let request = new XMLHttpRequest();
            request.open('get', url, true);
            request.send();
            request.onreadystatechange = function () {
                if (request.readyState == 4 && request.status == 200) {
                    let page = document.createElement('frame');
                    page.innerHTML = request.responseText;
                    resolve(page);
                }
            };
        });
    }
    //获取Follow列表
    async function getFavourite() {
        let pageFavourite = await getPage('/collection/following');
        let listFavourite = pageFavourite.getElementsByClassName('project-card');
        let JSONFavourite = {};
        for (let i = 0; i < listFavourite.length; i++) {
            let node = listFavourite[i];
            let name = node.ariaLabel;
            JSONFavourite[name] = 1;
        }
        return JSONFavourite;
    }
    //
    async function changeFavourite(url) {
        let page = await getPage(url);
        let button = page.getElementsByClassName('normal-page__sidebar')[0].getElementsByClassName('input-group')[0].getElementsByTagName('button')[0];
        //return button;
        button.dispatchEvent(
            new Event('click', {
                bubbles: true,
                cancelable: true,
                composed: true,
            })
        );
    }
})();