Torn Set Calculator

Calculates prices of plushie and flower sets

目前為 2015-07-31 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name Torn Set Calculator
// @version 0.1
// @namespace   mrhat.tornSetCalculator
// @description Calculates prices of plushie and flower sets
// @author MrHat
// @require http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @require http://cdnjs.cloudflare.com/ajax/libs/accounting.js/0.4.1/accounting.min.js
// @match http://www.torn.com/imarket.php*
// @match https://www.torn.com/imarket.php*
// ==/UserScript==

// Intercept ajax requests related to the item market
(function(XHR) {
    "use strict";

    var open = XHR.prototype.open;
    var send = XHR.prototype.send;

    XHR.prototype.open = function(method, url, async, user, pass) {
        this._url = url;
        open.call(this, method, url, async, user, pass);
    };

    XHR.prototype.send = function(data) {
        var self = this;
        var url = this._url;

        // Function is invoked when a response was received from the item market
        function onReadyStateChange() {
            if(self.readyState == 4 /* complete */) {

                // Process the items and their pricess
                var items = JSON.parse(this.response);
                itemsLoaded(items);
            }
        }
        
        function itemsLoaded(items) {
            // List item ids of sets
            var itemSets = {
                plushies: ["186", "215", "187", "261", "618", "258", "273", "269", "266", "268", "281", "274", "384"],
                flowers: ["260", "617", "263", "272", "264", "271", "267", "277", "282", "276", "385"]
            };
            
            // Create an array with all items ids we are interested in
            var sets = itemSets.plushies.concat(itemSets.flowers);

            // Loop through response items and calculate the sum of all relevant items
            var sum = 0;
            items.forEach(function(item) {
                if ($.inArray(item.itemID, sets) !== -1) {
                    sum += parseInt(item.price);
                }
            });

            // Calculate price of individual points
            var individualPoint = sum / 10;

            // Show results on page (attempt to find container, if it's not there we create it)
            var container = $('#setCalculator');
            if (!container.length) {
                container = $('<div>').attr('id', 'setCalculator').addClass('msg right-round');
                
                var wrapper = $('<div>').addClass('info-msg border-round').html($('<i>').addClass('info-icon'));
                wrapper.append(container);
                wrapper.prependTo($('.main-market-page'));
            }
            
            // Clear text
            container.empty();
            
            // Only show results if we have something to show
            if (sum > 0) {
                var msg = $('<span>').html('1 complete set costs <b>' + accounting.formatMoney(sum, "$", 0) + '</b>. This equals to <b>' + accounting.formatMoney(individualPoint, "$", 0) + '</b> per point.');
                container.append(msg);
            } else {
                var msg = $('<span>').html('No sets available.');
                container.append(msg);
            }
        }
        
        // We only intercept requests for the item market
        var marketRegex = /^imarket.php\?rfcv=(\d+)$/;
        if (marketRegex.test(url)) {
            this.addEventListener("readystatechange", onReadyStateChange, false);
        }

        send.call(this, data);
    }
})(XMLHttpRequest);