Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save scriptease/587644d79eb7029e726bf252eabc9239 to your computer and use it in GitHub Desktop.

Select an option

Save scriptease/587644d79eb7029e726bf252eabc9239 to your computer and use it in GitHub Desktop.
Method.gg WR progress.user.js
// ==UserScript==
// @name Method.gg WR progress
// @namespace http://tampermonkey.net/
// @version 2025-05-13
// @description Adds buttons to the Warcraft Rumble progress tracker
// @author Scriptease
// @match https://www.method.gg/warcraft-rumble/progress-tracker
// @icon https://www.google.com/s2/favicons?sz=64&domain=method.gg
// @grant none
// ==/UserScript==
(function() {
'use strict';
function createButton(text, onClick) {
const btn = document.createElement('button');
btn.textContent = text;
btn.style.margin = '0 8px';
btn.style.padding = '6px 14px';
btn.style.cursor = 'pointer';
btn.style.fontSize = '14px';
btn.style.border = '1px solid #ccc';
btn.style.borderRadius = '4px';
btn.style.background = '#f5f5f5';
btn.style.color = '#000';
btn.onmouseenter = () => btn.style.background = '#e0e0e0';
btn.onmouseleave = () => btn.style.background = '#f5f5f5';
btn.onclick = onClick;
return btn;
}
const totalBlock = document.querySelector('.mini-total-block');
if (!totalBlock) {
alert('mini-total-block not found');
return;
}
const wrapper = document.createElement('div');
wrapper.style.textAlign = 'center';
wrapper.style.marginTop = '15px';
// Filter buttons
const btnExp = createButton('max exp', () => {
document.querySelectorAll('.mini-row').forEach(row => {
const xp = row.querySelector('.output_xp')?.getAttribute('data-num');
if (xp === "0") row.style.display = 'none';
});
});
const btnStars = createButton('max stars', () => {
document.querySelectorAll('.mini-row').forEach(row => {
const stars = row.querySelector('.output_stars')?.getAttribute('data-num');
if (stars === "0") row.style.display = 'none';
});
});
const btnGold = createButton('maxed', () => {
document.querySelectorAll('.mini-row').forEach(row => {
const gold = row.querySelector('.output_gold')?.getAttribute('data-num');
if (gold === "0") row.style.display = 'none';
});
});
// Export button
const btnExport = createButton('Export JSON', () => {
const data = localStorage.getItem('method-MiniCalculator');
if (!data) {
alert('No data found in method-MiniCalculator');
return;
}
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'method-MiniCalculator.json';
a.click();
URL.revokeObjectURL(url);
});
// Import button
const btnImport = createButton('Import JSON', () => {
const input = document.createElement('input');
input.type = 'file';
input.accept = 'application/json';
input.onchange = event => {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(e) {
try {
const json = JSON.parse(e.target.result);
localStorage.setItem('method-MiniCalculator', JSON.stringify(json));
Object.entries(json).forEach(([id, entry]) => {
const row = document.querySelector(`.mini-row-individual[data-id="${id}"]`);
if (!row) return;
const levelEl = row.querySelector('input[name="input_level"]');
if (levelEl) levelEl.value = entry.lvl;
const xpEl = row.querySelector('input[name="input_xp"]');
if (xpEl) xpEl.value = entry.xp;
const starsEl = row.querySelector('input[name="input_stars"]');
if (starsEl) starsEl.value = entry.stars;
const tierEl = row.querySelector('select[name="input_tier"]');
if (tierEl) tierEl.value = entry.tier;
const talentsEl = row.querySelector('select[name="input_talents"]');
if (talentsEl) talentsEl.value = entry.talents;
levelEl.dispatchEvent(new Event('change', { bubbles: true }));
});
alert('JSON imported successfully. You may need to reload the page.');
} catch (err) {
alert('Invalid JSON file.'+err);
}
};
reader.readAsText(file);
};
input.click();
});
// Add buttons
wrapper.appendChild(btnExp);
wrapper.appendChild(btnStars);
wrapper.appendChild(btnGold);
wrapper.appendChild(btnExport);
wrapper.appendChild(btnImport);
totalBlock.parentNode.insertBefore(wrapper, totalBlock.nextSibling);
})();
@scriptease
Copy link
Author

