// ==UserScript== // @name ModrinthHelper // @namespace http://suzunemaiki.moe/ // @version 2024-06-23 // @description 自动获取你的follow列表,并更改搜索页面follow的图标 // @author SuzuneMaiki // @match http*://modrinth.com/mods?* // @match http*://modrinth.com/mods // @icon https://www.google.com/s2/favicons?sz=64&domain=modrinth.com // @grant none // @license MIT // @downloadURL none // ==/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, }) ); } })();