Mousehunt Helper - XHRIntercept

XHR Intercept for MHH

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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