javascript:(function()%7Bfunction%20createButton(text%2C%20onClick)%20%7Bconst%20btn%20%3D%20document.createElement('button')%3Bbtn.textContent%20%3D%20text%3Bbtn.style.margin%20%3D%20'0%208px'%3Bbtn.style.padding%20%3D%20'6px%2014px'%3Bbtn.style.cursor%20%3D%20'pointer'%3Bbtn.style.fontSize%20%3D%20'14px'%3Bbtn.style.border%20%3D%20'1px%20solid%20%23ccc'%3Bbtn.style.borderRadius%20%3D%20'4px'%3Bbtn.style.background%20%3D%20'%23f5f5f5'%3Bbtn.style.color%20%3D%20'%23000'%3Bbtn.onmouseenter%20%3D%20()%20%3D%3E%20btn.style.background%20%3D%20'%23e0e0e0'%3Bbtn.onmouseleave%20%3D%20()%20%3D%3E%20btn.style.background%20%3D%20'%23f5f5f5'%3Bbtn.onclick%20%3D%20onClick%3Breturn%20btn%3B%7Dconst%20totalBlock%20%3D%20document.querySelector('.mini-total-block')%3Bif%20(!totalBlock)%20%7Balert('mini-total-block%20not%20found')%3Breturn%3B%7Dconst%20wrapper%20%3D%20document.createElement('div')%3Bwrapper.style.textAlign%20%3D%20'center'%3Bwrapper.style.marginTop%20%3D%20'15px'%3Bconst%20btnExp%20%3D%20createButton('max%20exp'%2C%20()%20%3D%3E%20%7Bdocument.querySelectorAll('.mini-row').forEach(row%20%3D%3E%20%7Bconst%20xp%20%3D%20row.querySelector('.output_xp')%3F.getAttribute('data-num')%3Bif%20(xp%20%3D%3D%3D%20%220%22)%20row.style.display%20%3D%20'none'%3B%7D)%3B%7D)%3Bconst%20btnStars%20%3D%20createButton('max%20stars'%2C%20()%20%3D%3E%20%7Bdocument.querySelectorAll('.mini-row').forEach(row%20%3D%3E%20%7Bconst%20stars%20%3D%20row.querySelector('.output_stars')%3F.getAttribute('data-num')%3Bif%20(stars%20%3D%3D%3D%20%220%22)%20row.style.display%20%3D%20'none'%3B%7D)%3B%7D)%3Bconst%20btnGold%20%3D%20createButton('maxed'%2C%20()%20%3D%3E%20%7Bdocument.querySelectorAll('.mini-row').forEach(row%20%3D%3E%20%7Bconst%20gold%20%3D%20row.querySelector('.output_gold')%3F.getAttribute('data-num')%3Bif%20(gold%20%3D%3D%3D%20%220%22)%20row.style.display%20%3D%20'none'%3B%7D)%3B%7D)%3Bconst%20btnExport%20%3D%20createButton('Export%20JSON'%2C%20()%20%3D%3E%20%7Bconst%20data%20%3D%20localStorage.getItem('method-MiniCalculator')%3Bif%20(!data)%20%7Balert('No%20data%20found%20in%20method-MiniCalculator')%3Breturn%3B%7Dconst%20blob%20%3D%20new%20Blob(%5Bdata%5D%2C%20%7B%20type%3A%20'application%2Fjson'%20%7D)%3Bconst%20url%20%3D%20URL.createObjectURL(blob)%3Bconst%20a%20%3D%20document.createElement('a')%3Ba.href%20%3D%20url%3Ba.download%20%3D%20'method-MiniCalculator.json'%3Ba.click()%3BURL.revokeObjectURL(url)%3B%7D)%3Bconst%20btnImport%20%3D%20createButton('Import%20JSON'%2C%20()%20%3D%3E%20%7Bconst%20input%20%3D%20document.createElement('input')%3Binput.type%20%3D%20'file'%3Binput.accept%20%3D%20'application%2Fjson'%3Binput.onchange%20%3D%20event%20%3D%3E%20%7Bconst%20file%20%3D%20event.target.files%5B0%5D%3Bif%20(!file)%20return%3Bconst%20reader%20%3D%20new%20FileReader()%3Breader.onload%20%3D%20function(e)%20%7Btry%20%7Bconst%20json%20%3D%20JSON.parse(e.target.result)%3BlocalStorage.setItem('method-MiniCalculator'%2C%20JSON.stringify(json))%3BObject.entries(json).forEach((%5Bid%2C%20entry%5D)%20%3D%3E%20%7Bconst%20row%20%3D%20document.querySelector(%60.mini-row-individual%5Bdata-id%3D%22%24%7Bid%7D%22%5D%60)%3Bif%20(!row)%20return%3Bconst%20levelEl%20%3D%20row.querySelector('input%5Bname%3D%22input_level%22%5D')%3Bif%20(levelEl)%20levelEl.value%20%3D%20entry.lvl%3Bconst%20xpEl%20%3D%20row.querySelector('input%5Bname%3D%22input_xp%22%5D')%3Bif%20(xpEl)%20xpEl.value%20%3D%20entry.xp%3Bconst%20starsEl%20%3D%20row.querySelector('input%5Bname%3D%22input_stars%22%5D')%3Bif%20(starsEl)%20starsEl.value%20%3D%20entry.stars%3Bconst%20tierEl%20%3D%20row.querySelector('select%5Bname%3D%22input_tier%22%5D')%3Bif%20(tierEl)%20tierEl.value%20%3D%20entry.tier%3Bconst%20talentsEl%20%3D%20row.querySelector('select%5Bname%3D%22input_talents%22%5D')%3Bif%20(talentsEl)%20talentsEl.value%20%3D%20entry.talents%3BlevelEl.dispatchEvent(new%20Event('change'%2C%20%7B%20bubbles%3A%20true%20%7D))%3B%7D)%3Balert('JSON%20imported%20successfully.%20You%20may%20need%20to%20reload%20the%20page.')%3B%7D%20catch%20(err)%20%7Balert('Invalid%20JSON%20file.'%2Berr)%3B%7D%7D%3Breader.readAsText(file)%3B%7D%3Binput.click()%3B%7D)%3Bwrapper.appendChild(btnExp)%3Bwrapper.appendChild(btnStars)%3Bwrapper.appendChild(btnGold)%3Bwrapper.appendChild(btnExport)%3Bwrapper.appendChild(btnImport)%3BtotalBlock.parentNode.insertBefore(wrapper%2C%20totalBlock.nextSibling)%7D)()

@scriptease
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment