// ==UserScript==
// @name Diggy Deposits
// @namespace TornDiggyDeposits
// @version 2.2
// @description Turns the money element of torn.com to a button, right click for settings, left click to navigate to desired deposit area. 1 beep for money changes, 2 for dangerous amount. Added page visibility to be sure it follows rules.
// @author User
// @match *.torn.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
/* --- 1. CONFIG & PARSER --- */
const parseMoney = (str) => {
if (!str) return 0;
let s = str.toString().toLowerCase().replace(/[^0-9.kmb]/g, '');
let val = parseFloat(s) || 0;
if (s.includes('k')) val *= 1000;
if (s.includes('m')) val *= 1000000;
if (s.includes('b')) val *= 1000000000;
return val;
};
const state = {
get vol() { return parseFloat(localStorage.getItem('vUtilVol')) || 0.3; },
get target() { return localStorage.getItem('vUtilTarget') || 'vault'; },
get limitRaw() { return localStorage.getItem('vUtilLimit') || '1m'; },
get limit() { return parseMoney(this.limitRaw); },
get allowChange() { return localStorage.getItem('vUtilBeepChange') !== 'false'; },
get allowDanger() { return localStorage.getItem('vUtilBeepDanger') !== 'false'; },
danger: false, lastM: -1
};
/* --- 2. AUDIO --- */
let ac = null;
const beep = (isAlarm) => {
if (!isAlarm && !state.allowChange) return;
if (isAlarm && !state.allowDanger) return;
try {
if (!ac) ac = new (window.AudioContext || window.webkitAudioContext)();
if (ac.state === 'suspended') ac.resume();
const play = (offset = 0) => {
const osc = ac.createOscillator(); const g = ac.createGain();
osc.connect(g); g.connect(ac.destination);
osc.type = "triangle"; osc.frequency.value = 440;
g.gain.setValueAtTime(state.vol, ac.currentTime + offset);
g.gain.exponentialRampToValueAtTime(0.01, ac.currentTime + offset + 0.2);
osc.start(ac.currentTime + offset); osc.stop(ac.currentTime + offset + 0.2);
};
play(0); if (isAlarm) play(0.25);
} catch (e) {}
};
/* --- 3. SETTINGS UI --- */
const menu = document.createElement('div');
menu.id = 'v-util-settings';
const updateMenu = () => {
menu.innerHTML = `
DIGGY DEPOSITS SETTINGS
`;
};
menu.setAttribute('style', `position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); background:#111; color:#eee; border:1px solid #333; padding:15px; border-radius:8px; z-index:2147483647; display:none; width:220px; box-shadow:0 0 30px #000;`);
document.body.appendChild(menu);
const navigate = (e) => {
if (e && (e.button === 2)) return;
const finalTarget = localStorage.getItem('vUtilTarget') || 'vault';
const url = (finalTarget === 'vault') ? 'https://www.torn.com/properties.php#/p=options&tab=vault' : 'https://www.torn.com/factions.php?step=your&type=1#/tab=armoury';
window.location.assign(url);
};
const initMoneyButton = () => {
const mEl = document.querySelector('#user-money') || document.querySelector('span[class*="money_"]');
if (mEl && !mEl.classList.contains('v-integrated')) {
mEl.classList.add('v-integrated');
mEl.addEventListener('click', navigate);
mEl.oncontextmenu = (e) => {
e.preventDefault();
updateMenu();
menu.style.display = 'block';
};
let pressTimer;
mEl.addEventListener('touchstart', () => {
if (ac) ac.resume();
pressTimer = setTimeout(() => { updateMenu(); menu.style.display = 'block'; }, 800);
}, {passive: true});
mEl.addEventListener('touchend', () => clearTimeout(pressTimer));
}
return mEl;
};
setInterval(() => {
if (document.visibilityState !== 'visible' || !document.hasFocus()) return;
const mEl = initMoneyButton();
if (mEl) {
let mVal = parseMoney(mEl.innerText);
state.danger = (mVal >= state.limit);
if (state.lastM !== -1 && mVal !== state.lastM) beep(state.danger);
state.danger ? mEl.classList.add('v-danger-active') : mEl.classList.remove('v-danger-active');
state.lastM = mVal;
}
}, 1500);
const applyStyles = () => {
if (document.getElementById('diggy-style-v2-2')) return;
const s = document.createElement('style'); s.id = 'diggy-style-v2-2';
s.innerHTML = `
.v-integrated { cursor: pointer !important; border: 1px solid #373 !important; background: rgba(0, 255, 0, 0.05) !important; padding: 1px 6px !important; border-radius: 4px !important; transition: all 0.2s ease; box-shadow: inset 0 0 5px rgba(0,255,0,0.1); }
.v-integrated:hover { border-color: #0f0 !important; background: rgba(0, 255, 0, 0.15) !important; box-shadow: 0 0 8px rgba(0,255,0,0.3); }
@keyframes vMoneyPulse { 0% { background: rgba(255,0,0,0.3); border-color: #f00; color: #ff0000; } 50% { background: rgba(255,0,0,0.6); border-color: #f00; color: #fff; box-shadow: 0 0 15px #f00; } 100% { background: rgba(255,0,0,0.3); border-color: #f00; color: #ff0000; } }
.v-danger-active { animation: vMoneyPulse 0.8s infinite !important; font-weight: bold !important; }
.deposit-box .input-money-group, form[data-action="donateCash"] .input-money-group { display: flex !important; flex-direction: row !important; align-items: stretch !important; gap: 0px !important; }
.deposit-box .input-money-symbol, .deposit-box .torn-btn, form[data-action="donateCash"] .input-money-symbol, form[data-action="donateCash"] .btn-wrap, form[data-action="donateCash"] .btn-wrap .torn-btn { background: #000 !important; color: #0f0 !important; height: 34px !important; display: flex !important; align-items: center !important; justify-content: center !important; padding: 0 12px !important; border: 1px solid #0f0 !important; font-weight: 800 !important; cursor: pointer !important; box-sizing: border-box !important; font-size: 11px !important; text-transform: uppercase; }
`;
document.head.appendChild(s);
};
document.addEventListener('click', (e) => {
if (e.target.id === 'v-close-settings') {
localStorage.setItem('vUtilVol', document.getElementById('v-vol-slide').value);
localStorage.setItem('vUtilTarget', document.getElementById('v-target-select').value);
localStorage.setItem('vUtilLimit', document.getElementById('v-limit-input').value);
localStorage.setItem('vUtilBeepChange', document.getElementById('v-beep-change').checked);
localStorage.setItem('vUtilBeepDanger', document.getElementById('v-beep-danger').checked);
menu.style.display = 'none';
location.reload();
}
if (e.target.id === 'v-test-beep') beep(true);
});
applyStyles();
initMoneyButton();
new MutationObserver(() => { applyStyles(); initMoneyButton(); }).observe(document.body, {childList: true, subtree: true});
})();