Last active
November 4, 2025 03:13
-
-
Save xmoforf/226ec18bbff8b639d289841c96e0b6ee to your computer and use it in GitHub Desktop.
Book Stuff?
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 characters
| // ==UserScript== | |
| // @name MAM - WedgeWaster (Bookmark Edition) | |
| // @author WirlyWirly | |
| // @namespace https://github.com/xmoforf | |
| // @version 2.9.2 | |
| // @match https://www.myanonamouse.net/ | |
| // @match https://www.myanonamouse.net/index.php | |
| // @match https://www.myanonamouse.net/preferences/index.php* | |
| // @match https://www.myanonamouse.net/t/* | |
| // @match https://www.myanonamouse.net/tor/browse.php* | |
| // @icon https://www.myanonamouse.net/favicon.ico | |
| // @homepage https://gist.github.com/xmoforf/226ec18bbff8b639d289841c96e0b6ee | |
| // @updateURL https://gist.github.com/xmoforf/226ec18bbff8b639d289841c96e0b6ee/raw/WedgeMarker.user.js | |
| // @downloadURL https://gist.github.com/xmoforf/226ec18bbff8b639d289841c96e0b6ee/raw/WedgeMarker.user.js | |
| // @description Waste a wedge and not your time when bookmarking! | |
| // @grant GM.getValue | |
| // @grant GM.setValue | |
| // @run-at document-end | |
| // ==/UserScript== | |
| // ----------------------------------- CODE -------------------------------------- | |
| (async () => { | |
| // needed to initialize memory in the correct order | |
| const GRAB_ACTIONS = generateGrabActions(); | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // USER SETTINGS | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // ICONS | |
| const IMG_BUTTON_TO_CLICK = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAxCAYAAAAvOsB9AAAEsWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNDkiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTU2IgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI5Ny8xIgogICB0aWZmOllSZXNvbHV0aW9uPSI5Ny8xIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTU2IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDkiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0x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`; | |
| const IMG_ICON_SUCCESS = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGTSURBVEiJ7ZO7ThtBGEbPzBjbKCCRNwgSTxCFhksZAcI0KagRWDjcJCipED1NOipTIYtLHRuMRANI6VPzAAgvkYLjXXt3/hTYEpe1WRvo+Mpfo3Pm8g2855mo1wKtXax1l2+9dV+CSdcvJwORw73U7sarCGZOV/vifvUYGGzMHNfBaP3jxYI6vAh8uT+v2RpO5cbTbwEHMMpgCeLmLeAAXuARiF9SAJmTpa8gC1bkoxJdvPlztXUwfVDtFG5FKLnXwYd4IqUyxcVvAofca5Qg50G3N5Edyf5tFy5iKbmO32XM/N5kbkcLbPKorgo1HPuXLMyezfa+BA6ggU+h96AYMpVEviHpBN4Q/AoV1E9iKol8+mi5vxM4gNbWrgK3rSRa28tO4AB6e2z7txY9Djx50OfSgMd0VyYMfrfBer4fLw9bZfNAb9jCVvD91G622boH7YkqiQp/IogiaQceKmglaRfeVACQPlkY1aJ+Aj1w9/0dt9S0LW0LAOYKiwMmxkbN1j6Xq+WqEVnJTeXOosLfEyn/AWKDDrpj1jJOAAAAAElFTkSuQmCC`; | |
| const IMG_ICON_TO_CLICK_MAP = { | |
| bookmark: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+kLARYoN8+4YvkAAAPvSURBVEjH7VVtTFtlFH7ee2+/oB1UPnVTEljAbRBCpHNOjBlqiJIhJFuckR9Wl5oYY2T8WIBfZnOZmQkSTZyJRodTk20wN8ExxhqYwiYYqC0tOhhbWcfajumg9Lbee/u+/hi9FGHq/GNMPMn9ce45Oc9znnPe9wX+60ZW/ElQwfPcFkHgs3VaTcrsnBjU6zWXKGXdkqQ4/jGAIUmbn5f7wLGGBtsGS2kRM5mSeUJAGQPn8/mV7wed3K66/SOSrDQD+PyuWuE4kmO1VgeCge9kRj0s/g3+0M5c7k4l7s/eGoy0t7UoZWUlbgC1f1WXX5SFHDl2tKUoOzuDd//sjc2FwiTNvIr0D3piPMch5/4sDgB0Oq2wbl0e9/yOyvSNG4tqpqf9z01NXZ8F4LwjitFoKHx7/y7KqIfZz33JKndaWeVOK3OPnaKJ3UREB+0628q6zrZSWXIxRj1MDA/TE1+9TzdvLnYDeGGZMgAQDkeryss3AQCSDNqYUa9RrFWP0Py8NUtmNDcvEtdPXuZwX6HT/hkFAAwGPamqKidnuj/Jb29r+XTD+tzRROkIAPA895lj5PiO9HSzcDdzY2CyGI6EZFkxyrLCFEXhAoGbeGvfQaG/3zGm0wlb4gyHmppsD3GEk1JSTVzaPSlScnJS8t/CWKCpEYSw2bwKOp1OLwg819MzwDU0vluqMt675w0CQLfgavyBXzBxZZqWPVzIJVYM3riF64GbrLgwjySuuawoRo2wKMDly77FGSQmxmIUR09+y/a81wb7gGvZQfT6Arg4eY3F/d8kGbv3HULNq804d97J/pi/THMxEsWhjgsEIKh76ZllmlhKCmApKVC7YpRheiYEAsKCM7O3l2FuHq7Ri9RkMijxvKHEdbzq62PusVOq7w/0s48PN8cSc6au9tGunlYmSy4WER0sEBxQY/X1L8qCwNeoHRBCFvT9FQaDDmvuy1jCOhQSIUakJXIdPHwazkk/KGXs6SctRK/XqrFvOnu9ihI7rs6A57kUAOjuHWYDgx5Vx9C8iGhUYmtzV+O1l7cSAIhGJbzzQTuck34CAJ6J28Mcn7zGpnwBBgAHDuzOIYT0qQAEsVQAqN3+BKkoL1WZ7m05Qj/64vSSbmRFQe/IJZXEo5YHCQB0nBliXl8QAFBZ+bjQ1Gh7TJWotrbatNKS19ue5UBI4mYoJmOS8OGbVgw7J1h2phmWkgICAHWvVHMrXqIAkJWVpl0pmJlhRmZ6KvH7Z9i27a/fINz68ZNf29nqe9PJ1opNJF78z54CsnBVn2hssFXdKXPUPY7Ojt5iWaFOQkh3U6PtqRVO9BIwu/2COHD+x2T8b/+6/Q51R+mm2kvtHgAAAABJRU5ErkJggg==`, | |
| download: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPuSURBVEiJtVVrTFtlGH6+0gttodDCSsEWUguMIoYNurlFt5GZbE12wduymTkNBBf9NRNFk6ETkgWc0f0wC1FMFpfNwIyDKNvQZQEiGKdiM2Rc5DJoM0qlXNrT0uuhnz8WDjuUrWPq8+97n/c8z/t+ec/7EUop/k8IHiaJEJLwqAZktQ4IITqxWFghl4v2yyTCNKNRHfF6QwG3J8C4mcBFu93zGaXUv2YDQki8NkNx1qBX7Xxh/xPK3TsN4vU5qRwfiVBcbOkL1Z3ucrjdgUbbHXcdpdT9UAaEEKM+S9lcf3qf3vxstiRWZVeu/cVW13U6Zma9Vyds7g8opdP3NSCEGDYUaLraLr2arklb23X/9LM1UnXyumNykuket82/Sym18gwAEH2W8o+Oy2Ubs3TJaxK/F5beKRyvueYYHpu7OW6df5tSOgAARKtVHHujbHNtxZEi2SOrA0hMlEAijkPXL1acqG2ft91xDdmnfG+RHINqIDNdbszOUvwbfZRseQz5OSrUn+/jYm2dtgApfnLdXE9LqXItYrOuIFRJEhDy4LxdZT8yApU8Lg7hMI+w2b1oaByEwxk96h03plBafhX2/ims/IXCbIR3XlgIegRCAUTw+bjgt2238V5NN+K9frjGnVEGv/dO47BZiw+/vAVL/wwXb7o8huK9zTjXPMLLv7sqIsvOF1pG8FV1EV4p1SHkDaP2jIX3wdGXjRh1slifr0ZxQSpiQbgy8HimAiM2LwoMClzpmUbRU1oen6wQ49OqrVFCh/Ya8KJZD5GQv96ill3l0ULUt07i+eM9CEtE2L1dF7PKJdwrfsMyHXF5wn9HdZCulqH+5LaYYj4/i/dP/YrB0XmUH8jFgdJcjvMHWByp7BwctTIlUR2wi/xJmHMFsaf8BzQ0DfHi51uGsTk3Ad/UmLA1Q4rfLA6O8yyEAdBpSqmHM2C8YZj2NcO05xJvOoYn3PAvhNB6fYJn0Ds4i+1FKUhMEsK3yOLMuX6OU6dIUfZS3oaCHFVTXI4uoeqwWSfq7mcw52Rg3pSGvjEGO7ZkAAC0GjkM+iRUHMyDTLp8oxq1HJWfWBAvEuDjxjEcqyhEZsbyoty2SSP9+vtRJTemOzamgBUI0XFrHmUH83jVPmPSIFUZj2BokYsVF6Tii49KMMOK8PmpEjxt0qy8bQCAMMRGggCkQp8XZ0+YAJHoLhMMckmsIA7PvdnuGLrtsifIRetaG3bpdOlypKtleP1Q3qrCSyAlJnV1okz4TppKIr5fktXh9/05wrzmmFn4jhCiKzSmtOdnJ8fcjjcHZp1LD44UQNoDchlK6RxXFSEyAOpYBgCcqz76/yX+AbrdiORE+q5tAAAAAElFTkSuQmCC`, | |
| }; | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // SETTINGS | |
| async function clearSettings() { | |
| await GM.deleteValue("wasteAction"); | |
| await GM.deleteValue("freeleechFailAction"); | |
| window.location.reload(); | |
| } | |
| // Basic user interface window to select settings | |
| function promptDropdown(label, options, defaultValue) { | |
| return new Promise((resolve) => { | |
| // Create modal elements | |
| const modal = document.createElement("div"); | |
| modal.style = ` | |
| position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; | |
| background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 10000; | |
| `; | |
| const box = document.createElement("div"); | |
| box.style = `padding: 16px; border-radius: 6px; min-width: 220px; border: 1px solid white`; | |
| box.innerHTML = `<label>${label}</label><br><br>`; | |
| box.style.backgroundColor = getComputedStyle( | |
| document.body, | |
| ).backgroundColor; | |
| const select = document.createElement("select"); | |
| for (const opt of options) { | |
| let option = document.createElement("option"); | |
| option.value = opt; | |
| option.textContent = opt; | |
| if (opt === defaultValue) option.selected = true; | |
| select.appendChild(option); | |
| } | |
| const okButton = document.createElement("button"); | |
| okButton.textContent = "OK"; | |
| okButton.style = "margin-left:10px;"; | |
| box.appendChild(select); | |
| box.appendChild(okButton); | |
| modal.appendChild(box); | |
| document.body.appendChild(modal); | |
| okButton.onclick = () => { | |
| resolve(select.value); | |
| document.body.removeChild(modal); | |
| }; | |
| }); | |
| } | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // GRABBING | |
| async function getGrabAction() { | |
| const storageKey = "wasteAction"; | |
| const grabChoices = Object.keys(GRAB_ACTIONS); | |
| let choice = await GM.getValue(storageKey, null); | |
| if (grabChoices.includes(choice)) { | |
| return choice; | |
| } else { | |
| choice = await promptDropdown( | |
| "What action do you want to take when Wedge Wasting?", | |
| grabChoices, | |
| grabChoices[0], | |
| ); | |
| await GM.setValue(storageKey, choice); | |
| return choice; | |
| } | |
| } | |
| function generateGrabActions() { | |
| return { | |
| bookmark: (id, url) => { | |
| // eslint-disable-next-line no-undef | |
| bookmarkClick("add", id); // bookmark | |
| }, | |
| download: (id, url) => { | |
| window.location = url; // download | |
| }, | |
| }; | |
| } | |
| const GRAB_ACTION = await getGrabAction(); | |
| const grabTorrent = GRAB_ACTIONS[GRAB_ACTION] ?? ((id, url) => {}); | |
| const IMG_ICON_TO_CLICK = IMG_ICON_TO_CLICK_MAP[GRAB_ACTION]; | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // PURCHASE FAILURE | |
| async function getPurchaseFailAction() { | |
| const storageKey = "freeleechFailAction"; | |
| let choice = await GM.getValue(storageKey, null); | |
| if (choice === null) { | |
| let rawChoice = await promptDropdown( | |
| "Do you want to grab the torrent if the freeleech purchase fails?", | |
| ["Yes", "No"], | |
| ["Yes"], | |
| ); | |
| choice = { Yes: "act", No: "dontAct" }[rawChoice] ?? null; | |
| await GM.setValue(storageKey, choice); | |
| } | |
| return choice; | |
| } | |
| const PURCHASE_FAIL_ACTION = await getPurchaseFailAction(); | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // PAGE DETECTION | |
| function onDetailsPage() { | |
| return window.location.pathname.match(/\/t\/\d+/); | |
| } | |
| function onHomePage() { | |
| return ( | |
| window.location.pathname === "/" || | |
| window.location.pathname === "/index.php" | |
| ); | |
| } | |
| function onBrowsePage() { | |
| return window.location.pathname.match(/\/tor\/browse\.php/); | |
| } | |
| function onPrefsPage() { | |
| return window.location.pathname.match(/preferences\/index\.php.*/); | |
| } | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // UI ELEMENT GENERATION | |
| function makeWWButton() { | |
| let button = document.createElement("div"); | |
| button.style = "margin-top: 1em"; | |
| button.innerHTML = `<img style="max-width: 130px" src="${IMG_BUTTON_TO_CLICK}">`; | |
| return button; | |
| } | |
| // Create the small WedgeWaster icon | |
| function makeWWIcon(source) { | |
| const computedStyle = window.getComputedStyle(source); | |
| const copiedProps = [ | |
| "display", | |
| "padding", | |
| "width", | |
| "height", | |
| "user-select", | |
| "cursor", | |
| ]; | |
| let button = document.createElement("a"); | |
| copiedProps.forEach((prop) => { | |
| button.style[prop] = computedStyle.getPropertyValue(prop); | |
| }); | |
| button.style.backgroundImage = `url(${IMG_ICON_TO_CLICK})`; | |
| button.style.backgroundRepeat = "no-repeat"; | |
| return button; | |
| } | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| function purchaseTorrent(torrentID, torrentFileURL, pageType) { | |
| let freeleechURL = `https://www.myanonamouse.net/json/bonusBuy.php/?spendtype=personalFL&torrentid=${torrentID}`; | |
| function purchaseSuccessAction(message) { | |
| // Update Ratio box | |
| if (pageType === "details") { | |
| let ratioBox = document.getElementById("ratio"); | |
| ratioBox.getElementsByClassName( | |
| "torDetInnerBottomSpan", | |
| )[0].innerText = "This torrent is a Personal freeleech!"; | |
| } | |
| grabTorrent(torrentID, torrentFileURL); | |
| console.log(`WedgeMarker | Success: ${message}`); | |
| } | |
| const PURCHASE_ACTIONS = { | |
| act: (message) => { | |
| console.log(`WedgeMarker | Warn: ${message}`); | |
| grabTorrent(torrentID, torrentFileURL); | |
| }, | |
| dontAct: (message) => { | |
| console.log(`WedgeMarker | Error: ${message}`); | |
| alert( | |
| `WedgeMarker\n\nError: Torrent Not Grabbed.\n\n${message}`, | |
| ); | |
| }, | |
| }; | |
| const purchaseFailAction = | |
| PURCHASE_ACTIONS[PURCHASE_FAIL_ACTION] ?? ((id, url) => {}); | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open("GET", freeleechURL, true); | |
| xhr.onreadystatechange = () => { | |
| if (this.readyState == 4 && this.status == 200) { | |
| let mamResponse = JSON.parse(this.response); | |
| let successfulPurchase = mamResponse.success; | |
| successfulPurchase | |
| ? purchaseSuccessAction(mamResponse.type) | |
| : purchaseFailAction(mamResponse.error); | |
| } | |
| }; | |
| xhr.send(); | |
| } | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // (Browse page) Look for changes and add buttons | |
| function findThenAddButtons(mutations) { | |
| // Function to Process each row that is a torrent | |
| function processTorrentRow(torrentRow) { | |
| function alreadyFreeleech() { | |
| let vipFreeleech = | |
| torrentRow.children[1].querySelector('img[alt="VIP"]'); | |
| let siteFreeleech = torrentRow.children[1].querySelector( | |
| 'img[alt="freeleech"]', | |
| ); | |
| let personalFreeleech = torrentRow.children[1].querySelector( | |
| 'span[title="personal freeleech"]', | |
| ); | |
| return vipFreeleech || siteFreeleech || personalFreeleech; | |
| } | |
| // Get torrent ID and File URL from the default download button | |
| let downloadButton = | |
| torrentRow.getElementsByClassName("directDownload")[0]; | |
| let titleLink = torrentRow.getElementsByClassName("torTitle"); | |
| // let torrentID = downloadButton.id.match(/dlLink(\d+)/)[1]; // other way doesnt work on homepage | |
| let torrentID = titleLink[0].href.match(/\/t\/(.*)/)[1]; | |
| let torrentFileURL = downloadButton.href; | |
| // Add the WedgeMarker button above/before the normal download button | |
| let wedgeWasterButton = makeWWIcon(downloadButton); | |
| wedgeWasterButton.addEventListener("click", () => { | |
| if (alreadyFreeleech()) { | |
| console.log( | |
| "WedgeMarker | Info: Save a wedge, this torrent is already freeleech!", | |
| ); | |
| grabTorrent(torrentID, torrentFileURL); | |
| wedgeWasterButton.src = IMG_ICON_SUCCESS; | |
| } else { | |
| purchaseTorrent(torrentID, torrentFileURL, "browse"); | |
| wedgeWasterButton.src = IMG_ICON_SUCCESS; | |
| } | |
| }); | |
| downloadButton.parentNode.insertBefore( | |
| wedgeWasterButton, | |
| downloadButton, | |
| ); | |
| } | |
| try { | |
| // For all torrent elements in the table | |
| let torrentRows = document | |
| .getElementsByTagName("tbody")[1] | |
| .getElementsByTagName("tr"); | |
| for (let torrentRow of torrentRows) { | |
| let isActualTorrentRow = | |
| torrentRow.getElementsByClassName("directDownload") | |
| .length == 1; | |
| if (isActualTorrentRow) { | |
| processTorrentRow(torrentRow); | |
| } | |
| } | |
| } catch (e) { | |
| if (e instanceof TypeError) { | |
| // No changes or not ready | |
| } else { | |
| console.log(`WedgeMarker | Error: Unexpected Error\n\n${e}`); | |
| } | |
| } | |
| } | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| ///////////////////////////////////////////////////////////////////////////////////////////// | |
| // PAGE LOAD | |
| console.log( | |
| `WedgeMarker | Info: PURCHASE_FAIL_ACTION = ${PURCHASE_FAIL_ACTION}`, | |
| ); | |
| console.log(`WedgeMarker | Info: GRAB_ACTION = ${GRAB_ACTION}`); | |
| // Customize the different pages | |
| var searchResultsUpdated = new MutationObserver(findThenAddButtons); | |
| if (onDetailsPage()) { | |
| let torrentFileURL = document.getElementById("tddl").href; | |
| let torrentID = document.URL.match(/\/t\/(\d+)/)[1]; | |
| let pageType = "details"; | |
| let downloadButtons = document | |
| .getElementById("download") | |
| .getElementsByClassName("torDetInnerBottom")[0]; | |
| // Add WedgeMarker button | |
| let button = makeWWButton(); | |
| button.addEventListener("click", () => { | |
| let freeLeechStatusText = document | |
| .getElementById("ratio") | |
| .getElementsByClassName("torDetInnerBottomSpan")[0].innerText; | |
| let freeLeechStatus = freeLeechStatusText.match(/freeleech/i); | |
| if (freeLeechStatus) { | |
| console.log( | |
| "WedgeMarker | Info: Save a wedge, this torrent is already freeleech!", | |
| ); | |
| grabTorrent(torrentID); | |
| } else { | |
| purchaseTorrent(torrentID, torrentFileURL); | |
| } | |
| }); | |
| // ...below normal download button | |
| downloadButtons.appendChild(button); | |
| // | |
| // | |
| } else if (onBrowsePage() || onHomePage()) { | |
| let target = document.getElementById("ssr"); | |
| let config = { childList: true }; | |
| // Monitor page for any changes | |
| searchResultsUpdated.observe(target, config); | |
| // | |
| // | |
| } else if (onPrefsPage()) { | |
| function getSettingsMenu() { | |
| return document | |
| .getElementById("mainBody") | |
| .getElementsByTagName("tr")[0]; | |
| } | |
| function makeWWResetSettingsButton(menu) { | |
| let newButton = [ | |
| menu.childNodes[2].cloneNode(true), // spacer | |
| menu.childNodes[3].cloneNode(true), // anchor tag | |
| ]; | |
| let anchor = newButton[1].children[0]; | |
| anchor.innerHTML = "WedgeWaster<br/>Reset Settings"; | |
| anchor.href = "#"; | |
| anchor.onclick = (event) => { | |
| event.preventDefault(); | |
| clearSettings(); | |
| }; | |
| return newButton; | |
| } | |
| function insertWWResetSettingsButton(menu, newSettingsButton) { | |
| newSettingsButton.forEach((el) => { | |
| menu.insertBefore(el, menu.children[menu.children.length - 1]); | |
| }); | |
| } | |
| let menu = getSettingsMenu(); | |
| let newButton = makeWWResetSettingsButton(menu); | |
| insertWWResetSettingsButton(menu, newButton); | |
| } | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment