Created
September 3, 2025 21:00
-
-
Save qubodup/1bc7aca17fb7a25406bf2d8d7bfaac6f to your computer and use it in GitHub Desktop.
Revisions
-
qubodup created this gist
Sep 3, 2025 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,104 @@ // ==UserScript== // @name Freesound Mod DELETE USERNAME // @namespace http://tampermonkey.net/ // @version 2025-09-03 // @description Automate moderation checks with page redirection // @include /^https:\/\/freesound\.org\/tickets\/moderation\/assigned\/\d+\/(?:\?.*)?$/ // @grant none // ==/UserScript== (function() { 'use strict'; /******************** * CONFIG SECTION ********************/ const CONFIG = { username: 'USERNAME', // Username to search for pageNumber: 5, // Page to redirect to from base minMatches: 120, // Minimum times username must appear minCheckedBoxes: 60, // Minimum number of checkboxes required autoSubmit: false // Change to true if you want auto-submit enabled }; /********************/ const { href, origin, pathname } = window.location; // Require: /tickets/moderation/assigned/<digits>/ const m = pathname.match(/^\/tickets\/moderation\/assigned\/(\d+)\/$/); if (!m) return; const ticketId = m[1]; const baseUrl = `${origin}/tickets/moderation/assigned/${ticketId}/`; const url = new URL(href); const page = url.searchParams.get('page'); // Case 1: On base page (no ?page param) -> go to configured page if (!page) { console.log(`On base page, redirecting to page=${CONFIG.pageNumber}…`); window.location.replace(`${baseUrl}?page=${CONFIG.pageNumber}`); return; } // Case 2: If on configured page, run the existing logic if (page === String(CONFIG.pageNumber)) { const word = CONFIG.username; const bodyText = document.body.innerText; const count = (bodyText.match(new RegExp(word, 'g')) || []).length; console.log(`'${word}' found ${count} times on page`); if (count >= CONFIG.minMatches) { // Step 0 const targetLink = document.querySelector('#assigned-tickets-table tr:first-child td:nth-child(2) a'); if (targetLink) { const text = targetLink.textContent.trim(); console.log(`Step 0: Link text is "${text}"`); if (text !== word) { console.log(`Step 0 failed: expected "${word}", aborting`); return; } } else { console.log("Step 0 failed: target link not found, aborting"); return; } // Step 1 const selectOther = document.querySelector('#select-other'); if (selectOther) { selectOther.click(); const checkedBoxes = document.querySelectorAll('input[type="checkbox"]:checked').length; console.log(`${checkedBoxes} checkboxes are checked`); if (checkedBoxes < CONFIG.minCheckedBoxes) { console.log(`Less than ${CONFIG.minCheckedBoxes} checkboxes checked, aborting`); return; } } else { console.log("#select-other not found, aborting"); return; } // Step 2 const label = document.querySelector('label[for="id_action_1"].bw-radio-label'); const radio = document.querySelector('input#id_action_1'); if (label && radio) { label.click(); if (!radio.checked) { console.log("Radio button not selected, aborting"); return; } } else { console.log("Radio label or input not found, aborting"); return; } // Step 3 const submitBtn = document.querySelector('#moderate-form-wrapper > div > form > button[type="submit"]'); if (submitBtn && CONFIG.autoSubmit) { console.log("Auto-submitting form..."); submitBtn.click(); } else { console.log("Auto-submit disabled. Review manually."); } } } })();