Watches for mistakes when giving members money from faction vault, and blocks requests that are over the user's total money
// ==UserScript==
// @name Vault Catcher
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Watches for mistakes when giving members money from faction vault, and blocks requests that are over the user's total money
// @author Lazerpent [2112641]
// @license GNU GPLv3
// @match https://www.torn.com/factions.php*
// ==/UserScript==
"use strict";
window.addEventListener('load', () => setTimeout(start, 250));
window.addEventListener('hashchange', () => setTimeout(start, 250));
let newBtn;
let inputOptions;
let moneyColumn;
function start() {
const urlParams = new URLSearchParams(window.location.hash.replace('#/', '?'));
if (!(urlParams.get('tab') === 'controls' && (!urlParams.get('option') || urlParams.get('option') === 'give-to-user'))) {
return;
}
moneyColumn = document.getElementById('money');
if (!moneyColumn) {
setTimeout(start, 250);
return;
}
const form = moneyColumn.getElementsByClassName('give-block')[0];
if (!form) {
setTimeout(start, 250);
return;
}
inputOptions = moneyColumn.getElementsByClassName('inputs-wrap')[0];
if (!inputOptions) {
setTimeout(start, 250);
return;
}
const radioWP = inputOptions.getElementsByClassName('radio-wp')[0];
if (!radioWP) {
setTimeout(start, 250);
return;
}
const btnWrap = radioWP.getElementsByClassName('btn-wrap')[0];
if (!btnWrap) {
setTimeout(start, 250);
return;
}
const btn = btnWrap.getElementsByClassName('btn')[0];
if (!btn) {
return;
}
btn.classList.remove('btn');
btn.addEventListener('click', run);
newBtn = document.createElement('span');
newBtn.classList.add('btn');
newBtn.style.display = 'none';
radioWP.append(newBtn);
}
function run() {
try {
if (!inputOptions) {
error(1);
return;
}
const moneyGroup = inputOptions.getElementsByClassName('input-money-group')[0];
if (!moneyGroup) {
error(2);
return;
}
const inputs = moneyGroup.getElementsByClassName('input-money');
if (inputs.length === 0) {
error(3);
return;
}
const balance = getBankBalance();
if (isNaN(balance)) {
error(4);
return;
}
const addMoney = document.getElementById('add-to-balance-money');
if (!addMoney) {
error(6);
return;
}
if (addMoney.checked) {
newBtn.click();
return;
}
let valid = true;
for (let i = 0; i < inputs.length; i++) {
const value = parseInt(inputs[i].value);
if (isNaN(value)) {
error(5);
return;
}
if (value > balance) {
valid = false;
}
}
if (!valid) {
const state = confirm('You seem to be giving this user more than they have in the faction bank. Do you want to continue?');
if (state) {
newBtn.click();
}
} else {
newBtn.click();
}
} catch (e) {
console.error(e);
error(100);
}
}
function error(id = 0) {
alert('Error occurred while checking your vault transaction. Please notify Lazerpent [2112641], and double check your amount. Error ID: ' + id);
newBtn.click();
}
function getBankBalance() {
const userInput = document.getElementById('money-user');
if (!userInput) {
return NaN;
}
const username = userInput.value;
const userListWrapper = moneyColumn.getElementsByClassName('userlist-wrapper')[0];
if (!userListWrapper) {
return NaN;
}
const userList = userListWrapper.getElementsByClassName('user-info-list-wrap')[0];
if (!userList) {
return NaN;
}
const userListChildren = userList.children;
if (userListChildren.length === 0) {
return NaN;
}
for (let i = 0; i < userListChildren.length; i++) {
const depositor = userListChildren[i];
if (depositor.children.length === 0) {
continue;
}
const data = depositor.children[0];
const nameWrapper = data.getElementsByClassName('name')[0];
if (!nameWrapper) {
continue;
}
if (nameWrapper.getAttribute('title') === username) {
const amount = data.getElementsByClassName('amount')[0];
if (!amount) {
return 0;
}
const money = amount.getElementsByClassName('money')[0];
if (!money) {
return 0;
}
return parseInt(money.getAttribute('data-value'));
}
}
return 0;
}