Cartel Empire - Torn Vault Withdraw Buttons

Adds buttons that input amounts of cash for withdrawing, and adds a magic button that will set your current cash to its value after clicking withdraw/deposit

目前为 2025-04-13 提交的版本。查看 最新版本

// ==UserScript==
// @name         Cartel Empire - Torn Vault Withdraw Buttons
// @namespace    baccy.ce
// @version      0.1
// @description  Adds buttons that input amounts of cash for withdrawing, and adds a magic button that will set your current cash to its value after clicking withdraw/deposit
// @author       Baccy (Idea from Titanic_'s Torn Script)
// @match        https://cartelempire.online/Property
// @match        https://cartelempire.online/Bank
// @icon         https://cartelempire.online/images/icon-white.png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const magicButton = 1000000; // Change to the value you want. Currently 1m.

    const buttons = [
        {value: 10000, display: '10k'},
        {value: 25000, display: '25k'},
        {value: 50000, display: '50k'},
        {value: 100000, display: '100k'},
        {value: 250000, display: '250k'},
        {value: 500000, display: '500k'},
        {value: 1000000, display: '1m'},
        {value: 2500000, display: '2.5m'},
        {value: 5000000, display: '5m'},
        {value: 10000000, display: '10m'}
    ];


    const parentContainer = document.createElement('div');
    parentContainer.style.marginBottom = '20px';
    parentContainer.classList.add('withdraw-container');

    const buttonContainer = document.createElement('div');
    buttonContainer.classList.add('custom-button-container');

    const newWithdrawInput = document.createElement('input');
    newWithdrawInput.type = 'text';
    newWithdrawInput.id = 'new-withdraw-input';
    newWithdrawInput.className = 'form-control allowAbbreviation';
    newWithdrawInput.value = 0;

    const newDepositInput = document.createElement('input');
    newDepositInput.type = 'text';
    newDepositInput.id = 'new-deposit-input';
    newDepositInput.className = 'form-control allowAbbreviation';
    newDepositInput.value = 0;

    const formatNumber = val => {
        const num = parseFloat(val.replace(/,/g, ''));
        return isNaN(num) ? 0 : num.toLocaleString();
    };

    const handleFormat = input => e => {
        setTimeout(() => {
            input.value = formatNumber(input.value);
        }, 0);
    };

    newWithdrawInput.addEventListener('input', handleFormat(newWithdrawInput));
    newWithdrawInput.addEventListener('paste', handleFormat(newWithdrawInput));
    newDepositInput.addEventListener('input', handleFormat(newDepositInput));
    newDepositInput.addEventListener('paste', handleFormat(newDepositInput));


    const withdrawBtn = document.querySelector('#withdrawBtn');

    document.querySelector('#withdrawInput').remove();
    withdrawBtn.parentElement.parentElement.insertBefore(newWithdrawInput, withdrawBtn.parentElement);

    const depositBtn = document.querySelector('#depositBtn');
    document.querySelector('#depositInput').remove();
    depositBtn.parentElement.parentElement.insertBefore(newDepositInput, depositBtn.parentElement);

    buttons.forEach(function (config) {
        const btn = document.createElement('span');
        btn.textContent = `£${config.display}`;
        btn.style.cssText = 'padding: 8px; cursor: pointer; border-radius: 4px; border: 1px solid #495057; background: #2b3035; color: #fff;';

        buttonContainer.appendChild(btn);

        btn.addEventListener('click', () => {
            let intvalue = parseInt(newWithdrawInput.value.replace(/,/g, ''));
            newWithdrawInput.value = (intvalue + config.value).toLocaleString();
        });
    });

    const magicBtn = document.createElement('span');
    magicBtn.textContent = 'Magic';
    magicBtn.style.cssText = 'padding: 8px; cursor: pointer; border-radius: 4px; border: 1px solid purple; background: #2b3035; color: #fff;';
    magicBtn.addEventListener('click', () => {
        const currentCash = parseInt(document.querySelector('.cashDisplay').textContent.replace(/,/g, ''));
        const requiredCash = magicButton - currentCash;

        if (requiredCash > 0) {
            newWithdrawInput.value = requiredCash.toLocaleString();;
            newDepositInput.value = '0';
        } else if (requiredCash < 0) {
            newDepositInput.value = Math.abs(requiredCash).toLocaleString();;
            newWithdrawInput.value = '0';
        } else {
            newWithdrawInput.value = '0';
            newDepositInput.value = '0';
        }
    });

    buttonContainer.appendChild(magicBtn);

    parentContainer.appendChild(buttonContainer);

    withdrawBtn.addEventListener('click', async function(e) {
        e.preventDefault();

        const form = document.querySelector('form[action="/Property/Withdraw"]');
        let cash = parseInt(document.querySelector('#new-withdraw-input').value.replace(/,/g, ''));
        const propertyId = form.querySelector('input[name="propertyId"]').value;
        const availableCash = parseInt(document.querySelector('#cashInVault').textContent.replace(/,/g, ''));

        if (cash > availableCash) cash = availableCash;

        const response = await fetch('/Property/Withdraw', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'X-Requested-With': 'XMLHttpRequest'
            },
            body: new URLSearchParams({
                Cash: cash,
                propertyId: propertyId
            })
        });
        const text = await response.text();
        const parser = new DOMParser();
        const doc = parser.parseFromString(text, 'text/html');
        const messageDiv = doc.querySelector('.mb-4.card.border-success');

        const element = document.querySelector('#mainBackground > .container > .row > .col-12');
        if (messageDiv && element) {
            element.prepend(messageDiv);
            newWithdrawInput.value = '0';
            newDepositInput.value = '0';
        }
    });

    depositBtn.addEventListener('click', async function(e) {
        e.preventDefault();

        const form = document.querySelector('form[action="/Property/Deposit"]');
        let cash = parseInt(document.querySelector('#new-deposit-input').value.replace(/,/g, ''));
        const propertyId = form.querySelector('input[name="propertyId"]').value;
        const availableCash = parseInt(document.querySelector('.cashDisplay').textContent.replace(/,/g, ''));

        if (cash > availableCash) cash = availableCash;

        const response = await fetch('/Property/Deposit', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'X-Requested-With': 'XMLHttpRequest'
            },
            body: new URLSearchParams({
                Cash: cash,
                propertyId: propertyId
            })
        });
        const text = await response.text();
        const parser = new DOMParser();
        const doc = parser.parseFromString(text, 'text/html');
        const messageDiv = doc.querySelector('.mb-4.card.border-success');

        const element = document.querySelector('#mainBackground > .container > .row > .col-12');
        if (messageDiv && element) {
            element.prepend(messageDiv);
            newWithdrawInput.value = '0';
            newDepositInput.value = '0';
        }
    });

    if (window.location.href.toLowerCase().includes("online/property")) {
        const targetElement = document.querySelector('.row.mb-4.g-0.align-items-center.text-center');
        if (targetElement) targetElement.parentNode.insertBefore(parentContainer, targetElement);
    } else if (window.location.href.toLowerCase().includes("online/bank")) {
        const targetElement = document.querySelector('.card-text.fw-bold.text-muted');
        if (targetElement) targetElement.parentNode.insertBefore(parentContainer, targetElement);
    }
})();