Neopets - Karla's Shop Wizard Quick Buy

Buy items without opening usershop!

// ==UserScript==
// @name         Neopets - Karla's Shop Wizard Quick Buy
// @namespace    karla@neopointskarla
// @license      GPL3
// @version      0.0.1
// @description  Buy items without opening usershop!
// @author       Karla
// @homepage     https://neopointskarla.com
// @match        *://*.neopets.com/*
// @icon         https://github.com/karlaneo/neopets-scripts/blob/main/favicon-32x32.png?raw=true
// @grant        none
// ==/UserScript==

async function quickbuy(link) {
    const shopHtml = await fetch(link, {
        headers: {
            accept:
            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
            "Accept-Language": "en-US",
        },
        referrer: "https://www.neopets.com/shops/wizard.phtml",
        referer: "https://www.neopets.com/shops/wizard.phtml",
        referrerPolicy: "strict-origin-when-cross-origin",
        body: null,
        method: "GET",
        mode: "cors",
        credentials: "include",
    }).then((res) => res.text());
    let parser = new DOMParser();
    let doc = parser.parseFromString(shopHtml, "text/html");
    const buyLink = doc.querySelector('[style="text-align: center; margin: 10px;"] a')?.getAttribute('href');
    if (!buyLink) {
        return 0;
    }
    const buyResultHtml = await fetch(`https://www.neopets.com/${buyLink}`, {
        headers: {
            accept:
            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
            "accept-language": "en-US",
        },
        referrer: link,
        referer: link,
        referrerPolicy: "strict-origin-when-cross-origin",
        body: null,
        method: "GET",
        mode: "cors",
        credentials: "include",
    }).then((res) => res.text());
    if (
        buyResultHtml.includes(
            "The item you are trying to buy does not exist in this shop!",
        )
    ) {
        return 0;
    }
    if (buyResultHtml.includes('class="errorOuter"')) {
        return 2;
    }
    return 1;
}

(function() {
    'use strict';

    // Your code here...
    try {
        const sswPanel = document.querySelector('#sswresults');
        const sswPanel2 = document.querySelector('#ssw-tabs-2 #results');
        const swPanel = document.querySelector('#shopWizardFormResults');
        if (sswPanel) {
            const observer = new MutationObserver((mutationsList, observer) => {
                for (const mutation of mutationsList) {
                    if (mutation.type === "childList") {
                        if (sswPanel.querySelector('.ssw-results-grid-header')) {
                            sswPanel.querySelector('.ssw-results-grid-header').innerHTML += '<div class="ssw-results-grid-h"></div>';
                            sswPanel.querySelector('.ssw-results-grid-header').style.gridTemplateColumns = '35% auto 35% 10%';
                        }
                        const resultRows = Array.from(sswPanel.querySelectorAll('li:not(.ssw-results-grid-header)')).forEach(function(row) {
                            row.innerHTML += '<button>Buy</button>';
                            row.style.gridTemplateColumns = '35% auto 35% 10%';
                            row.querySelector('button').addEventListener('click', async function(event) {
                                event.target.innerHTML = '...';
                                event.target.disabled = true;
                                const link = event.target.parentNode.querySelector('.plink').href;
                                const result = await quickbuy(link);
                                if (result === 0) {
                                    event.target.innerHTML = 'Fail';
                                } else if (result === 1) {
                                    const countEl = event.target.parentNode.querySelector('.ssw-results-grid-stock');
                                    countEl.innerHTML = Number(countEl.innerHTML) - 1;
                                    if (countEl.innerHTML === '0') {
                                        event.target.innerHTML = 'Done';
                                    } else {
                                        event.target.disabled = false;
                                        event.target.innerHTML = 'Again';
                                    }
                                } else if (result === 2) {
                                    event.target.disabled = false;
                                    event.target.innerHTML = 'Again';
                                }
                            });
                        });
                    }
                }
            });
            observer.observe(sswPanel, {
                childList: true,
                subtree: false,
            });
        }
        if (sswPanel2) {
            document.querySelector('#ssw-tabs').style.height = '300px';
            const observer = new MutationObserver((mutationsList, observer) => {
                for (const mutation of mutationsList) {
                    if (mutation.type === "childList") {
                        const trs = sswPanel2.querySelectorAll('#results_table tr');
                        for (let i = 0; i < trs.length; i += 1) {
                            if (i === 0) {
                                if (trs[i].querySelectorAll('th').length === 3) {
                                    trs[i].innerHTML += '<th class="ssw_col4"></th>';
                                }
                            } else {
                                if (!trs[i].querySelector('button')) {
                                    trs[i].innerHTML += '<button style="padding: 0">Buy</button>';
                                    trs[i].querySelector('button').addEventListener('click', async function(event) {
                                        event.target.innerHTML = '...';
                                        event.target.disabled = true;
                                        const link = event.target.parentNode.querySelector('.plink').href;
                                        const result = await quickbuy(link);
                                        if (result === 0) {
                                            event.target.innerHTML = 'Fail';
                                        } else if (result === 1) {
                                            const countEl = event.target.parentNode.querySelectorAll('td')[1];
                                            countEl.innerHTML = Number(countEl.innerHTML) - 1;
                                            if (countEl.innerHTML === '0') {
                                                event.target.innerHTML = 'Done';
                                            } else {
                                                event.target.disabled = false;
                                                event.target.innerHTML = 'Again';
                                            }
                                        } else if (result === 2) {
                                            event.target.disabled = false;
                                            event.target.innerHTML = 'Again';
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            });
            observer.observe(sswPanel2, {
                childList: true,
                subtree: false,
            });
        }
        if (swPanel) {
            const observer = new MutationObserver((mutationsList, observer) => {
                for (const mutation of mutationsList) {
                    if (mutation.type === "childList") {
                        if (swPanel.querySelector('.wizard-results-grid-header') && swPanel.querySelectorAll('.wizard-results-grid-header h3').length === 3) {
                            swPanel.querySelector('.wizard-results-grid-header').innerHTML += '<h3></h3>';
                            swPanel.querySelector('.wizard-results-grid-header').style.gridTemplateColumns = '35% auto 35% 10%';
                        }
                        const resultRows = Array.from(swPanel.querySelectorAll('.wizard-results-grid li:not(.wizard-results-grid-header)')).forEach(function(row) {
                            if (!row.querySelector('button')) {
                                row.innerHTML += '<button>Buy</button>';
                                row.style.gridTemplateColumns = '35% auto 35% 10%';
                                row.querySelector('button').addEventListener('click', async function(event) {
                                    event.target.innerHTML = '...';
                                    event.target.disabled = true;
                                    const link = event.target.parentNode.querySelector('a').href;
                                    const result = await quickbuy(link);
                                    if (result === 0) {
                                        event.target.innerHTML = 'Fail';
                                    } else if (result === 1) {
                                        const countEl = event.target.parentNode.querySelector('p');
                                        countEl.innerHTML = Number(countEl.innerHTML) - 1;
                                        if (countEl.innerHTML === '0') {
                                            event.target.innerHTML = 'Done';
                                        } else {
                                            event.target.disabled = false;
                                            event.target.innerHTML = 'Again';
                                        }
                                    } else if (result === 2) {
                                        event.target.disabled = false;
                                        event.target.innerHTML = 'Again';
                                    }
                                });
                            }
                        });
                    }
                }
            });
            observer.observe(swPanel, {
                childList: true,
                subtree: false,
            });
        }
    } catch (e) {
        console.log(e);
    }
})();