您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Quickly search galleries. If you have that item in your own gallery, a notification will tell you at the top. From there, you can view your gallery as a visitor or quickly remove it to lend or sell.
// ==UserScript== // @name [GC] - Gallery Searcher // @namespace https://greasyfork.org/en/users/1186250-ashyash // @match https://www.grundos.cafe/* // @version 3.8 // @license MIT // @author AshyAsh // @icon https://img.icons8.com/?size=100&id=3uUsBYyGd39C&format=png&color=000000 // @description Quickly search galleries. If you have that item in your own gallery, a notification will tell you at the top. From there, you can view your gallery as a visitor or quickly remove it to lend or sell. // ==/UserScript== (function () { 'use strict'; const iconUrl = 'https://img.icons8.com/?size=100&id=3uUsBYyGd39C&format=png&color=000000'; // === 1. Add Market Wizard search icon to item search helpers === document.querySelectorAll('div.searchhelp').forEach(function (div) { let item = div.id; if (!item || !item.endsWith('-links')) return; item = item.trim().replace(/-links$/, ''); const encodedItem = encodeURIComponent(item).replace(/%20/g, '+'); const link = document.createElement('a'); link.href = `https://www.grundos.cafe/market/wizard/?submit=Search&query=${encodedItem}&area=1&search_method=1&min_price=&max_price=`; link.target = '_blank'; link.title = 'Search Advanced Market Wizard'; const img = document.createElement('img'); img.src = iconUrl; img.alt = 'Market Search'; img.style.cssText = 'width: 20px; height: 20px; margin-left: 4px; vertical-align: middle;'; link.appendChild(img); div.appendChild(link); }); // === 2. Market Wizard page logic === if (window.location.href.includes('/market/wizard/?submit=Search&query=')) { window.addEventListener('load', () => { const centerDiv = document.querySelector('div.center'); const galleryKeeper = document.querySelector('#galleryKeeper'); if (!centerDiv) return; // === 2a. Show gallery match messages with two links === const mineBlocks = Array.from(document.querySelectorAll('div.data.sw_mine')); if (mineBlocks.length >= 4) { const messages = []; for (let i = 0; i <= mineBlocks.length - 4; i += 4) { const userLink = mineBlocks[i].querySelector('a'); const itemName = mineBlocks[i + 1]?.textContent.trim(); const quantity = mineBlocks[i + 2]?.textContent.trim(); const galleryName = mineBlocks[i + 3]?.textContent.trim(); if (!userLink || !itemName || !quantity || !galleryName) continue; const fullGalleryUrl = userLink.getAttribute('href'); const urlObj = new URL(fullGalleryUrl, window.location.origin); const galleryId = urlObj.searchParams.get('gallery_id'); const removeUrl = `/gallery/?gallery_id=${galleryId}`; const msg = document.createElement('div'); msg.style.cssText = 'margin-top: 1rem; padding: 10px; border: 2px solid #4caf50; border-radius: 6px; background: #e8f5e9; color: #2e7d32; font-size: 16px; text-align: center;'; msg.innerHTML = ` 🌟 <strong>You have ${quantity} <i>${itemName}</i></strong> in your gallery ${galleryName} <p> <a href="${fullGalleryUrl}" style="color: #1b5e20; font-weight: bold;" target="_blank">view gallery</a> | <a href="${removeUrl}" style="color: #b71c1c; font-weight: bold;" target="_blank">remove from gallery</a> `; messages.push(msg); } if (messages.length) { messages.forEach(msg => centerDiv.parentNode.insertBefore(msg, centerDiv.nextSibling)); } } // === 2b. Clone gallery item and show as styled gallery card === const searchTitle = centerDiv.querySelector('p.mt-1 strong'); const searchedItem = searchTitle?.textContent?.replace('Searching for ... ', '')?.trim() || ''; if (!searchedItem || !galleryKeeper) return; const galleryItems = Array.from(document.querySelectorAll('.gallery_item')); const matches = galleryItems.filter(item => { const nameEl = item.querySelector('.gallery-item-name'); return nameEl && nameEl.textContent.trim().toLowerCase() === searchedItem.toLowerCase(); }); if (matches.length > 0) { const styledCard = document.createElement('div'); styledCard.style.cssText = ` background: #a5d6a7; border-radius: 6px; padding: 15px; margin: 20px 0; text-align: center; `; // clone content const matchClone = matches[0].cloneNode(true); matchClone.style.margin = 'auto'; styledCard.appendChild(matchClone); // Title above const title = document.createElement('div'); title.innerHTML = `<strong style="font-size: 18px;">This item is in your gallery</strong>`; title.style.cssText = 'margin-bottom: 10px; font-weight: bold;'; styledCard.insertBefore(title, matchClone); // Insert above galleryKeeper galleryKeeper.parentNode.insertBefore(styledCard, galleryKeeper); } }); } })();