// ==UserScript== // @name MH - Maptain Tool // @description Maptain Tool: Send SB and Map invite in a click! // @author Chromatical // @version 1.0.1 // @match https://www.mousehuntgame.com/* // @match https://apps.facebook.com/mousehunt/* // @resource https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css // @require https://code.jquery.com/ui/1.12.1/jquery-ui.js // @require https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js // @icon https://www.google.com/s2/favicons?domain=mousehuntgame.com // @namespace https://greasyfork.org/users/748165 // @downloadURL none // ==/UserScript== $(document).ready(function() { addTouchPoint(); }); function addTouchPoint() { if ($('.snipeHix').length == 0) { const invPages = $('.friends .tournament_scoreboards '); const snipeHix = document.createElement('li'); snipeHix.classList.add('maptain_tool'); const snipeHixBtn = document.createElement('a'); snipeHixBtn.innerText = "Maptain Tool"; snipeHixBtn.onclick = function () { render(); }; const icon = document.createElement("div"); icon.className = "icon"; snipeHixBtn.appendChild(icon); snipeHix.appendChild(snipeHixBtn); $(snipeHix).insertAfter(invPages); } } function getFriends(){ return new Promise((resolve, reject) => { postReq("https://www.mousehuntgame.com/managers/ajax/users/userData.php", `sn=Hitgrab&hg_is_ajax=1&uh=${user.unique_hash}&get_friends=true` ).then(res=>{ try{ var data = JSON.parse(res.responseText); var friendNameList = [] if(data.user_data){ var friendSnuidList = Object.keys(data.user_data) for(var i=0;i el.remove()) const div = document.createElement("div"); div.id = "map-tool-box"; div.style.backgroundColor = "#F5F5F5"; div.style.position = "fixed"; div.style.zIndex = "9999"; div.style.left = "35vw"; div.style.top = "28vh"; div.style.border = "solid 3px #696969"; div.style.borderRadius = "20px"; div.style.padding = "10px"; div.style.textAlign = "center"; div.style.fontSize = "12px" const closeButton = document.createElement("button", { id: "close-button" }); closeButton.textContent = "x" closeButton.style.marginLeft = "5px" closeButton.style.cursor = "pointer" closeButton.onclick = function () { document.body.removeChild(div); }; const minButton = document.createElement("button", { id: "minimise-button" }); minButton.textContent = "-" minButton.style.marginLeft = "57px" minButton.style.cursor = "pointer" minButton.onclick = function(){ if (minButton.textContent == "-"){ $("#maptain-tool-content")[0].style.display = "none" $(".maptain-tool-info")[0].style.marginLeft = "0px" minButton.textContent = "+" minButton.style.marginLeft = "5px" } else if (minButton.textContent == "+"){ $("#maptain-tool-content")[0].style.display = "" $(".maptain-tool-info")[0].style.marginLeft = "17px" minButton.textContent = "-" minButton.style.marginLeft = "57px" } } const toolInfo = document.createElement("div") toolInfo.className = "maptain-tool-info" toolInfo.textContent = "Maptain Tool" toolInfo.style.height = "21px" toolInfo.style.textAlign = "Left" toolInfo.style.marginLeft = "17px" toolInfo.style.fontWeight = "bold" toolInfo.style.cursor = "context-menu" const contentDiv = document.createElement("div") contentDiv.id = "maptain-tool-content" const table = document.createElement("table"); table.id = "maptain-tool-table" table.style.textAlign = "left"; table.style.borderSpacing = "1em 0" //hid------------------------------------------- const hid_row = document.createElement("tr"); const hid_td1 = document.createElement("td"); const hid_td2 = document.createElement("td") const hid_radio = document.createElement("input") hid_radio.type = "radio"; hid_radio.name = "chro-hunter-friend" hid_radio.id = "chro-hunter-radio" hid_radio.style.verticalAlign = "middle" hid_radio.style.marginTop = "-2px" hid_radio.checked = true; hid_radio.onchange = function (){ processRadio() } hid_td1.appendChild(hid_radio) const hid_label = document.createElement("label"); hid_label.innerText = "Hunter ID: " hid_label.htmlFor = "chro-radio-hid" hid_td1.appendChild(hid_label); const hid_input = document.createElement("input"); hid_input.type = "text"; hid_input.id = "hunter-input-id" hid_input.size = "10" hid_input.style.placeHolder = "1"; hid_td2.appendChild(hid_input) //friends--------------------------------------- const friend_row = document.createElement("tr"); const friend_td1 = document.createElement("td"); friend_td1.style.textAlign = "right" const friend_td2 = document.createElement("td") const friend_radio = document.createElement("input") friend_radio.type = "radio"; friend_radio.name = "chro-hunter-friend" friend_radio.id = "chro-friend-radio" friend_radio.style.verticalAlign = "middle" friend_radio.style.marginTop = "-2px" friend_radio.style.position = "relative" friend_radio.style.right = "17.5px" friend_radio.onchange = function(){ processRadio(); }; friend_td1.appendChild(friend_radio) const friend_label = document.createElement("label"); friend_label.innerHTML = "Friend:" friend_label.htmlFor = "chro-radio-friend" friend_td1.appendChild(friend_label); const friend_input = document.createElement("input"); friend_input.type = "text"; friend_input.id = "hunter-input-id" friend_input.disabled = true; friend_input.size = "10" friend_td2.appendChild(friend_input) //Either friend or hunter------------------------------------- var friendList; var friendSnuid; var snuid; var name; async function processRadio() { if (hid_radio.checked) { hid_input.disabled = false; friend_input.disabled = true; friend_input.value = "" } else if (friend_radio.checked) { hid_input.disabled = true; friend_input.disabled = false; hid_input.value = "" var list = await getFriends(); friendSnuid = list[0]; friendList = list[1] $("#hunter-input-id").autocomplete({ source: list[1], open: function(){ setTimeout(function () { $('.ui-autocomplete').css('z-index', 99999999999999); }, 0); } }); } } //sb-------------------------------------------- const sb_row = document.createElement("tr"); const sb_td1 = document.createElement("td"); sb_td1.style.textAlign = "right" const sb_td2 = document.createElement("td"); const sb_label = document.createElement("label"); sb_label.innerText = "SB Amount: " sb_td1.appendChild(sb_label); const sb_input = document.createElement("input"); sb_input.type = "text"; sb_input.id = "sb-input-id" sb_input.size = "10" sb_input.placehodler = "112" sb_td2.appendChild(sb_input); //map-------------------------------------- const map_row = document.createElement("tr"); const map_td1 = document.createElement("td"); map_td1.style.textAlign = "right" const map_td2 = document.createElement("td"); const map_label = document.createElement("label"); map_label.innerText = "Map: " map_td1.appendChild(map_label); const map_select = document.createElement("select",{ id: "map_select"}); map_select.style.width = "103px" var user_maps = user.quests.QuestRelicHunter.maps if (user_maps){ for (var i=0;i 0){ var snuidAndName = await getSnuidAndName(hid_input.value,friend_input.value,friendList,friendSnuid) snuid = snuidAndName[0] name = snuidAndName[1] var promise = await getConfirmation("sendSB",snuid,name,sb_input.value) .then( result => sendSB(snuid,sb_input.value), error => {} ) } } const mapBtn = document.createElement("button",{ id: "map-button" }) mapBtn.textContent = "Invite" mapBtn.style.cursor = "pointer" mapBtn.style.marginLeft = "5px" mapBtn.onclick = async function (){ if(map_select.value != "None"){ var map_id; for (var i=0;i sendInvite(snuid,map_id), error => {} ) } } } const bothBtn = document.createElement("button",{ id: "both-button" }) bothBtn.textContent = "Both" bothBtn.style.cursor = "pointer" bothBtn.style.marginLeft = "5px" bothBtn.onclick = async function (){ if(map_select.value != "None" && sb_input.value > 0){ var map_id; for (var i=0;i {sendSB(snuid,sb_input.value);sendInvite(snuid,map_id)}, error => {} ) } } } actionDiv.appendChild(sbBtn) actionDiv.appendChild(mapBtn) actionDiv.appendChild(bothBtn) toolInfo.appendChild(minButton); toolInfo.appendChild(closeButton); div.appendChild(toolInfo); contentDiv.appendChild(document.createElement("br")) contentDiv.appendChild(table); contentDiv.appendChild(document.createElement("br")) contentDiv.appendChild(actionDiv) div.appendChild(contentDiv); document.body.appendChild(div); dragElement(div); } async function getSnuidAndName(hid_input,friend_input,friendList,friendSnuid){ return new Promise(async(resolve, reject) => { if(hid_input){ var snuidAndName = await getSnuidId(hid_input); var snuid = snuidAndName[0]; var name = snuidAndName[1]; } else if (friend_input){ var friend_index = friendList.indexOf(friend_input); snuid = friendSnuid[friend_index]; name = friend_input; } resolve ([snuid,name]) }) } function getSnuidId(hid){ return new Promise((resolve, reject) => { if(hid != user.user_id && hid.length >0){ postReq("https://www.mousehuntgame.com/managers/ajax/pages/friends.php", `sn=Hitgrab&hg_is_ajax=1&action=community_search_by_id&user_id=${hid}&uh=${user.unique_hash}` ).then(res=>{ try{ var data = JSON.parse(res.responseText); if (data){ var hunter_name = data.friend.name; var hunter_snuid = data.friend.sn_user_id; resolve([hunter_snuid,hunter_name]) } }catch (error){ console.log(error) } }) } }) } function getConfirmation(action,snuid,name,input_value,input_value2){ return new Promise((resolve, reject) => { document .querySelectorAll("#confirm-action-box") .forEach(el=> el.remove()) const actdiv = document.createElement("div"); actdiv.id = "confirm-action-box"; actdiv.style.backgroundColor = "#F5F5F5"; actdiv.style.position = "fixed"; actdiv.style.zIndex = "9999"; actdiv.style.left = "28vw"; actdiv.style.top = "28vh"; actdiv.style.border = "solid 3px #696969"; actdiv.style.borderRadius = "20px"; actdiv.style.padding = "10px"; actdiv.style.textAlign = "center"; const cfmdiv = document.createElement("div") cfmdiv.id = "map-confirm-header" cfmdiv.style.fontSize = "12px" if (action == "sendSB"){ cfmdiv.innerText = "Send ".concat(input_value," SUPER|Brie+ to ",name,"?") } else if (action == "sendInvite"){ cfmdiv.innerText = "Send ".concat(input_value," invite to ",name,"?") } else if (action == "sendSBAndInvite"){ cfmdiv.innerText = "Send ".concat(input_value," SUPER|Brie+ and ",input_value2," invite to ",name,"?") } //Buttons ----------- const doBtnDiv = document.createElement("div"); const cfmBtn = document.createElement("button",{ id: "cfm-button" }) cfmBtn.style.cursor = "pointer" cfmBtn.innerText = "Confirm" cfmBtn.onclick = function(){ document.body.removeChild(actdiv); resolve() } const noBtn = document.createElement("button",{ id: "no-button" }) noBtn.innerText = "Cancel" noBtn.style.marginLeft = "5px" noBtn.style.cursor = "pointer" noBtn.onclick = function(){ document.body.removeChild(actdiv); reject(this) } doBtnDiv.appendChild(cfmBtn) doBtnDiv.appendChild(noBtn) actdiv.appendChild(cfmdiv) actdiv.appendChild(document.createElement("br")) actdiv.appendChild(doBtnDiv) document.body.appendChild(actdiv); dragElement(actdiv); }) } function sendSB(snuid,quantity){ postReq("https://www.mousehuntgame.com/managers/ajax/users/supplytransfer.php", `sn=Hitgrab&hg_is_ajax=1&receiver=${snuid}&uh=${user.unique_hash}&item=super_brie_cheese&item_quantity=${quantity}` ).then(function(){ try{ alert("SB Successfully Sent!") } catch(error){ alert("SB Sending Failed!"); console.log(error) } }) } function sendInvite(snuid,mapId){ postReq("https://www.mousehuntgame.com/managers/ajax/users/treasuremap.php", `sn=Hitgrab&hg_is_ajax=1&action=send_invites&map_id=${mapId}&snuids%5B%5D=${snuid}&uh=${user.unique_hash}&last_read_journal_entry_id=${lastReadJournalEntryId}` ).then(res=>{ try{ var data = JSON.parse(res.responseText); if(data.success == "1"){ alert("Sent Map Invite!") } else { alert("Invite failed:\nYou are not the maptain or\nInvite has been sent before! or\nMap is full!") } } catch(error){ alert("Ajax Request Failed! Please contact Chromatical on Discord"); console.log(error) } }) } function dragElement(elmnt) { var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; if (elmnt.firstElementChild) { // if present, the header is where you move the DIV from: elmnt.firstElementChild.onmousedown = dragMouseDown; } else { // otherwise, move the DIV from anywhere inside the DIV: elmnt.onmousedown = dragMouseDown; } function dragMouseDown(e) { e = e || window.event; e.preventDefault(); // get the mouse cursor position at startup: pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; // call a function whenever the cursor moves: document.onmousemove = elementDrag; } function elementDrag(e) { e = e || window.event; e.preventDefault(); // calculate the new cursor position: pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; // set the element's new position: elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; } function closeDragElement() { // stop moving when mouse button is released: document.onmouseup = null; document.onmousemove = null; } } function postReq(url, form) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function () { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { resolve(this); } }; xhr.onerror = function () { reject(this); }; xhr.send(form); }); }