Cartel Empire - Quick NPC Purchases

Adds a dropdown menu and buy button to the top of the shop page that will allow you to easily use your 25 daily purchases with a single click in the future

// ==UserScript==
// @name         Cartel Empire - Quick NPC Purchases
// @namespace    baccy.ce
// @version      0.1.2
// @description  Adds a dropdown menu and buy button to the top of the shop page that will allow you to easily use your 25 daily purchases with a single click in the future
// @author       Baccy
// @match        https://*.cartelempire.online/Town/*
// @match        https://*.cartelempire.online/PetShop
// @icon         https://cartelempire.online/images/icon-white.png
// @icon         https://www.google.com/s2/favicons?sz=64&domain=cartelempire.online
// @grant        GM.getValue
// @grant        GM.setValue
// @license      MIT
// ==/UserScript==
(function() {
    'use strict';

    let shop;
    let items;

    switch (location.pathname) {
        case '/Town/ArmedSurplus':
            shop = 'armedsurplus';
            items = {'Baseball Bat':'1100','Walther P38':'1101','Trench Coat':'1204','Covert Stab Vest':'1200','Flash Bang Grenade':'1601','Illuminating Grenade':'1602','Tear Gas Grenade':'1603','Stun Grenade':'1604','Ballistic Vest':'1201','AK-47':'1000','M16A2 Rifle':'1001','M1911':'1102','Fragmentation Grenade':'1600','Kevlar Weave Vest':'1205','Carbon Fiber Vest':'1206','Armoured Suit':'1207','Ceramic Plate Carrier Vest':'1208','S&W Magnum Revolver':'1103','MG34':'1500','Glock 18':'1104','Riot Suit':'1209'};
            break;
        case '/Town/Dealership':
            shop = 'dealership';
            items = {'Renault Espace':'3000','Fiat Panda':'3001'};
            break;
        case '/PetShop':
            shop = 'petShop';
            items = {'Dog Food':'501','Black Market Treat':'502'};
            break;
        case '/Town/Diablos':
            shop = 'diablos';
            items = {'G36':'1002','Tactical Plate Armour':'1202','Blast Suit':'1210','New-Age Combat Fatigues':'1211','L86 LSW':'1501','Steyr AUG':'1003','Full-Body Armour':'1203','SIG SG 550':'1004','Desert Eagle':'1105','MG5':'1502','FN SCAR-H':'1005','Bazooka':'1106'};
            break;
        case '/Town/Pharmacy':
            shop = 'pharmacy';
            items = {'Bandage':'200','Small Medical Kit':'201','Large Medical Kit':'202'};
            break;
        case '/Town/Mateos':
            shop = 'mateos';
            items = {'Italian Shoes':'4001'};
            break;
        default:
            break;
    };

    async function createUI() {
        const settings = await GM.getValue('settings', {});
        settings[shop] = settings[shop] || {};
        let id = settings[shop].id || Object.values(items)[0];
        let quantity = settings.quantity || 25;

        const header = document.querySelector('.header-section');
        if (!header) return;
        header.style.display = 'flex';
        header.style.gap = '10px';

        const button = document.createElement('button');
        button.textContent = 'Buy';
        button.style.cssText = 'background-color: #333; color: #fff; border: none; border-radius: 6px; padding: 6px 12px; cursor: pointer; font-weight: bold; flex-shrink: 0;';
        button.addEventListener('click', async () => {
            const url = `/Town/${shop}/BuyItem`;
            const body = new URLSearchParams({
                itemID: id,
                itemQuantity: quantity
            });

            try {
                const response = await fetch(url, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded'
                    },
                    body: body.toString()
                });
                const text = await response.text();

                const tempDiv = document.createElement('div');
                tempDiv.innerHTML = text;

                const responseText = tempDiv.querySelector('p.card-text.fw-bold.text-white');
                if (responseText) {
                    const responseElement = responseText.parentElement.parentElement;
                    responseElement.id = 'quick-npc-purchases';
                    const existingElement = document.querySelector('#quick-npc-purchases');
                    if (existingElement) existingElement.remove();
                    const target = document.querySelector('#mainBackground .container');
                    if (target) target.prepend(responseElement);

                    const remainingItems = [...document.querySelectorAll('.header-section h2')].find(el => el.textContent.trim().startsWith('Buy Items'));
                    if (remainingItems) {
                        const regex = /\((\d+)\//;
                        const match = remainingItems.textContent.match(regex);
                        if (match) {
                            const currentNumber = parseInt(match[1], 10);
                            let updatedNumber = currentNumber - quantity;
                            if (updatedNumber < 0) updatedNumber = 0;
                            const updatedText = remainingItems.textContent.replace(match[1], updatedNumber);
                            remainingItems.textContent = updatedText;
                        }
                    }
                }
            } catch (error) {
                console.error(error);
            }
        });

        const select = document.createElement('select');
        select.style.cssText = 'background-color: #1e1e1e; color: #f0f0f0; border: 1px solid #555; border-radius: 6px; padding: 4px 8px; font-size: 14px; min-width: 100px; flex-shrink: 1;';
        for (const [name, value] of Object.entries(items)) {
            const option = document.createElement('option');
            option.value = value;
            option.textContent = name;
            if (value === id) option.selected = true;
            select.appendChild(option);
        }
        select.addEventListener('change', async () => {
            id = select.value;
            settings[shop].id = select.value;
            await GM.setValue('settings', settings);
        });

        const input = document.createElement('input');
        input.style.cssText = 'width: 75px; background-color: #1e1e1e; color: #f0f0f0; border: 1px solid #555; border-radius: 6px; padding: 4px 8px; font-size: 14px; flex-shrink: 0;';
        input.type = 'number';
        input.value = quantity;
        input.placeholder = 'Quantity';
        input.addEventListener('change', async () => {
            if (parseInt(input.value, 10) > 25) input.value = 25;
            quantity = parseInt(input.value, 10) || 25;
            settings.quantity = quantity;
            await GM.setValue('settings', settings);
        });

        header.appendChild(select);
        header.appendChild(input);
        header.appendChild(button);
    }

    createUI();
})();