PAWS - Faction Bank Request

To request money from faction bank.

// ==UserScript==
// @name         PAWS - Faction Bank Request
// @namespace    https://www.tornpaws.uk
// @version      1.5.1
// @description  To request money from faction bank.
// @author       lonerider543
// @match        https://www.torn.com/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

const targetNode = document.getElementById('header-root')
const config = { attributes: true, childList: true, subtree: true };

var execute = true;

Number.prototype.format_thousand_seperator = function(n, x) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
    return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};

const replaceAll = (string, search, replace) => {
    return string.split(search).join(replace);
  }

const callback = function(mutationsList, observer) {
    if (!execute) return;
    add_request()
};

function add_request() {
    execute = false;

    $('ul.settings-menu')
    .append('<li class="server-info" id="faction-req-wrap" style="text-shadow: none; background-color: #f2f2f2; color: #333; padding: 5px; width: auto"><span style="margin: 5px 0; padding: 5px">Request Faction Money</span><div class="input-money-group" id="faction-req-group"><input type="text" class="input-money" id="faction-req-v" style="width: 120px; border-radius: 5px; margin: 2px 0 5px 0"><input type="hidden" class="input-money" id="faction-req-h"></div><br><span class="btn-wrap silver" style="padding: 0"><span class="btn"><input type="submit" class="torn-btn disabled" value="REQUEST" id="faction-req-btn" style="width: auto; height: auto"></span></span></li>')

    var request_enabled = false;

    $('input#faction-req-v').on('input', function() {
        var value = replaceAll($('input#faction-req-v').val(), /[,]/, '');
        var dot_index, zero_repeat, formatted;

        if (/^[0-9]+$/.test(value)) {
            formatted = parseInt(value).format_thousand_seperator();
            $('div#faction-req-group').attr("class", "input-money-group success");
            $('input#faction-req-v').val(formatted);
            $('input#faction-req-h').attr("value", value);

            $('input#faction-req-btn').attr("class", "torn-btn");
            request_enabled = true;

        } else if (value == '') {
            $('div#faction-req-group').attr("class", "input-money-group");
            $('input#faction-req-h').attr("value", '');

            $('input#faction-req-btn').attr("class", "torn-btn disabled");
            request_enabled = false;

        } else if (/^[0-9]+$/.test(value.substring(0, value.length-1)) && /[bkm]/.test(value.substring(value.length-1))) {
            if (value[value.length-1] == 'k') {
                value = value.substring(0, value.length-1) + '000';
            } else if (value[value.length-1] == 'm') {
                value = value.substring(0, value.length-1) + '000000';
            } else if (value[value.length-1] == 'b') {
                value = value.substring(0, value.length-1) + '000000000';
            }

            formatted = parseInt(value).format_thousand_seperator();
            $('div#faction-req-group').attr("class", "input-money-group success");
            $('input#faction-req-v').val(formatted);
            $('input#faction-req-h').attr("value", value);

            $('input#faction-req-btn').attr("class", "torn-btn");
            request_enabled = true;

        } else if (/^[0-9]+[.][0-9]{1,3}[k]$/.test(value)) {
            dot_index = value.indexOf('.');
            zero_repeat = 5 - (value.length - dot_index);

            value = value.replace('.', '');
            value = value.substring(0, value.length-1) + '0'.repeat(zero_repeat);

            formatted = parseInt(value).format_thousand_seperator();
            $('div#faction-req-group').attr("class", "input-money-group success");
            $('input#faction-req-v').val(formatted);
            $('input#faction-req-h').attr("value", value);

            $('input#faction-req-btn').attr("class", "torn-btn");
            request_enabled = true;

        } else if (/^[0-9]+[.][0-9]{1,6}[m]$/.test(value)) {
            dot_index = value.indexOf('.');
            zero_repeat = 8 - (value.length - dot_index);

            value = value.replace('.', '');
            value = value.substring(0, value.length-1) + '0'.repeat(zero_repeat);

            formatted = parseInt(value).format_thousand_seperator();
            $('div#faction-req-group').attr("class", "input-money-group success");
            $('input#faction-req-v').val(formatted);
            $('input#faction-req-h').attr("value", value);

            $('input#faction-req-btn').attr("class", "torn-btn");
            request_enabled = true;

        } else if (/^[0-9]+[.][0-9]{1,9}[b]$/.test(value)) {
            dot_index = value.indexOf('.');
            zero_repeat = 11 - (value.length - dot_index);

            value = value.replace('.', '');
            value = value.substring(0, value.length-1) + '0'.repeat(zero_repeat);

            formatted = parseInt(value).format_thousand_seperator();
            $('div#faction-req-group').attr("class", "input-money-group success");
            $('input#faction-req-v').val(formatted);
            $('input#faction-req-h').attr("value", value);

            $('input#faction-req-btn').attr("class", "torn-btn");
            request_enabled = true;

        } else {
            $('div#faction-req-group').attr("class", "input-money-group error");
            $('input#faction-req-v').val(value);
            $('input#faction-req-h').attr("value", replaceAll(value, /[^0-9]/, ''));

            $('input#faction-req-btn').attr("class", "torn-btn disabled");
            request_enabled = false;
        }
    })

    $('input#faction-req-btn').on('click', function() {
        if (request_enabled) {
            var chatData = JSON.parse($('div#websocketConnectionData').text());
            var user_name = chatData['playername'];
            var user_id = chatData['userID'];
            var amount = $('input#faction-req-h').val();

            request_enabled = false;
            $('input#faction-req-btn').attr("class", "torn-btn disabled");

            var key = replaceAll(user_name, /[0-9-_]/, '');
            var secret = 'LwHhOCXBziayVKqZIhQa';
            var alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
            var token = '';

            for (var i = 0; i < secret.length; i++)
            {
                let index = i % key.length;
                let index_char = key[index];
                let secret_char = secret[i];

                let crypt_index = alphabet.indexOf(index_char);
                let secret_index = alphabet.indexOf(secret_char);

                let encrypt_index = (crypt_index + secret_index) % alphabet.length;
                let encrypt_char = alphabet[encrypt_index];

                token += encrypt_char;
            }

            var req_data = {
                'user_name': user_name,
                'user_id': user_id,
                'amount': amount,
                'token': token
            }

            GM_xmlhttpRequest({
                method: "POST",
                url: 'https://www.tornpaws.uk/bankreq/',
                headers: {
                    'content-type': 'application/json'
                },
                data: JSON.stringify(req_data),
                onload: (response) => {
                    console.log(response);
                    var response_data = JSON.parse(response.responseText);
                    if (response_data['success'] == 'true') {
                        $('div#faction-req-response').remove();
                        $('li#faction-req-wrap')
                        .append(`<div id="faction-req-response" style="color: #007800; margin: 5px 0 0 0">${response_data['message']}</div>`);
                        $('input#faction-req-v').val("");
                        $('input#faction-req-h').attr("value", '');
                        $('div#faction-req-group').attr("class", "input-money-group");
                    } else {
                        $('div#faction-req-response').remove();
                        $('li#faction-req-wrap')
                        .append(`<div id="faction-req-response" style="color: #780000; margin: 5px 0 0 0">${response_data['message']}</div>`);
                    }
                    request_enabled = true;
                    $('input#faction-req-btn').attr("class", "torn-btn");
                }
            });
        }
    })
}

const observer = new MutationObserver(callback);
observer.observe(targetNode, config);