Mousehunt Helper - XHRIntercept

XHR Intercept for MHH

Per 26-05-2014. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        Mousehunt Helper - XHRIntercept
// @namespace   DSXC
// @description XHR Intercept for MHH
// @include     http://www.mousehuntgame.com/*
// @include     https://www.mousehuntgame.com/*
// @include     http://apps.facebook.com/mousehunt/*
// @include     https://apps.facebook.com/mousehunt/*
// @version     1.0
// ==/UserScript==
//===============================================================================

var _is_xhri_setup = false;
var _trap_update_user_array = new Array();
var _timeout_called = false;
var _timeout_hidden_called = false;
var _last_user;

setupCommunications();

function setupCommunications()
{
    document.addEventListener("xhri_trap_change", xhri_trap_change, false);
    document.addEventListener("xhri_hidden_item", xhri_hidden_item, false);
    _is_xhri_setup = true;
}

function xhri_trap_change(aEvent)
{
    if (typeof user == 'undefined')
    {
        timeout = setTimeout(function(){xhri_trap_change(aEvent)}, 2000);
        return;
    }

    _trap_update_user_array.push(user);
    
    if (_timeout_called)
        return;

    _timeout_called = true;
    timeout = setTimeout(function(){call_trap_check()}, 2000);
}

function xhri_hidden_item(aEvent)
{
    if (typeof hg == 'undefined' || 
        $(".inventoryitemview[data-view-id="+$($("#tabbarContent_page_4 .inventoryitemview")[0]).data("viewId")+"]").length <= 0)
    {
        timeout = setTimeout(function(){xhri_hidden_item(aEvent)}, 2000);
        return;
    }

    if (_timeout_hidden_called)
        return;

    _timeout_hidden_called = true;
    timeout = setTimeout(function(){call_modify_hidden_items()}, 2000);
}

function call_trap_check()
{
    var _trap_update_user = JSON.stringify(_trap_update_user_array.pop());

    //Don't send another update if the last user pushed is the same as the user we're currently on.
    if (_trap_update_user == _last_user)
    {
        _trap_update_user_array.length = 0;
        _timeout_called = false;
        return;
    }

    var evt = document.createEvent("MutationEvents");
    evt.initMutationEvent("ht_trap_change", true, true, this, _trap_update_user, _trap_update_user, 'ht_stuff', 1);

    document.dispatchEvent(evt);

    _last_user = _trap_update_user;
    _trap_update_user_array.length = 0;
    _timeout_called = false;
}

function call_modify_hidden_items()
{
    var inv = hg.utils.UserInventory.getAllItems();
    for (var category in inv) if (inv.hasOwnProperty(category) && category != "length")
    {
        for (var item in inv[category]) if (inv[category].hasOwnProperty(item) && item != "length")
        {
            hg.utils.UserInventory.getAllItems()[category][item].is_hidden = false;
        }
    }

    //Empty the existing items:
    $(".inventoryitemview[data-view-id="+$($("#tabbarContent_page_4 .inventoryitemview")[0]).data("viewId")+"]").empty();

    //Render all the items again:
    app.views.InventoryItemView[$($("#tabbarContent_page_4 .inventoryitemview")[0]).data("viewId")].render();
}

function getQueryParams(qs) 
{
    var urlParams = {},
        e,
        d = function (s) { return decodeURIComponent(s).replace(/\+/g, " "); },
        r = /([^&=]+)=?([^&]*)/g;

    while (e = r.exec(d(qs))) {
        if (e[1].indexOf("[") == "-1")
            urlParams[d(e[1])] = d(e[2]);
        else {
            var b1 = e[1].indexOf("["),
                aN = e[1].slice(b1+1, e[1].indexOf("]", b1)),
                pN = d(e[1].slice(0, b1));
          
            if (typeof urlParams[pN] != "object")
                urlParams[d(pN)] = {},
                urlParams[d(pN)].length = 0;
            
            if (aN)
                urlParams[d(pN)][d(aN)] = d(e[2]);
            else
                Array.prototype.push.call(urlParams[d(pN)], d(e[2]));
        }
    }

    return urlParams;
}

