您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Improves coomer.party
当前为
// ==UserScript== // @name coomer-optimizer // @namespace https://coomer.party/ // @version 2.1 // @description Improves coomer.party // @match https://coomer.party/* // @grant GM_addStyle // @license MIT // @homepage https://greasyfork.org/en/scripts/468758-coomer-optimizer // ==/UserScript== (function() { 'use strict'; const key = function(_usr) { return `copt_${_usr}`; } // Add the margin using CSS GM_addStyle('div.card-list__items { margin-right: 500px; }'); GM_addStyle('.user-card--dislike {border-color: hsl(0deg 100% 50%); border-style: solid; border-width: 2px; }'); const userURLMatch = window.location.pathname.match(/\/user\/([^/]+)$/); const postURLMatch = window.location.pathname.match(/\/user\/([^/]+)\/post/); let pageUser = false; let userPageCSSPrefix = false; if (userURLMatch) { pageUser = userURLMatch[1]; userPageCSSPrefix = 'user-header'; } else if (postURLMatch) { pageUser = postURLMatch[1]; userPageCSSPrefix = 'post'; } if (pageUser) { console.debug(`User page detected for ${pageUser}`); } let userCardsPage = document.querySelector('a.user-card') !== null; if (userCardsPage) { console.debug("User list page detected"); } if (pageUser) { GM_addStyle('span.user-header__dislike-icon::before { content: "\uD83D\uDC4E"; }'); let pageUserKey = key(pageUser); let summary = localStorage.getItem(pageUserKey); const today = new Date().toISOString().split('T')[0]; // Get the current date in ISO format let is_new = false; if (!summary) { summary = { visits: 1, previousVisit: false, lastVisit: today, disliked: false }; } else { summary = JSON.parse(summary); } if (summary.lastVisit !== today) { summary.visits += 1; summary.previousVisit = summary.lastVisit; summary.lastVisit = today; } localStorage.setItem(pageUserKey, JSON.stringify(summary)); console.debug(`user ${pageUser}`, summary); const summaryDiv = document.createElement('div'); summaryDiv.className = `${userPageCSSPrefix}__actions`; if (summary.previousVisit) { summaryDiv.innerHTML = `<h6>Visited ${summary.visits} times, last visit on ${summary.previousVisit}</h6>`; } else { summaryDiv.innerHTML = `<h6>First time visit</h6>`; } const actionsElement = document.querySelector(`div.${userPageCSSPrefix}__actions`); actionsElement.parentNode.insertBefore(summaryDiv, actionsElement); let dislikeButton = document.createElement('button'); dislikeButton.type = 'button'; dislikeButton.className = `${userPageCSSPrefix}__favourite`; let iconElement = document.createElement('span'); iconElement.className = '${userPageCSSPrefix}__fav-icon' iconElement.textContent = summary.disliked ? '👍🏻' : '👎'; dislikeButton.appendChild(iconElement); let textElement = document.createElement('span'); textElement.className = `${userPageCSSPrefix}__fav-text`; textElement.textContent = summary.disliked ? 'Un-dislike' : 'Dislike'; dislikeButton.appendChild(textElement); dislikeButton.addEventListener('click', () => { summary.disliked = !summary.disliked; localStorage.setItem(pageUserKey, JSON.stringify(summary)); iconElement.textContent = summary.disliked ? '👍🏻' : '👎'; textElement.textContent = summary.disliked ? 'Un-dislike' : 'Dislike'; }); actionsElement.appendChild(dislikeButton); } // bottom header repeater let navMenu = document.querySelector('nav.post__nav-links'); let bottomHeader = document.querySelector('footer.post__footer > h2.site-section__subheading'); if (navMenu && bottomHeader) { bottomHeader.parentNode.insertBefore(navMenu.cloneNode(true), bottomHeader); } let enrichUserCard = function(c) { let m = c.href.match(/user\/([^\/]+)/); if (m) { let userKey = key(m[1]); let summary = JSON.parse(localStorage.getItem(userKey)); if (summary) { console.debug('Found data', userKey, summary); c.className += ' co-parsed'; let serviceLabel = c.querySelector('span.user-card__service'); let visitedLabel = serviceLabel.cloneNode(true); visitedLabel.textContent = `# ${summary.visits}`; visitedLabel.style.marginLeft = '4px'; visitedLabel.style.backgroundColor = 'rgb(240, 140, 207)'; serviceLabel.insertAdjacentElement('afterend', visitedLabel); if (summary.previousVisit) { let daysAfterLabel = visitedLabel.cloneNode(true); let daysFromLastVisit = Math.floor((new Date() - new Date(summary.previousVisit)) / (1000 * 60 * 60 * 24)); daysAfterLabel.textContent = `📅 ${daysFromLastVisit}` daysAfterLabel.title = `Last visit on ${summary.previousVisit}`; visitedLabel.insertAdjacentElement('afterend', daysAfterLabel); } if (summary.disliked) { c.className += ' user-card--dislike'; } } else { console.debug(`No enrichment for user ${m[1]}`); } } } // check if there is at least 1 user card --> list pages if (document.querySelector('a.user-card')) { console.debug('Initializing observer'); // Callback function for the MutationObserver function mutationCallback(mutationsList, observer) { for (const mutation of mutationsList) { if (mutation.type === 'childList') { // Process newly added user cards mutation.addedNodes.forEach(node => { if (node.tagName === 'A' && node.classList.contains('user-card') && !node.classList.contains('co-parsed')) { enrichUserCard(node); } }); } } } // Create a MutationObserver to watch for changes in the DOM const observer = new MutationObserver(mutationCallback); // Define the options for the observer const observerOptions = { childList: true, subtree: true }; // Start observing the document body for changes observer.observe(document.body, observerOptions); } else { console.debug('No user cards page identified'); } })();