// ==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);