Skip to content

Instantly share code, notes, and snippets.

@xmoforf
Last active November 4, 2025 02:32
Show Gist options
  • Save xmoforf/cfb3caf58ddb07f37b650df2b655739d to your computer and use it in GitHub Desktop.
Save xmoforf/cfb3caf58ddb07f37b650df2b655739d to your computer and use it in GitHub Desktop.
WedgeMarker-alpha.user.js
// ==UserScript==
// @name MAM - WedgeWaster (Alpha Test) (Bookmark Edition)
// @author WirlyWirly
// @namespace https://github.com/xmoforf
// @version 2.8
// @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/cfb3caf58ddb07f37b650df2b655739d
// @updateURL https://gist.github.com/xmoforf/cfb3caf58ddb07f37b650df2b655739d/raw/WedgeMarker-alpha.user.js
// @downloadURL https://gist.github.com/xmoforf/cfb3caf58ddb07f37b650df2b655739d/raw/WedgeMarker-alpha.user.js
// @description Waste a wedge and not your time when bookmarking!
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.deleteValue
// @run-at document-end
// ==/UserScript==
// ----------------------------------- CODE --------------------------------------
(async () => {
// Grabbing action is different based on configuration
const GRAB_ACTIONS = {
bookmark: (id, url) => {
// eslint-disable-next-line no-undef
bookmarkClick("add", id); // bookmark
},
download: (id, url) => {
window.location = url; // download
},
};
// Base64 Encoded Icons
const IMG_BUTTON_TO_CLICK = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAxCAYAAAAvOsB9AAAEsWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNDkiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTU2IgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI5Ny8xIgogICB0aWZmOllSZXNvbHV0aW9uPSI5Ny8xIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTU2IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDkiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0x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`;
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`,
};
// User-configurable actions
const PURCHASE_FAIL_ACTION = await getFreeleechFailAction();
const WASTE_ACTION = await getWasteAction();
const grabTorrent = GRAB_ACTIONS[WASTE_ACTION] ?? ((id, url) => {});
const IMG_ICON_TO_CLICK = IMG_ICON_TO_CLICK_MAP[WASTE_ACTION];
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`;
async function clearSettings() {
await GM.deleteValue("wasteAction");
await GM.deleteValue("freeleechFailAction");
window.location.reload();
}
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);
};
});
}
async function getWasteAction() {
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;
}
}
async function getFreeleechFailAction() {
const storageKey = "freeleechFailAction";
let choice = await GM.getValue(storageKey, null);
if (choice === null) {
let rawChoice = await promptDropdown(
"Do you want to take the action if the freeleech purchase fails?",
["Yes", "No"],
["Yes"],
);
choice = { Yes: "act", No: "dontAct" }[rawChoice] ?? null;
await GM.setValue(storageKey, choice);
}
return choice;
}
// Returns whether we are on the details page
function onDetailsPage() {
return window.location.pathname.match(/\/t\/\d+/);
}
// Returns whether we are on the home page
function onHomePage() {
return (
window.location.pathname === "/" ||
window.location.pathname === "/index.php"
);
}
// Returns whether we're on the browse page
function onBrowsePage() {
return window.location.pathname.match(/\/tor\/browse\.php/);
}
function onPrefsPage() {
return window.location.pathname.match(/preferences\/index\.php.*/);
}
// Create the large WedgeWaster button
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;
}
// When the purchase button is clicked
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();
}
// (Browe 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}`);
}
}
}
//
// When page loads
//
console.log(
`WedgeMarker | Info: PURCHASE_FAIL_ACTION = ${PURCHASE_FAIL_ACTION}`,
);
console.log(`WedgeMarker | Info: WASTE_ACTION = ${WASTE_ACTION}`);
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