// ==UserScript== // @name Neopets - Rubbish Dump Auto-buyer // @namespace https://www.scriptneo.com/ // @version 1.0.1 // @description Auto-buy selected Rubbish Dump items, log success/fail results, and return after attempts. // @author Scriptneo.com // @match https://www.neopets.com/medieval/rubbishdump.phtml* // @match https://www.neopets.com/takedonation_new.phtml* // @grant none // @downloadURL https://www.scriptneo.com/scripts/download.php?id=36 // @updateURL https://www.scriptneo.com/scripts/download.php?id=36 // ==/UserScript== (function() { "use strict"; const SCRIPT_KEY = "rubbishDumpAutoClicker"; const DUMP_URL = "https://www.neopets.com/medieval/rubbishdump.phtml"; const DEFAULT_ITEMS = [ "Blue Paint Brush", "Darigan Paint Brush", "Dragoyle", "Dung Catapult", "Enchanted Kiko Squeeze Toy", "Everlasting Apple", "Fading Bottled Air Faerie", "Fading Bottled Dark Faerie", "Fading Bottled Earth Faerie", "Fading Bottled Fire Faerie", "Fading Bottled Light Faerie", "Fading Bottled Water Faerie", "Jhudora the Dark Faerie Doll", "Mortog", "Silver Paint Brush", "Turmac", "Turtum", "Whinny" ]; const DEFAULT_SETTINGS = { enabled: false, minSeconds: 5, maxSeconds: 10, dailyLimit: 10, items: DEFAULT_ITEMS, caseSensitive: false, exactMatch: true, redirectDelayMs: 1200, maxLogEntries: 150 }; let refreshTimer = null; function getTodayKey() { const date = new Date(); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); return `${year}-${month}-${day}`; } function getDailyCounter() { try { const saved = JSON.parse(localStorage.getItem(`${SCRIPT_KEY}:dailyCounter`) || "{}"); const today = getTodayKey(); if (!saved.date || saved.date !== today) { return { date: today, successes: 0 }; } return { date: saved.date, successes: parseInt(saved.successes, 10) || 0 }; } catch (e) { return { date: getTodayKey(), successes: 0 }; } } function saveDailyCounter(counter) { localStorage.setItem(`${SCRIPT_KEY}:dailyCounter`, JSON.stringify(counter)); updateCounterDisplay(); } function incrementDailySuccessCounter() { const counter = getDailyCounter(); counter.successes += 1; saveDailyCounter(counter); return counter.successes; } function resetDailyCounter() { const counter = { date: getTodayKey(), successes: 0 }; saveDailyCounter(counter); updateStatus("Daily counter reset"); } function hasReachedDailyLimit() { const settings = loadSettings(); const counter = getDailyCounter(); const limit = parseInt(settings.dailyLimit, 10) || 10; return counter.successes >= limit; } function enforceDailyLimit() { if (!hasReachedDailyLimit()) { return false; } const settings = loadSettings(); const counter = getDailyCounter(); const limit = parseInt(settings.dailyLimit, 10) || 10; settings.enabled = false; saveSettings(settings); clearScheduledRefresh(); updateToggleButtons(); updateCounterDisplay(); updateStatus(`Daily limit reached: ${counter.successes}/${limit}. Stopped.`); return true; } function loadSettings() { try { const saved = JSON.parse(localStorage.getItem(`${SCRIPT_KEY}:settings`) || "{}"); const settings = Object.assign({}, DEFAULT_SETTINGS, saved); if (!Array.isArray(settings.items) || !settings.items.length) { settings.items = DEFAULT_ITEMS; } if (!settings.dailyLimit || parseInt(settings.dailyLimit, 10) < 1) { settings.dailyLimit = 10; } return settings; } catch (e) { return Object.assign({}, DEFAULT_SETTINGS); } } function saveSettings(settings) { localStorage.setItem(`${SCRIPT_KEY}:settings`, JSON.stringify(settings)); } function resetItemsToDefault() { const settings = loadSettings(); settings.items = DEFAULT_ITEMS; saveSettings(settings); const textarea = document.getElementById("rdac-items"); if (textarea) { textarea.value = DEFAULT_ITEMS.join("\n"); } updateStatus("Default item list restored"); } function getLog() { try { return JSON.parse(localStorage.getItem(`${SCRIPT_KEY}:log`) || "[]"); } catch (e) { return []; } } function saveLog(log) { const settings = loadSettings(); const trimmed = log.slice(0, settings.maxLogEntries || 150); localStorage.setItem(`${SCRIPT_KEY}:log`, JSON.stringify(trimmed)); } function addLog(type, itemName, message, url) { const log = getLog(); log.unshift({ type: type, itemName: itemName || "Unknown Item", message: message || "", url: url || location.href, time: new Date().toLocaleString() }); saveLog(log); renderLog(); } function clearLog() { localStorage.removeItem(`${SCRIPT_KEY}:log`); renderLog(); } function normalizeText(text, caseSensitive) { text = String(text || "").trim(); if (!caseSensitive) { text = text.toLowerCase(); } return text; } function getWantedItems(settings) { if (Array.isArray(settings.items)) { return settings.items .map(item => String(item || "").trim()) .filter(Boolean); } return []; } function itemMatches(itemName, wantedItems, settings) { const cleanItemName = normalizeText(itemName, settings.caseSensitive); return wantedItems.some(wanted => { const cleanWanted = normalizeText(wanted, settings.caseSensitive); if (settings.exactMatch) { return cleanItemName === cleanWanted; } return cleanItemName.includes(cleanWanted); }); } function getRandomDelay(settings) { let min = parseInt(settings.minSeconds, 10); let max = parseInt(settings.maxSeconds, 10); if (isNaN(min) || min < 1) { min = DEFAULT_SETTINGS.minSeconds; } if (isNaN(max) || max < 1) { max = DEFAULT_SETTINGS.maxSeconds; } if (max < min) { const temp = min; min = max; max = temp; } const seconds = Math.floor(Math.random() * (max - min + 1)) + min; return seconds * 1000; } function scheduleRefresh() { clearScheduledRefresh(); const settings = loadSettings(); if (!settings.enabled) { updateStatus("Stopped"); return; } if (enforceDailyLimit()) { return; } const delay = getRandomDelay(settings); const seconds = Math.round(delay / 1000); updateStatus(`Refreshing in ${seconds} seconds`); refreshTimer = setTimeout(() => { const latestSettings = loadSettings(); if (latestSettings.enabled && !hasReachedDailyLimit()) { location.href = DUMP_URL; } else { enforceDailyLimit(); } }, delay); } function clearScheduledRefresh() { if (refreshTimer) { clearTimeout(refreshTimer); refreshTimer = null; } } function findMatchingDumpItems() { const settings = loadSettings(); const wantedItems = getWantedItems(settings); const matches = []; if (!wantedItems.length) { return matches; } const links = Array.from(document.querySelectorAll('a[href*="takedonation_new.phtml"]')); links.forEach(link => { const cell = link.closest("td"); if (!cell) { return; } const boldTags = Array.from(cell.querySelectorAll("b")); let itemName = ""; for (const bold of boldTags) { const text = bold.textContent.trim(); const lower = text.toLowerCase(); if ( text && lower !== "oops!" && !lower.includes("yeah") && !lower.includes("you got it") ) { itemName = text; break; } } if (!itemName) { return; } if (itemMatches(itemName, wantedItems, settings)) { matches.push({ itemName: itemName, link: link, href: link.href }); } }); return matches; } function clickMatchingItemIfAvailable() { const settings = loadSettings(); if (!settings.enabled) { scheduleRefresh(); return; } if (enforceDailyLimit()) { return; } const matches = findMatchingDumpItems(); if (!matches.length) { scheduleRefresh(); return; } const selected = matches[0]; addLog("attempt", selected.itemName, "Attempting to take item.", selected.href); updateStatus(`Attempting: ${selected.itemName}`); sessionStorage.setItem(`${SCRIPT_KEY}:lastAttemptItem`, selected.itemName); setTimeout(() => { location.href = selected.href; }, 250); } function detectResultPage() { const bodyText = document.body ? document.body.textContent : ""; const settings = loadSettings(); if (bodyText.includes("Yeah! You got it!") || bodyText.includes("Yeah! You got it!")) { const newCount = incrementDailySuccessCounter(); const limit = parseInt(settings.dailyLimit, 10) || 10; addLog("success", getAttemptedItemName(), `Successfully got the item. Daily count: ${newCount}/${limit}.`, location.href); updateStatus(`Success. Daily count: ${newCount}/${limit}.`); if (newCount >= limit) { settings.enabled = false; saveSettings(settings); updateToggleButtons(); updateStatus(`Daily limit reached: ${newCount}/${limit}. Stopped.`); setTimeout(() => { location.href = DUMP_URL; }, settings.redirectDelayMs || 1200); return true; } setTimeout(() => { location.href = DUMP_URL; }, settings.redirectDelayMs || 1200); return true; } if (bodyText.includes("Too late...somebody seems to have taken that item while you were pondering.")) { addLog("fail", getAttemptedItemName(), "Too late. Someone else took the item.", location.href); updateStatus("Failed. Returning to dump."); setTimeout(() => { location.href = DUMP_URL; }, settings.redirectDelayMs || 1200); return true; } return false; } function getAttemptedItemName() { const savedAttempt = sessionStorage.getItem(`${SCRIPT_KEY}:lastAttemptItem`); if (savedAttempt) { return savedAttempt; } const log = getLog(); const lastAttempt = log.find(entry => entry.type === "attempt"); if (lastAttempt && lastAttempt.itemName) { return lastAttempt.itemName; } return "Unknown Item"; } function startScript() { const settings = loadSettings(); if (hasReachedDailyLimit()) { const counter = getDailyCounter(); const limit = parseInt(settings.dailyLimit, 10) || 10; settings.enabled = false; saveSettings(settings); updateToggleButtons(); updateCounterDisplay(); updateStatus(`Daily limit already reached: ${counter.successes}/${limit}.`); return; } settings.enabled = true; saveSettings(settings); updateToggleButtons(); updateCounterDisplay(); updateStatus("Started"); if (isDumpPage()) { clickMatchingItemIfAvailable(); } else { location.href = DUMP_URL; } } function stopScript() { const settings = loadSettings(); settings.enabled = false; saveSettings(settings); clearScheduledRefresh(); updateToggleButtons(); updateStatus("Stopped"); } function isDumpPage() { return location.href.includes("/medieval/rubbishdump.phtml"); } function isTakeDonationPage() { return location.href.includes("/takedonation_new.phtml"); } function createUI() { if (document.getElementById("rdac-panel")) { return; } const settings = loadSettings(); const style = document.createElement("style"); style.textContent = ` #rdac-floating-btn { position: fixed; right: 16px; bottom: 16px; z-index: 999999; background: #2f6fed; color: #fff; border: 0; border-radius: 999px; padding: 10px 15px; font: 700 13px Arial, sans-serif; cursor: pointer; box-shadow: 0 4px 14px rgba(0,0,0,.25); } #rdac-modal-bg { position: fixed; inset: 0; background: rgba(0,0,0,.55); z-index: 999998; display: none; align-items: center; justify-content: center; } #rdac-panel { width: min(720px, calc(100vw - 28px)); max-height: calc(100vh - 28px); overflow: auto; background: #fff; color: #222; border-radius: 12px; box-shadow: 0 16px 45px rgba(0,0,0,.35); font: 13px Arial, sans-serif; } #rdac-panel * { box-sizing: border-box; } .rdac-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; background: #f2f5fb; border-bottom: 1px solid #d8dfec; border-radius: 12px 12px 0 0; } .rdac-header h3 { margin: 0; font-size: 16px; color: #172033; } .rdac-close { border: 0; background: #dfe6f5; color: #172033; border-radius: 8px; padding: 6px 9px; cursor: pointer; font-weight: 700; } .rdac-body { padding: 16px; } .rdac-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .rdac-field { margin-bottom: 12px; } .rdac-field label { display: block; font-weight: 700; margin-bottom: 5px; color: #263247; } .rdac-field input, .rdac-field textarea, .rdac-field select { width: 100%; border: 1px solid #c6cedd; border-radius: 8px; padding: 9px 10px; font: 13px Arial, sans-serif; background: #fff; color: #222; } .rdac-field textarea { min-height: 155px; resize: vertical; line-height: 1.35; } .rdac-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; } .rdac-btn { border: 0; border-radius: 8px; padding: 9px 12px; cursor: pointer; font-weight: 700; font-size: 13px; } .rdac-btn-primary { background: #2f6fed; color: #fff; } .rdac-btn-success { background: #1f8f4d; color: #fff; } .rdac-btn-danger { background: #c93535; color: #fff; } .rdac-btn-muted { background: #e8edf7; color: #172033; } #rdac-status, #rdac-counter { padding: 9px 10px; border-radius: 8px; background: #f7f8fb; border: 1px solid #d8dfec; margin-bottom: 12px; font-weight: 700; } #rdac-counter { background: #fff8e6; border-color: #f2d58a; color: #5c4100; } #rdac-log { margin-top: 14px; border: 1px solid #d8dfec; border-radius: 8px; overflow: hidden; max-height: 260px; overflow-y: auto; background: #fff; } .rdac-log-entry { padding: 9px 10px; border-bottom: 1px solid #eef1f6; line-height: 1.35; } .rdac-log-entry:last-child { border-bottom: 0; } .rdac-log-entry small { display: block; color: #667085; margin-top: 2px; } .rdac-type-success { color: #14783b; font-weight: 700; } .rdac-type-fail { color: #b42318; font-weight: 700; } .rdac-type-attempt { color: #175cd3; font-weight: 700; } @media (max-width: 560px) { .rdac-grid { grid-template-columns: 1fr; } } `; document.head.appendChild(style); const button = document.createElement("button"); button.id = "rdac-floating-btn"; button.type = "button"; button.textContent = "Rubbish Dump"; const modalBg = document.createElement("div"); modalBg.id = "rdac-modal-bg"; modalBg.innerHTML = `

