From 047edb003527d9e43bba106e6f44939645c1514d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nis=20B=C3=B6rge=20Wechselberg?= Date: Sun, 5 Jan 2014 19:14:05 +0100 Subject: [PATCH] Pushing Scripts to GitLab --- VDex_Project_Ajax_Cature.user.js | 302 ++++++++++++++++++ VDex_Project_Battle_Tool.user.js | 82 +++++ VDex_Project_Berry_Timer.user.js | 43 +++ VDex_Project_Dungeon_Enemy_Indicator.user.js | 116 +++++++ ...roject_Mark_all_pokemon_as_private.user.js | 45 +++ VDex_Project_Pokemon_Tracker.user.js | 213 ++++++++++++ VDex_Project_Refresh_Counter.user.js | 56 ++++ VDex_Project_Search_for_Pokemon.user.js | 23 ++ VDex_Project_Timezone_Changer.user.js | 74 +++++ 9 files changed, 954 insertions(+) create mode 100755 VDex_Project_Ajax_Cature.user.js create mode 100755 VDex_Project_Battle_Tool.user.js create mode 100755 VDex_Project_Berry_Timer.user.js create mode 100755 VDex_Project_Dungeon_Enemy_Indicator.user.js create mode 100755 VDex_Project_Mark_all_pokemon_as_private.user.js create mode 100755 VDex_Project_Pokemon_Tracker.user.js create mode 100755 VDex_Project_Refresh_Counter.user.js create mode 100755 VDex_Project_Search_for_Pokemon.user.js create mode 100755 VDex_Project_Timezone_Changer.user.js diff --git a/VDex_Project_Ajax_Cature.user.js b/VDex_Project_Ajax_Cature.user.js new file mode 100755 index 0000000..cf7f31f --- /dev/null +++ b/VDex_Project_Ajax_Cature.user.js @@ -0,0 +1,302 @@ +// ==UserScript== +// @name VDex Project Ajax capture +// @namespace Http://www.enbewe.de/vdex +// @description Tries to capture Ajax events +// @include http://vdexproject.net/dungeon.php?mode=navigate* +// @version 0.1 +// ==/UserScript== + +// Control flags +var maincontrol = false; +var travel = false; +var take_skills = false; +var autobattle = false; + +// Status variables +var mode = 'unknown'; +var room = ''; +var lastDirection = 'east'; + +// Create control window +// TODO: create option to minimize +var controlWindow = document.createElement('div'); +controlWindow.setAttribute('style','width:180px; height:180px; position: fixed; top: 10px; left: 10px; background: #232323; border: 3px solid grey; padding: 10px;'); +document.getElementById('login').parentNode.appendChild(controlWindow); +refreshControlWindow(); + +function handleSend(send) { + var rege; + + rege = /mode=changeroom&direction=(\w+)/; + if (rege.test(send)) { + rege.exec(send); + mode = 'roomchange'; +// alert('Sending roomchange to '+RegExp.$1); + return 1; + } + + rege = /mode=take&what=(\w+)/; + if (rege.test(send)) { + // alert('Taking skill disk'); + return 1; + } + + rege = /mode=enterbattle/; + if (rege.test(send)) { + mode = 'battle'; + // alert('Entering battle'); + return 1; + } + rege = /mode=battle/; + if (rege.test(send)) { + mode = 'battle'; + // alert('Fighting'); + return 1; + } + mode = 'unknown' + return -1; +} + +function handleResponse(response) { + if (maincontrol) { + var rege; + room = document.getElementById("thisroom"); + + var roomname = document.evaluate('//div[@id="thisroom"]/b[1]',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML; + // alert(roomname); + + if (take_skills) { + rege = /There\sis\sa\sSKILL\sDISC/; + if (rege.test(room.innerHTML)) { + unsafeWindow.take('skill'); + return 1; + } + } + + if (autobattle) { + if (mode == 'battle') { + var btlog = document.evaluate('//td[@class="btlog"]',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML; + rege = /defeated/ + if (rege.test(btlog.toLowerCase())) { + mode = 'battledone'; + unsafeWindow.endbattle(); + setTimeout(function() { + handleResponse(response); }, 500+(Math.floor(Math.random()*800))); + return 1; + } else { + mode = 'battle'; + unsafeWindow.battle('ATTACK'); + return 1; + } + alert(btlog); + } else { + var playdata = document.getElementById('yourdata').innerHTML; + var playskills = document.getElementById('yourskills').innerHTML; + rege = /HP\s(\d+)\/(\d+)/ + rege.exec(playdata); + var needHeal = (RegExp.$1 <= (RegExp.$2 / 3)) + rege = /prayer/; + var hasPrayer = rege.test(playskills.toLowerCase()); + rege = /rest/; + var hasRest = rege.test(playskills.toLowerCase()); + + if (needHeal && hasPrayer) { + unsafeWindow.rest(true); + } else if (needHeal && hasRest) { + unsafeWindow.rest(false); + } else { + rege = /There\sare\sENEMIES\sroaming\sthe\sroom/; + if (rege.test(room.innerHTML)) { + var enemy = document.evaluate('//span[starts-with(@id,"enemyicon")]',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + var enemyid = enemy.getAttribute('id'); + rege = /enemyicon\d+(\w)/; + rege.exec(enemyid); + mode = 'battle'; + unsafeWindow.enterbattle(RegExp.$1); + return 1; + } + } + } + } + + if (travel && roomname != 'FINAL ROOM') { + if (document.getElementById('north') != null) { + unsafeWindow.go('north'); + return 1; + } + if (document.getElementById(lastDirection) != null) { + unsafeWindow.go(lastDirection); + return 1; + } + if (lastDirection == 'east') { + lastDirection = 'west'; + } else { + lastDirection = 'east'; + } + if (document.getElementById(lastDirection) != null) { + unsafeWindow.go(lastDirection); + return 1; + } + + } + } else { + return -1; + } + + return 1; +} + +//Setting up ajax capture +var OldXHR = unsafeWindow.XMLHttpRequest; +var NewXHR = function() { + var self = this; + var actualXHR = new OldXHR(); + + this.onopen = function(a,b,c,d,e) { + // alert('Open:\n'+a+'\n'+b+'\n'+c+'\n'+d+'\n'+e); + } + + this.onsend = function(a) { + if (handleSend(a) != 1) { +// alert('Send:\n'+a); + } + } + + this.ononreadystatechange = function() { + if (self.readyState == 4) { + setTimeout(function() { + if (handleResponse(self.responseText) != 1) { +// alert('onreadystatechange:\n'+self.responseText+'\n'+self.statusText+'\n'+self.responseXML); + } + }, 500+(Math.floor(Math.random()*800))); + } + } + this.requestHeaders = ""; + this.requestBody = ""; + + // emulate methods from regular XMLHttpRequest object + this.open = function(a, b, c, d, e) { + self.openMethod = a.toUpperCase(); + self.openURL = b; + if (self.onopen != null && typeof(self.onopen) == "function") { self.onopen(a,b,c,d,e); } + return actualXHR.open(a,b,c,d,e); + } + this.send = function(a) { + if (self.onsend != null && typeof(this.onsend) == "function") { self.onsend(a); } + self.requestBody += a; + return actualXHR.send(a); + } + this.setRequestHeader = function(a, b) { + if (self.onsetrequestheader != null && typeof(self.onsetrequestheader) == "function") { self.onsetrequestheader(a, b); } + self.requestHeaders += a + ":" + b + "\r\n"; + return actualXHR.setRequestHeader(a, b); + } + this.getRequestHeader = function() { + return actualXHR.getRequestHeader(); + } + this.getResponseHeader = function(a) { return actualXHR.getResponseHeader(a); } + this.getAllResponseHeaders = function() { return actualXHR.getAllResponseHeaders(); } + this.abort = function() { return actualXHR.abort(); } + this.addEventListener = function(a, b, c) { alert("not implemented yet"); } + this.dispatchEvent = function(e) { alert("not implemented yet"); } + this.openRequest = function(a, b, c, d, e) { alert("not implemented yet"); } + this.overrideMimeType = function(e) { alert("not implemented yet"); } + this.removeEventListener = function(a, b, c) { alert("not implemented yet"); } + + + // emulate callbacks from regular XMLHttpRequest object + actualXHR.onreadystatechange = function() { + + // copy properties back from the actual XHR to the wrapper + self.readyState = actualXHR.readyState; + try { + self.status = actualXHR.status; + } catch (e) {} + try { + self.responseText = actualXHR.responseText; + } catch (e) {} + try { + self.statusText = actualXHR.statusText; + } catch (e) {} + try { + self.responseXML = actualXHR.responseXML; + } catch (e) {} + + try { + if (self.ononreadystatechange != null && typeof(self.ononreadystatechange) == "function") { self.ononreadystatechange(); } + } catch (e) {} + + // onreadystatechange callback + if (self.onreadystatechange != null && typeof(self.onreadystatechange) == "function") { return self.onreadystatechange(); } + + } + actualXHR.onerror = function(e) { + if (self.onerror != null) { return self.onerror(e); } + } + actualXHR.onload = function(e) { + if (self.onload != null) { return self.onload(e); } + } + actualXHR.onprogress = function(e) { + if (self.onprogress != null) { return self.onprogress(e); } + } +} +unsafeWindow.XMLHttpRequest = NewXHR; + +// Control window contents +function refreshControlWindow() { + controlWindow.innerHTML = '
Dungeon Crawler

