Item stalker

Check supplied item IDs and list prices with colors

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Item stalker
// @namespace    http://torn.city.com.dot.com.com
// @version      0.2
// @description  Check supplied item IDs and list prices with colors
// @author       Adobi
// @match        https://www.torn.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    ///////////////////////////////// USER DEFINED VARIABLES /////////////////////////////////

    const itemIDs = [817,818];
    const itemNames = ['alcohol', 'energy drinks'];
    const desiredPrices = [990000, 16000000]
    const leftAligned = false; // select true for left aligned, false for right aligned

    ////////// END OF USER DEFINED VARIABLES. Change things below at your own risk. //////////

    // Function to create and display yellow square with the option to enter API key
    function displayYellowSquare() {
        const yellowSquare = document.createElement('div');
        yellowSquare.id = 'yellowSquare';
        yellowSquare.style.position = 'fixed';
        yellowSquare.style.left = '0';
        yellowSquare.style.top = '0';
        yellowSquare.style.color = 'black';
        yellowSquare.style.top = '300px';
        yellowSquare.style.width = '100px';
        yellowSquare.style.height = '100px';
        yellowSquare.style.backgroundColor = 'yellow';
        yellowSquare.style.zIndex = '99999999';
        yellowSquare.style.display = 'flex'; // Use flexbox for centering
        yellowSquare.style.cursor = 'pointer'; // Change cursor to pointer

        // Create a container div for centered text
        const textContainer = document.createElement('div');
        textContainer.style.margin = 'auto'; // Center horizontally
        textContainer.style.textAlign = 'center'; // Center text
        textContainer.style.display = 'flex';
        textContainer.style.flexDirection = 'column'; // Center vertically

        // Create text nodes for the yellow square with a line break
        const yellowTextNode0 = document.createTextNode('Busting friends');
        const lineBreak = document.createElement('br');
        const yellowTextNode1 = document.createTextNode('Click here to');
        const lineBreak2 = document.createElement('br');
        const yellowTextNode2 = document.createTextNode('supply public API key');

        // Append the text nodes and line break to the text container
        textContainer.appendChild(yellowTextNode0);
        textContainer.appendChild(lineBreak);
        textContainer.appendChild(yellowTextNode1);
        textContainer.appendChild(lineBreak2);
        textContainer.appendChild(yellowTextNode2);

        // Append the text container to the yellow square
        yellowSquare.appendChild(textContainer);

        // Append the yellow square to the body (if it's not already added)
        if (!document.getElementById('yellowSquare')) {
            document.body.appendChild(yellowSquare);
        }

        // Add a click event listener to the yellow square
        yellowSquare.addEventListener('click', () => {
            const apiKey = prompt('Enter your API key:');
            if (apiKey) {
                // Store the API key with GM_setValue
                GM_setValue('item_stalk_api_key', apiKey);
                yellowSquare.remove(); // Remove the yellow square after entering the API key
                fetchAndDisplayData(); // Run an API call with the new key
            }
        });
    }

    // Check if the API key is already stored using GM_getValue
    const apiKey = GM_getValue('item_stalk_api_key', '');

    // If the API key is not stored, display the yellow square
    if (!apiKey) {
        displayYellowSquare();
    }

    function displayText(bustlist, links, difficulty) {
        // Check if the text container already exists and remove it
        const existingTextContainer = document.getElementById('item-stalk-container-id');
        if (existingTextContainer) {
            existingTextContainer.remove();
        }

        const mainContainer = document.getElementById('mainContainer'); // Get the main container element

        if (mainContainer) {
            const textContainer = document.createElement('div');
            textContainer.id = 'item-stalk-container-id';
            textContainer.style.position = 'fixed';
            if (leftAligned) {
                textContainer.style.left = '0';
            } else {
                textContainer.style.right = '0';
            }
            textContainer.style.top = '100px';
            textContainer.style.zIndex = '9999';
            textContainer.style.display = 'block';

            for (let j = 0; j < bustlist.length; j++) {
                const link = document.createElement('a');
                link.href = links[j];
                link.textContent = bustlist[j] + difficulty[j];
                if (difficulty[j] < desiredPrices[j]) {
                    link.style.color = '#00FF00';
                } else {
                    link.style.color = 'red';
                }
                link.style.display = 'block';
                link.style.marginBottom = '2px';
                textContainer.appendChild(link);
            }

            mainContainer.appendChild(textContainer); // Append textContainer to mainContainer
        }
        displayBlackSquare(4 + bustlist.length * Math.round(125 / 9));
    }

    // Function to create and display the black square
    function displayBlackSquare(squareHeight) {
        const existingSquare = document.getElementById('item_stalk_blackSquare');
        if (existingSquare) {
            existingSquare.remove();
        }
        if (squareHeight > 4 ) {
            const mainContainer = document.getElementById('mainContainer'); // Get the main container element
            const blackSquare = document.createElement('div');
            blackSquare.id = 'item_stalk_blackSquare';
            blackSquare.style.position = 'fixed';
            if (leftAligned) {
                blackSquare.style.left = '0';
            } else {
                blackSquare.style.right = '0';
            }
            blackSquare.style.top = '98px';
            blackSquare.style.width = '260px';
            blackSquare.style.height = squareHeight + 'px';
            blackSquare.style.backgroundColor = '#191919';
            blackSquare.style.zIndex = '999';

            if (!document.getElementById('item_stalk_blackSquare')) {
                mainContainer.appendChild(blackSquare);
            }
        }
    }

    // Function to fetch API data for a single faction
    function fetchFactionData(factionID, apiKey, name) {
        return fetch(`https://api.torn.com/market/${factionID}?selections=bazaar,itemmarket&key=${apiKey}`)
            .then(response => response.json())
            .then(data => {
            const faction_and_name = [];
            const profile_link = [];
            const difficulty = [];

            // Check if there's an error in the API response
            if (data.error && data.error.error === 'Incorrect key') {
                GM_setValue('item_stalk_api_key', '');
                displayYellowSquare();
            } else {
                const mathyhelp = Math.min(data['itemmarket'][0]['cost'], data['bazaar'][0]['cost']);
                faction_and_name.push(name + " - ");
                profile_link.push('https://www.torn.com/imarket.php#/p=shop&step=shop&type=' + factionID);
                difficulty.push(mathyhelp);
            }

            return { faction_and_name, profile_link, difficulty };
        })
            .catch(error => {
            console.error('there was an API Error:', error);
            return { faction_and_name: [], profile_link: [], difficulty: [] };
        });
    }

    // Function to fetch API data and display the red square
    function fetchAndDisplayData() {
        const currentTime = Date.now();
        const lastCallTime = GM_getValue('item_stalk_lastCallTime', 0);

        // Check if at least 30 seconds have passed since the last API call
        if (currentTime - lastCallTime >= 30000) {
            // Check if the API key is already stored using GM_getValue
            const apiKey = GM_getValue('item_stalk_api_key', '');
            // If the API key is not stored, display the yellow square
            if (!apiKey) {
                displayYellowSquare();
            }

            const fetchPromises = [];
            GM_setValue('item_stalk_lastCallTime', currentTime); // Store the current timestamp
            for (let i = 0; i < itemIDs.length; i++) {
                const promise = fetchFactionData(itemIDs[i], apiKey, itemNames[i]);
                fetchPromises.push(promise);
            }

            Promise.all(fetchPromises)
                .then(results => {
                const faction_and_name = [];
                const profile_link = [];
                const difficulty = [];

                results.forEach(result => {
                    faction_and_name.push(...result.faction_and_name);
                    profile_link.push(...result.profile_link);
                    difficulty.push(...result.difficulty);
                });
                if (profile_link.length > 0) {
                    GM_setValue('item_stalk_fan', faction_and_name);
                    GM_setValue('item_stalk_pl', profile_link);
                    GM_setValue('item_stalk_t', difficulty);
                    displayText(faction_and_name, profile_link, difficulty);
                } else {
                    GM_setValue('item_stalk_fan', "");
                    GM_setValue('item_stalk_pl', "");
                    GM_setValue('item_stalk_t', "");
                }
            });
        } else {
            displayText(GM_getValue('item_stalk_fan'), GM_getValue('item_stalk_pl'), GM_getValue('item_stalk_t'));
        }
    }

    // Repeat every 5 seconds
    fetchAndDisplayData();
    setInterval(fetchAndDisplayData, 5000);
})();