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