'; + // Loot skills + var controlWindow_skills = document.createElement('div'); + controlWindow_skills.setAttribute('id','controlWindow_skills'); + controlWindow_skills.setAttribute('style','text-align: center;'); + controlWindow_skills.innerHTML = 'Auto take skills: '; + + if (take_skills) { + controlWindow_skills.innerHTML += 'active'; + } else { + controlWindow_skills.innerHTML += 'inactive'; + } + controlWindow_skills.innerHTML += ''; + controlWindow_skills.addEventListener("click", function() { take_skills = !take_skills; refreshControlWindow();}, true); + + controlWindow.appendChild(controlWindow_skills); + // Fight + var controlWindow_battle = document.createElement('div'); + controlWindow_battle.setAttribute('id','controlWindow_battle'); + controlWindow_battle.setAttribute('style','text-align: center;'); + controlWindow_battle.innerHTML = 'Auto battle: '; + if (autobattle) { + controlWindow_battle.innerHTML += 'active'; + } else { + controlWindow_battle.innerHTML += 'inactive'; + } + controlWindow_battle.innerHTML += ''; + controlWindow_battle.addEventListener("click", function() { autobattle = !autobattle; refreshControlWindow();}, true); + controlWindow.appendChild(controlWindow_battle); + // Travel + var controlWindow_travel = document.createElement('div'); + controlWindow_travel.setAttribute('id','controlWindow_travel'); + controlWindow_travel.setAttribute('style','text-align: center;'); + controlWindow_travel.innerHTML = 'Auto travel: '; + if (travel) { + controlWindow_travel.innerHTML += 'active'; + } else { + controlWindow_travel.innerHTML += 'inactive'; + } + controlWindow_travel.innerHTML += ''; + controlWindow_travel.addEventListener("click", function() { travel = !travel; refreshControlWindow();}, true); + controlWindow.appendChild(controlWindow_travel); + // Activate and deactivate + var controlWindow_main = document.createElement('div'); + controlWindow_main.setAttribute('id','controlWindow_main'); + controlWindow_main.setAttribute('style','text-align: center;'); + controlWindow_main.innerHTML = '

