Greasemonkey/VDex_Project_Ajax_Cature.user.js

303 lines
10 KiB
JavaScript
Raw Normal View History

2014-01-05 19:14:05 +01:00
// ==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 = '<div style="text-align: center;"><b>Dungeon Crawler</b><br /><br />';
// Loot skills
var controlWindow_skills = document.createElement('div');
controlWindow_skills.setAttribute('id','controlWindow_skills');
controlWindow_skills.setAttribute('style','text-align: center;');
controlWindow_skills.innerHTML = '<a>Auto take skills: ';
if (take_skills) {
controlWindow_skills.innerHTML += '<span style="color: #008000;">active</span>';
} else {
controlWindow_skills.innerHTML += '<span style="color: #BF0000;">inactive</span>';
}
controlWindow_skills.innerHTML += '</a>';
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 = '<a>Auto battle: ';
if (autobattle) {
controlWindow_battle.innerHTML += '<span style="color: #008000;">active</span>';
} else {
controlWindow_battle.innerHTML += '<span style="color: #BF0000;">inactive</span>';
}
controlWindow_battle.innerHTML += '</a>';
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 = '<a>Auto travel: ';
if (travel) {
controlWindow_travel.innerHTML += '<span style="color: #008000;">active</span>';
} else {
controlWindow_travel.innerHTML += '<span style="color: #BF0000;">inactive</span>';
}
controlWindow_travel.innerHTML += '</a>';
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 = '<br /><br /><a>Main control:<br />';
if (maincontrol) {
controlWindow_main.innerHTML += '<span style="color: #008000;">active</span>';
} else {
controlWindow_main.innerHTML += '<span style="color: #BF0000;">inactive</span>';
}
controlWindow_main.innerHTML += '</a>';
controlWindow_main.addEventListener("click", function() { maincontrol = !maincontrol; refreshControlWindow();}, true);
controlWindow.appendChild(controlWindow_main);
}