Torn: Gimme Beers, Empty BB, Gas, Bricks

Gimme Beers, Empty blood bags, Gas and Bricks!

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Torn: Gimme Beers, Empty BB, Gas, Bricks
// @namespace      lugburz.gimme_beers
// @version        0.1.5
// @description    Gimme Beers, Empty blood bags, Gas and Bricks!
// @author         Lugburz, zstorm [2268511]
// @match          https://www.torn.com/shops.php?step=bitsnbobs*
// @match          https://www.torn.com/shops.php?step=pharmacy*
// @grant          none
// @icon           https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @license         MIT
// ==/UserScript==

//====================UPDATE:===============================
// 0.1.5  Added buttons for Gas and Bricks.
// 0.1.4  Added another buttons at Pharmacy to buy Empty Blood Bag.
// 0.1.3  Derived the script from lugburz.gimme_beers.
//========================================================

(function() {
    'use strict';

    // Configuration for all items (ID: Item ID, Area: shoparea value, Name: button text)
    const ITEMS = {
        'bitsnbobs': [
            { id: 180, area: 103, name: 'Beers', elementId: 'buyBeerBtn' },
            { id: 172, area: 103, name: 'Gas', elementId: 'buyGasBtn' },
            { id: 394, area: 103, name: 'Bricks', elementId: 'buyBrickBtn' }
        ],
        'pharmacy': [
            { id: 731, area: 110, name: 'Empty Blood Bag', elementId: 'buyEBBBtn' }
        ]
    };

    const STATUS_ELEMENT_ID = 'shopResultStatus';

    /**
     * Creates and adds a universal purchase button for a given item configuration.
     * @param {Object} itemConfig - The configuration object for the item.
     */
    function addPurchaseButton(itemConfig) {
        const { id, area, name, elementId } = itemConfig;

        // Only add the button, not a result span
        const buttonHtml = `<button id="${elementId}" style="color: var(--default-blue-color); cursor: pointer; margin-left:5;">${name}</button>`;

        $('div.content-title > h4').append(buttonHtml);

        $(`#${elementId}`).on('click', async () => {
            $(`#${STATUS_ELEMENT_ID}`).text(''); // Clear previous status
            await getAction({
                type: 'post',
                action: 'shops.php',
                data: {
                    step: 'buyShopItem',
                    ID: id,
                    amount: 100,
                    shoparea: area
                },
                success: (str) => {
                    try {
                        const msg = JSON.parse(str);
                        // Update the single shared status element
                        $(`#${STATUS_ELEMENT_ID}`).html(msg.text).css('color', msg.success ? 'green' : 'red');
                    } catch (e) {
                        console.error("Error parsing purchase response:", e, str);
                    }
                }
            });
        });
    }

    // --- Main Execution ---
    const currentUrl = window.location.href;
    const urlParams = new URLSearchParams(currentUrl.split('?')[1]);
    const step = urlParams.get('step');
    const headerElement = $('div.content-title > h4');

    if (step && ITEMS[step] && headerElement.length > 0) {
        // 1. Add all buttons for the current shop page
        ITEMS[step].forEach(item => addPurchaseButton(item));

        // 2. Add the single shared status element after all buttons
        const statusHtml = `<span id="${STATUS_ELEMENT_ID}" style="font-size: 12px; font-weight: 100; margin-left: 10px;"></span>`;
        headerElement.append(statusHtml);
    }
})();