Main control:
'; + if (maincontrol) { + controlWindow_main.innerHTML += 'active'; + } else { + controlWindow_main.innerHTML += 'inactive'; + } + controlWindow_main.innerHTML += '
'; + controlWindow_main.addEventListener("click", function() { maincontrol = !maincontrol; refreshControlWindow();}, true); + controlWindow.appendChild(controlWindow_main); +} diff --git a/VDex_Project_Battle_Tool.user.js b/VDex_Project_Battle_Tool.user.js new file mode 100755 index 0000000..2969505 --- /dev/null +++ b/VDex_Project_Battle_Tool.user.js @@ -0,0 +1,82 @@ +// ==UserScript== +// @name VDex Project Battle Tool +// @namespace http://www.enbewe.de/vdex/ +// @description Removes Confirmation Dialog +// @include http://vdexproject.net/battle.php?* +// @include http://vdexproject.net/talk.php?npc=registeel +// @version 0.1 +// ==/UserScript== + +unsafeWindow.chspoke = function(what,pid) { + var params = "mode=registeel&pid="+pid; + var target = "ajax9.php"; + var xmlhttp = unsafeWindow.createXmlhttp(); + xmlhttp.onreadystatechange = function () { + if ( xmlhttp.readyState == 1 ) { + unsafeWindow.npctalktext.innerHTML = "Please stand by.
\"Loading...\""; + unsafeWindow.playertalktext.className = "hidden"; + } + if ( xmlhttp.readyState == 4 ) { + unsafeWindow.hiddendiv.innerHTML = xmlhttp.responseText; + var anpc = document.getElementById("ajaxnpc"); + if ( anpc ) { + unsafeWindow.npctalktext.innerHTML = anpc.innerHTML; + unsafeWindow.playertalktext.innerHTML = playertalkback.innerHTML; + } + else { + alert (xmlhttp.responseText); + unsafeWindow.npctalktext.innerHTML = "That seems to have been unsuccessful."; + unsafeWindow.playertalktext.innerHTML = playertalkback.innerHTML; + } + playertalktext.className = ""; + } + } + unsafeWindow.sendRequest(xmlhttp, target, params); +} + +unsafeWindow.usemove = function(bid, move, mname) { + if ( unsafeWindow.midajax ) { return; } + var loaddiv = document.getElementById("loading"); + var maindiv = document.getElementById("stuff"); + var blog = document.getElementById("battlelog"); + var scr = blog.scrollTop; + var target = "bajax.php"; + var params = "mode=move&bid="+bid+"&move="+move; + unsafeWindow.midajax = true; + var xmlhttp = unsafeWindow.createXmlhttp(); + xmlhttp.onreadystatechange = function () { + if ( xmlhttp.readyState ==1 ) { + loaddiv.innerHTML = 'Loading...'; + } + if ( xmlhttp.readyState == 4 ) { + loaddiv.innerHTML = ""; + maindiv.innerHTML = xmlhttp.responseText; + var blog = document.getElementById("battlelog"); + blog.scrollTop = scr+1000; + unsafeWindow.midajax = false; + } + } + unsafeWindow.sendRequest(xmlhttp, target, params); +} + +unsafeWindow.cancel = function(bid) { + if ( unsafeWindow.midajax ) { return; } + var loaddiv = document.getElementById("loading"); + var maindiv = document.getElementById("stuff"); + var target = "bajax.php"; + var params = "mode=end&bid="+bid; + unsafeWindow.midajax = true; + var xmlhttp = unsafeWindow.createXmlhttp(); + xmlhttp.onreadystatechange = function () { + if ( xmlhttp.readyState ==1 ) { + loaddiv.innerHTML = 'Loading...'; + maindiv.innerHTML = ""; + } + if ( xmlhttp.readyState == 4 ) { + loaddiv.innerHTML = ""; + maindiv.innerHTML = xmlhttp.responseText; + unsafeWindow.midajax = false; + } + } + unsafeWindow.sendRequest(xmlhttp, target, params); +} \ No newline at end of file diff --git a/VDex_Project_Berry_Timer.user.js b/VDex_Project_Berry_Timer.user.js new file mode 100755 index 0000000..db2b706 --- /dev/null +++ b/VDex_Project_Berry_Timer.user.js @@ -0,0 +1,43 @@ +// ==UserScript== +// @name VDex Project Berry Timer +// @namespace Http://www.enbewe.de/vdex +// @description Shows timers for Berries +// @include http://vdexproject.net/berries.php* +// @version 1 +// ==/UserScript== + +var oldFunction = unsafeWindow.sendRequest; +unsafeWindow.sendRequest = function(xmlhttp, target, params) { + // alert('Captured\n'+xmlhttp+' '+target+' '+params); + var regex = /berryplant&berry=\w+&slot=(\w+)/ + if (regex.test(params)){ + regex.exec(params); + var slot = RegExp.$1; + // alert('Planting'+slot); + setTimeout(function() { + var dat = new Date().getTime(); + GM_setValue(slot, dat+''); + }, 0); + } + oldFunction(xmlhttp,target,params); +} + +var anchor = document.getElementById('berrymsg'); +var berryTimerDiv = document.createElement('div'); +berryTimerDiv.setAttribute('id','berryTimer'); +berryTimerDiv.setAttribute('style','text-align:center;'); +anchor.parentNode.insertBefore(berryTimerDiv,anchor); + +for (var i = 0; i < 4; i++) { + var timest = GM_getValue('slot'+i,''); + if (timest != '') { + timest = parseInt(timest); + var time = ((new Date().getTime() - timest)/1000)/60; + var text = Math.floor(time/60)+' Stunden und '+Math.floor(time%60)+' Minuten'; + berryTimerDiv.innerHTML += 'Slot '+(i+1)+': '+text+'
'; + } else { + berryTimerDiv.innerHTML += 'Slot '+(i+1)+': Nicht definiert
'; + } + +} + diff --git a/VDex_Project_Dungeon_Enemy_Indicator.user.js b/VDex_Project_Dungeon_Enemy_Indicator.user.js new file mode 100755 index 0000000..967432e --- /dev/null +++ b/VDex_Project_Dungeon_Enemy_Indicator.user.js @@ -0,0 +1,116 @@ +// ==UserScript== +// @name VDex Project Dungeon Enemy Indicator +// @namespace http://www.enbewe.de/vdex +// @description Indicates whether an enemy is killable or not +// @include http://vdexproject.net/dungeon.php?mode=navigate* +// @version 0.1 +// ==/UserScript== + +function handleResponse(response) { + var rege; + var room = document.getElementById("thisroom"); + + // Prepare user stats + var playdata = document.getElementById('yourdata').innerHTML; + rege = /HP.(\d+)/; + rege.exec(playdata); + var ownHP = parseInt(RegExp.$1); + rege = /ATTACK:.(\d+).\(.(\d+)\)/; + rege.exec(playdata); + var ownAtt = parseInt(RegExp.$1)+parseInt(RegExp.$2); + rege = /DEFENSE:\s(\d+)\s\(.(\d+)/; + rege.exec(playdata); + var ownDef = parseInt(RegExp.$1)+parseInt(RegExp.$2); + + // Test for enemies + rege = /There\sare\sENEMIES\sroaming\sthe\sroom/; + if (rege.test(room.innerHTML)) { + var snapResults = document.evaluate('//span[starts-with(@id,"enemyinfo")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = snapResults.snapshotLength - 1; i >= 0; i--) { + var elm = snapResults.snapshotItem(i); + + rege = /HP:.(\d+);.ATTACK:.(\d+);.DEFENSE:.(\d+)/; + rege.exec(elm.innerHTML); + var enemyHP = parseInt(RegExp.$1); + var enemyAtt = parseInt(RegExp.$2); + var enemyDef = parseInt(RegExp.$3); + + var ownDmg = ownAtt - enemyDef; + if (ownDmg < 1) { ownDmg = 1; } + + var enemyDmg = enemyAtt - ownDef; + if (enemyDmg < 1) { enemyDmg = 1; } + + if (ownDmg >= enemyHP) { + elm.innerHTML += 'One Hit Kill!
'; + } else if (enemyHP/ownDmg <= ownHP/enemyDmg) { + elm.innerHTML += 'You will win!
'; + } else { + elm.innerHTML += 'You will fail or need to heal!
'; + } + } + } +} + +//Setting up ajax capture +var OldXHR = unsafeWindow.XMLHttpRequest; +var NewXHR = function() { + var self = this; + var actualXHR = new OldXHR(); + + this.ononreadystatechange = function() { + if (self.readyState == 4) { + setTimeout(function() { + handleResponse(self.responseText) + },1); + } + } + this.requestHeaders = ""; + this.requestBody = ""; + + // emulate methods from regular XMLHttpRequest object + this.open = function(a, b, c, d, e) { + self.openMethod = a.toUpperCase(); + self.openURL = b; + if (self.onopen != null && typeof(self.onopen) == "function") { self.onopen(a,b,c,d,e); } + return actualXHR.open(a,b,c,d,e); + } + this.send = function(a) { + if (self.onsend != null && typeof(this.onsend) == "function") { self.onsend(a); } + self.requestBody += a; + return actualXHR.send(a); + } + this.setRequestHeader = function(a, b) { + if (self.onsetrequestheader != null && typeof(self.onsetrequestheader) == "function") { self.onsetrequestheader(a, b); } + self.requestHeaders += a + ":" + b + "\r\n"; + return actualXHR.setRequestHeader(a, b); + } + this.getRequestHeader = function() { return actualXHR.getRequestHeader(); } + this.getResponseHeader = function(a) { return actualXHR.getResponseHeader(a); } + this.getAllResponseHeaders = function() { return actualXHR.getAllResponseHeaders(); } + this.abort = function() { return actualXHR.abort(); } + this.addEventListener = function(a, b, c) { alert("not implemented yet"); } + this.dispatchEvent = function(e) { alert("not implemented yet"); } + this.openRequest = function(a, b, c, d, e) { alert("not implemented yet"); } + this.overrideMimeType = function(e) { alert("not implemented yet"); } + this.removeEventListener = function(a, b, c) { alert("not implemented yet"); } + + + // emulate callbacks from regular XMLHttpRequest object + actualXHR.onreadystatechange = function() { + + // copy properties back from the actual XHR to the wrapper + self.readyState = actualXHR.readyState; + try { self.status = actualXHR.status; } catch (e) {} + try { self.responseText = actualXHR.responseText; } catch (e) {} + try { self.statusText = actualXHR.statusText; } catch (e) {} + try { self.responseXML = actualXHR.responseXML; } catch (e) {} + try { if (self.ononreadystatechange != null && typeof(self.ononreadystatechange) == "function") { self.ononreadystatechange(); } } catch (e) {} + + if (self.onreadystatechange != null && typeof(self.onreadystatechange) == "function") { return self.onreadystatechange(); } + } + actualXHR.onerror = function(e) { if (self.onerror != null) { return self.onerror(e); } } + actualXHR.onload = function(e) { if (self.onload != null) { return self.onload(e); } } + actualXHR.onprogress = function(e) { if (self.onprogress != null) { return self.onprogress(e); } } +} +unsafeWindow.XMLHttpRequest = NewXHR; diff --git a/VDex_Project_Mark_all_pokemon_as_private.user.js b/VDex_Project_Mark_all_pokemon_as_private.user.js new file mode 100755 index 0000000..3b6ce8e --- /dev/null +++ b/VDex_Project_Mark_all_pokemon_as_private.user.js @@ -0,0 +1,45 @@ +// ==UserScript== +// @name VDex Project Mark all pokemon as private +// @namespace http://www.enbewe.de/vdex/ +// @include http://vdexproject.net/pc.php?&mode=sort +// @version 1 +// ==/UserScript== + +// Add private link +snapResults = document.evaluate('//table[@class="content"]//table[@class="pcnav"]//div[@class="pc"]/small', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); +for (var i = snapResults.snapshotLength - 1; i >= 0; i--) { + var elm = snapResults.snapshotItem(i); + var boxid = elm.parentNode.getAttribute('id'); + var rege = /pc(\d+)/; + rege.exec(boxid); + boxid = RegExp.$1; + elm.innerHTML += '
[ Mark Public ]'; + document.getElementById('bswitch'+boxid).addEventListener("click",markPublic, true); +} + +function markPublic() { + var active = document.evaluate('//table[@class="pcnav"]//div[@class="pc"][not(@style="display: none;")]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + var boxid = active.getAttribute('id'); + var rege = /pc(\d+)/; + rege.exec(boxid); + boxid = RegExp.$1; + + for (var i = 1; i<=42; i++) { + var text = document.evaluate('//td[@id="box'+boxid+'slot'+i+'"]/img', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.getAttribute('onmouseover'); + if (text) { + rege = /(\d+)/; + rege.exec(text); + text = "mode=public&pid="+RegExp.$1; + var xmlhttp = new XMLHttpRequest(); + + xmlhttp.open("POST", "kadabra/files/ajax/private.php", false); + + xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xmlhttp.setRequestHeader("Content-length", text.length); + xmlhttp.setRequestHeader("Connection", "close"); + + xmlhttp.send (text); + } + } +} + diff --git a/VDex_Project_Pokemon_Tracker.user.js b/VDex_Project_Pokemon_Tracker.user.js new file mode 100755 index 0000000..9b7e950 --- /dev/null +++ b/VDex_Project_Pokemon_Tracker.user.js @@ -0,0 +1,213 @@ +// ==UserScript== +// @name VDex Project Pokemon Tracker +// @namespace http://www.enbewe.de/vdex/ +// @description Lets you track pokemon +// @include http://vdexproject.net/poke.php* +// @include http://vdexproject.net/pokegear.php* +// @copyright eNBeWe +// @version 0.3 +// ==/UserScript== +(function (){ + var page = window.location.pathname + if (page == "/pokegear.php" || page == "/pokegear.php#info") { + + // Fetch anchor + var anchor = document.evaluate('//table[@class="content"]/tbody',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + + // Create and place row for tracking plugin + var elmContentRow = document.createElement('tr'); + anchor.appendChild(elmContentRow); + + // Create and place cell with heading + var elmContentCell = document.createElement('td'); + elmContentRow.appendChild(elmContentCell); + elmContentCell.setAttribute("id","trackingHeader"); + elmContentCell.setAttribute("style","vertical-align: top;"); + elmContentCell.setAttribute("colspan","2"); + elmContentCell.innerHTML = 'Tracked Pokemon:
'; + + // Place link to load the tracked pokemon + var loadTrackedLink = document.createElement('small'); + loadTrackedLink.setAttribute("id","trackerLinkSmall"); + loadTrackedLink.innerHTML = '[ Load tracked Pokemon ]'; + loadTrackedLink.addEventListener("click", function(){loadTracked();}, true); + elmContentCell.appendChild(loadTrackedLink); + } else if (page == "/poke.php") { + + // Get PokeID of active pokemon + var pokeID = getUrlParam('id'); + + // Fetch anchor + var anchor = document.getElementById('infopoke'); + + // Create and place link to toggle tracking + var elmTrackerLink = document.createElement('small'); + elmTrackerLink.innerHTML = '[ Toggle pokemon tracking ]'; + elmTrackerLink.addEventListener("click", function(){toggleTracking(pokeID);}, true); + anchor.parentNode.insertBefore(elmTrackerLink, anchor.nextSibling); + } + + // Load trcked pokemon + function loadTracked() { + + // Fetch anchor + var trackedLink = document.getElementById('trackerLinkSmall'); + var anchor = trackedLink.parentNode; + + // Remove Link + anchor.removeChild(trackedLink); + + // Get list of tracked pokemon + var pokelist = GM_getValue('track',''); + if (pokelist == '' || pokelist == ' '){ + // List is empty -> display message + var trackerMsg = document.createElement('small'); + trackerMsg.innerHTML = 'No pokemon are being tracked'; + anchor.appendChild(trackerMsg); + } else { + // Convert List to Array + var Pokemon = pokelist.split(' '); + + // Prepare table + var trackedTable = document.createElement('table'); + trackedTable.setAttribute('id','trackingTable'); + anchor.appendChild(trackedTable); + + // Load data for tracked pokemon + for (var i = 0; i < Pokemon.length; i++) { + GM_xmlhttpRequest({ + method: "GET", + url: "http://vdexproject.net/poke.php?&id="+Pokemon[i], + onload: function(response){ + addPokemonToView(response); + } + }); + } + } + + } + + // Helper function to add a loaded Pokemon to the view + function addPokemonToView(response) { + // Fetch anchor + var anchor = document.getElementById('trackingTable'); + + var textToInsert; + var activeRow; + + // Fetch pokemon id + var regex = /id=(\d*)/; + regex.exec(response.finalUrl); + var pokeid = RegExp.$1; + + if (response.responseText.search(/does\snot\shave\san\sowner\scurrently/) == -1) { + // Pokemon has owner + + // Parse response + var parser = new DOMParser(); + var data = parser.parseFromString(response.responseText, "text/html"); + + // Store data for cell entry + var celldata = data.evaluate('//table[@id="infopoke"]/tbody/tr[1]',data, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + textToInsert = ''+celldata.innerHTML+'
( more info )
'; + } else { + textToInsert = '
Pokemon has currently no owner!
'; + } + + // Get number of existing cells + var existingCellsCount = document.evaluate('//table[@id="trackingTable"]/tr/td', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength; + + // Determine side where to add the new cell + if (existingCellsCount % 2 == 1) { + activeRow = document.evaluate('//table[@id="trackingTable"]/tr[last()]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + } else { + activeRow = document.createElement('tr'); + anchor.appendChild(activeRow); + } + + // Create new cell + var elmNewCell = document.createElement('td'); + elmNewCell.setAttribute('style','padding: 20px; border: 2px solid grey;'); + elmNewCell.innerHTML = textToInsert; + + // Add removal link + var elmRemovalLink = document.createElement('small'); + elmRemovalLink.innerHTML = '[ Toggle pokemon tracking ]'; + elmRemovalLink.addEventListener("click", function(){toggleTracking(pokeid);}, true); + var elmRemovalDiv = document.createElement('div'); + elmRemovalDiv.setAttribute('style','text-align: center;'); + elmRemovalDiv.appendChild(elmRemovalLink); + elmNewCell.appendChild(elmRemovalDiv); + activeRow.appendChild(elmNewCell); + } + + // Helper function to toggle tracking of pokemon + function toggleTracking(pokemonID) { + + // Get list of tracked pokemon + var getter = GM_getValue('track',''); + + // If the list is empty set active pokemon as tracked + if (getter == '' || getter == ' ') { + GM_setValue('track', pokemonID); + alert('Tracking this pokemon'); + return + } + + // Parse list + var Pokemon = getter.split(' '); + + // Check if pokemon is already tracked + if (contains(Pokemon, pokemonID)) { + // Remove pokemon from array + var Pokemon_neu = new Array(); + for (var i = 0; i < Pokemon.length; i++) { + if (Pokemon[i] == pokemonID) Pokemon[i] = ''; + } + + // Strip double spaces + var trackString = Pokemon.join(' '); + trackString = trackString.replace(/\s\s/g,' '); + trackString = trackString.replace(/^\s/,''); + trackString = trackString.replace(/\s$/,''); + + // Save new list + GM_setValue('track', trackString); + alert('Removed pokemon from tracking'); + } else { + // Add pokemon to list + Pokemon.push(pokemonID); + var trackString = Pokemon.join(' '); + trackString = trackString.replace(/\s\s/g,' '); + trackString = trackString.replace(/^\s/,''); + trackString = trackString.replace(/\s$/,''); + + // Save new list + GM_setValue('track', trackString); + alert('Tracking this pokemon'); + } + } + + // Helper function to check if an array contains a given element + function contains(a, obj) { + for (var i = 0; i < a.length; i++) { + if (a[i] === obj) { + return true; + } + } + return false; + } + + // Helper function to parse url parameters + function getUrlParam(name) { + name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp(regexS); + var results = regex.exec(window.location.href); + if ( results == null ) { + return ""; + } else { + return results[1]; + } + } +})(); \ No newline at end of file diff --git a/VDex_Project_Refresh_Counter.user.js b/VDex_Project_Refresh_Counter.user.js new file mode 100755 index 0000000..3694e0b --- /dev/null +++ b/VDex_Project_Refresh_Counter.user.js @@ -0,0 +1,56 @@ +// ==UserScript== +// @name VDex Project Refresh Counter +// @namespace http://www.enbewe.de/vdex +// @include http://vdexproject.net/map.php* +// @version 0.1 +// ==/UserScript== + +var cnt = GM_getValue('refreshCnt',0); + +var displayDiv = document.createElement('div'); +displayDiv.setAttribute('id','displayDiv'); +displayDiv.setAttribute('style','width:140px; height:50px; position: fixed; bottom: 10px; right: 10px; background: #232323; border: 3px solid grey; padding: 10px; text-align:center;'); +document.getElementById('login').parentNode.appendChild(displayDiv); +refreshDisplay(); + + +//Setting up refresh capture +var oldRefresh = unsafeWindow.refresh; +var newRefresh = function() { + cnt++; + setTimeout(function() {GM_setValue('refreshCnt',cnt);}, 1); + refreshDisplay(); + oldRefresh(); +} +unsafeWindow.refresh = newRefresh; + +var oldFishRefresh = unsafeWindow.fishrefresh; +var newFishRefresh = function(item) { + cnt++; + setTimeout(function() {GM_setValue('refreshCnt',cnt);}, 1); + refreshDisplay(); + oldFishRefresh(item); +} +unsafeWindow.fishrefresh = newFishRefresh; + + + + + +function refreshDisplay() { + displayDiv.innerHTML = 'Refresh Counter:
'; + displayDiv.innerHTML += cnt; + displayDiv.innerHTML += '
'; + var resetSpan = document.createElement('a'); + resetSpan.setAttribute('class','hlclickable'); + resetSpan.innerHTML = '(Reset Counter)'; + displayDiv.appendChild(resetSpan); + resetSpan.addEventListener("click", resetCounter, true); +} + + +function resetCounter() { + cnt = 0; + setTimeout(function() {GM_setValue('refreshCnt',cnt);}, 1); + refreshDisplay(); +} \ No newline at end of file diff --git a/VDex_Project_Search_for_Pokemon.user.js b/VDex_Project_Search_for_Pokemon.user.js new file mode 100755 index 0000000..9034fcc --- /dev/null +++ b/VDex_Project_Search_for_Pokemon.user.js @@ -0,0 +1,23 @@ +// ==UserScript== +// @name VDex Project Search for Pokemon +// @namespace http://www.enbewe.de/vdex +// @description Lets you search a Pokemon from its Pokedex page +// @include http://vdexproject.net/pokedex.php?n=* +// @version 0.3 +// ==/UserScript== + + +var form = document.evaluate('//form[@action="mapdex.php"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; +var btn = document.evaluate('//form[@action="mapdex.php"]/input[@type="submit"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; +if (form) { + form.removeChild(btn); + var submitLink = document.createElement('a'); + submitLink.setAttribute('class','hlclickable'); + submitLink.innerHTML = 'Search this Pokemon in Mapdex'; + submitLink.addEventListener("click",function(){form.submit();}, true); + form.appendChild(submitLink); + + var spriteBtn = document.evaluate('//a/input[@class="btn"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.parentNode; + spriteBtn.innerHTML = 'View Sprite Gallery' + +} diff --git a/VDex_Project_Timezone_Changer.user.js b/VDex_Project_Timezone_Changer.user.js new file mode 100755 index 0000000..6bcd295 --- /dev/null +++ b/VDex_Project_Timezone_Changer.user.js @@ -0,0 +1,74 @@ +// ==UserScript== +// @name VDex Project Timezone Changer +// @namespace Http://www.enbewe.de/vdex +// @description Lets you change your timezone from the map +// @include http://vdexproject.net/map.php* +// @version 0.3 +// ==/UserScript== + + + +var anchor = document.evaluate('//div[@id="footer"]/span',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + +var timezoneDiv = document.createElement('div'); +timezoneDiv.setAttribute('id','timezoneDiv'); +timezoneDiv.innerHTML = 'Zeit: '; +anchor.parentNode.insertBefore(timezoneDiv,anchor); + + +var timezoneLinkm1 = document.createElement('a'); +timezoneLinkm1.setAttribute('class','clickable'); +timezoneLinkm1.innerHTML = '(-1)'; +timezoneLinkm1.addEventListener("click",function(){changeTimezone(-1)}, true); +timezoneDiv.appendChild(timezoneLinkm1); + + +var timezoneLink1 = document.createElement('a'); +timezoneLink1.setAttribute('class','clickable'); +timezoneLink1.innerHTML = '(+1)'; +timezoneLink1.addEventListener("click",function(){changeTimezone(1)}, true); +timezoneDiv.appendChild(timezoneLink1); + + +function changeTimezone(amount) { + + var xmlhttp = new XMLHttpRequest(); + xmlhttp.open("GET","/forum/ucp.php?i=165",false); + xmlhttp.send(); + + var parser = new DOMParser(); + var data = parser.parseFromString(xmlhttp.responseText, "text/html"); + + var params = ''; + + var snapResults = data.evaluate("//form//input", data, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = snapResults.snapshotLength - 1; i >= 0; i--) { + var elm = snapResults.snapshotItem(i); + if (elm.getAttribute('type') != 'reset' && (elm.getAttribute('type') != 'radio' || elm.getAttribute('checked') == 'checked')) { + params += elm.getAttribute('name')+'='+elm.getAttribute('value')+'&'; + } + } + + var snapResult = data.evaluate('//form//select[@id="tz"]/option[@selected="selected"]', data, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + var timezone = parseInt(snapResult.getAttribute('value')); + + params += 'tz='+(timezone+amount); + + var url = "/forum/ucp.php?i=prefs&mode=personal"; + + var http = new XMLHttpRequest(); + http.open("POST", url, false); + + //Send the proper header information along with the request + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.setRequestHeader("Content-length", params.length); + http.setRequestHeader("Connection", "close"); + + http.send(params); + + if (http.responseText.search(/preferences\shave\sbeen\supdated/)) { + window.location.reload(); + } else { + alert('Fail:\n'+http.responseText); + } +} \ No newline at end of file