Rubbish Dump Auto Clicker

Status: ${settings.enabled ? "Running" : "Stopped"}
Daily Counter: Loading...
`; document.body.appendChild(button); document.body.appendChild(modalBg); const itemTextarea = document.getElementById("rdac-items"); if (itemTextarea) { itemTextarea.value = getWantedItems(settings).join("\n"); } button.addEventListener("click", () => { modalBg.style.display = "flex"; renderLog(); updateToggleButtons(); updateCounterDisplay(); }); document.getElementById("rdac-close").addEventListener("click", () => { modalBg.style.display = "none"; }); modalBg.addEventListener("click", event => { if (event.target === modalBg) { modalBg.style.display = "none"; } }); document.getElementById("rdac-save").addEventListener("click", () => { saveSettingsFromUI(); updateCounterDisplay(); updateStatus("Settings saved"); }); document.getElementById("rdac-start").addEventListener("click", () => { saveSettingsFromUI(); startScript(); }); document.getElementById("rdac-stop").addEventListener("click", () => { stopScript(); }); document.getElementById("rdac-default-items").addEventListener("click", () => { resetItemsToDefault(); }); document.getElementById("rdac-reset-counter").addEventListener("click", () => { resetDailyCounter(); }); document.getElementById("rdac-clear-log").addEventListener("click", () => { clearLog(); }); updateToggleButtons(); updateCounterDisplay(); renderLog(); } function saveSettingsFromUI() { const settings = loadSettings(); settings.minSeconds = parseInt(document.getElementById("rdac-min").value, 10) || DEFAULT_SETTINGS.minSeconds; settings.maxSeconds = parseInt(document.getElementById("rdac-max").value, 10) || DEFAULT_SETTINGS.maxSeconds; settings.dailyLimit = parseInt(document.getElementById("rdac-daily-limit").value, 10) || DEFAULT_SETTINGS.dailyLimit; settings.items = document.getElementById("rdac-items").value .split(/\r?\n/) .map(item => item.trim()) .filter(Boolean); settings.exactMatch = document.getElementById("rdac-exact").value === "1"; settings.caseSensitive = document.getElementById("rdac-case").value === "1"; saveSettings(settings); } function updateStatus(message) { const status = document.getElementById("rdac-status"); if (status) { status.textContent = `Status: ${message}`; } } function updateCounterDisplay() { const counterBox = document.getElementById("rdac-counter"); if (!counterBox) { return; } const settings = loadSettings(); const counter = getDailyCounter(); const limit = parseInt(settings.dailyLimit, 10) || 10; const remaining = Math.max(0, limit - counter.successes); counterBox.textContent = `Daily Counter: ${counter.successes}/${limit} successful grabs today. Remaining: ${remaining}. Date: ${counter.date}`; } function updateToggleButtons() { const settings = loadSettings(); const startBtn = document.getElementById("rdac-start"); const stopBtn = document.getElementById("rdac-stop"); if (startBtn) { startBtn.disabled = !!settings.enabled; startBtn.style.opacity = settings.enabled ? "0.6" : "1"; } if (stopBtn) { stopBtn.disabled = !settings.enabled; stopBtn.style.opacity = settings.enabled ? "1" : "0.6"; } } function renderLog() { const logBox = document.getElementById("rdac-log"); if (!logBox) { return; } const log = getLog(); if (!log.length) { logBox.innerHTML = `
No log entries yet.
`; return; } logBox.innerHTML = log.map(entry => { const typeClass = `rdac-type-${escapeHtml(entry.type)}`; return `
${escapeHtml(String(entry.type).toUpperCase())} ${escapeHtml(entry.itemName)}
${escapeHtml(entry.message)}
${escapeHtml(entry.time)}
`; }).join(""); } function escapeHtml(value) { return String(value || "") .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll('"', """) .replaceAll("'", "'"); } function init() { createUI(); const settings = loadSettings(); if (isTakeDonationPage()) { detectResultPage(); return; } if (isDumpPage() && settings.enabled) { if (enforceDailyLimit()) { return; } setTimeout(() => { clickMatchingItemIfAvailable(); }, 500); } } init(); })();