(function(open) 
{
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) 
    {
        if (typeof url == 'string')
        {
            if (url.search('mousehuntgame') != -1)
            {
                if (!_is_xhri_setup)
                    setupCommunications();
								/*
                window.unsafeWindow || (
                    unsafeWindow = (function() 
                    {
                        var el = document.createElement('p');
                        el.setAttribute('onclick', 'return window;');
                        return el.onclick();
                    })()
                );*/

                var mh_user = window.user; //unsafeWindow.user;
                
                if (mh_user != null)
                {
                    this.mhUserJSON = mh_user;

                    //TODO: Make a call to grab the user variable from HG with the least amount of data. Use this as a direct before snapshot of event firing.
                    //      In conjunction with the earlier variable grab we can determine 3 points of user values for hunt tracking.

                    this.calledURL = url;
                    this.addEventListener("readystatechange", function() 
                    {
                        if (this.readyState == 4)
                        {
                            if (this.responseText.substring(0, 1) == "{")
                            {
                                //TODO: Make this all generic, have one event thrown, and one submit. 
                                //      Specific instructions can be made in the response packet so message information can be gathered from there.

                                var respJSON = JSON.parse(this.responseText);
                                respJSON.ht_submit_URL = this.calledURL;
                                respJSON.ht_submit_params = this.submit_params;

                                //Hunt submission
                                if (this.calledURL.search('activeturn.php') != -1)
                                {
                                    var evt = document.createEvent("MutationEvents");

                                    evt.initMutationEvent("ht_submit", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);
                                    document.dispatchEvent(evt);
                                }

                                //NOTE: Currently disabled.
                                //Crafting attempts.
                                else if (this.calledURL.search('crafting.php') != -1)
                                {
                                    /*
                                    var crafts = $('#selectedComponents div.craftThumb:has(input)');
                                    var t_array = Array();
                                    for (var i in respJSON.ht_submit_params.parts)
                                    {
                                        for (var j = 0; j < crafts.length; j++)
                                        {
                                            if (crafts[j].classList.contains(i))
                                            {
                                                var t_obj = new Object();
                                                t_obj.name = $('span', crafts[j]).html();
                                                t_obj.val = respJSON.ht_submit_params.parts[i];
                                                t_array.push(t_obj);
                                                break;
                                            }
                                        }
                                    }

                                    respJSON.ht_submit_params.parts.translated = t_array;

                                    var evt = document.createEvent("MutationEvents");

                                    evt.initMutationEvent("ht_crafting", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);
                                    document.dispatchEvent(evt);
                                    */
                                }

                                //TEM effectiveness selection
                                else if (this.calledURL.search('getmiceeffectiveness.php') != -1)
                                {
                                    var evt = document.createEvent("MutationEvents");

                                    evt.initMutationEvent("ht_effectiveness", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);
                                    document.dispatchEvent(evt);
                                }

                                //Adversaries page tab click
                                else if (this.calledURL.search('getmousegroup.php') != -1 ||
                                         this.calledURL.search('getregionmice.php') != -1)
                                {
                                    var evt = document.createEvent("MutationEvents");

                                    evt.initMutationEvent("ht_group_effectiveness", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);
                                    document.dispatchEvent(evt);
                                }
                                
                                //Convertible
                                else if (this.calledURL.search('useconvertible.php') != -1)
                                {
                                    var evt = document.createEvent("MutationEvents");
                                    evt.initMutationEvent("ht_convertible", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);

                                    document.dispatchEvent(evt);
                                }

                                //Inventory
                                else if (this.calledURL.search('userInventory.php') != -1)
                                {
                                    var evt = document.createEvent("MutationEvents");
                                    evt.initMutationEvent("ht_inventory", true, true, this, JSON.stringify(this.mhUserJSON), JSON.stringify(respJSON), 'ht_stuff', 1);

                                    document.dispatchEvent(evt);
                                }                        
                            }
                        }
                    }, 
                    false);
                }
            }
        }

        //Call regardless. Use async if not defined to avoid hanging browser due to extension needing waiting on response.
        if (is_set(async))
            open.call(this, method, url, async, user, pass);
        else
            open.call(this, method, url, true, user, pass);
    };

})(XMLHttpRequest.prototype.open);


(function(send) {
    XMLHttpRequest.prototype.send = function(params)
    {
        this.submit_params = getQueryParams(params);
        send.call(this, params);
    }
})(XMLHttpRequest.prototype.send);


function is_set(variable)
{
    if (typeof variable === "undefined")
        return false;
    else
        return true;
}