BvS Hacker Helper

BvS r00t Hacking Helper 1.3.5

目前為 2014-09-10 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name BvS Hacker Helper
  3. // @namespace rvHack
  4. // @description BvS r00t Hacking Helper 1.3.5
  5. // @include http://*animecubed.com/billy/bvs/villagefields.html
  6. // @version 1.3.5
  7. // @history 1.3.5 (9/9/2014) Added grant permissions.
  8. // @history 1.3.4 (1/15/2013) Made Firefox 17 compatible by removing CDATA.
  9. // @history 1.3.3 (3/12/2011) Made Firefox 4 compatible.
  10. // @history 1.3.2 (1/1/2010) Fixed some bad code I put in in 1.3.1.
  11. // @history 1.3.1 (12/31/2009) fixed an error because of new changes McM made to the display when you hacked someone
  12. // @history 1.3 script now remembers your hacked targets and when you hack them, and displays counts for past 24 hr hacks and past 48 hrs
  13. // @history 1.2 fixed error with field changing when one key is "Dealer's Room" because of the single quote.
  14. // @history 1.2 add a link text change when you click "Retry" so the user knows when the server responds.
  15. // @history 1.2 changed execution address from '*.animecubed' to '*animecubed' as requested.
  16. // @grant GM_getValue
  17. // @grant GM_setValue
  18. // @grant GM_xmlhttpRequest
  19. // ==/UserScript==
  20.  
  21. var helperBoxStyle = "background-color: black; color: white; border: #A1A100 2px solid;";
  22.  
  23. /////////////////////////////////////////////////////////////////
  24. // Functions
  25. /////////////////////////////////////////////////////////////////
  26.  
  27. var scripts = 'function switchHuntAndHack() {\n' +
  28. ' return switchTargetField("Cursed,Filthy,Noodle Shop", "hackfieldswitch");\n' +
  29. '}\n' +
  30. '\n' +
  31. 'function switchTargetField(target, confirm) {\n' +
  32. ' if ((target == null) || (target == ""))\n' +
  33. ' return false;\n' +
  34. '\n' +
  35. ' try {\n' +
  36. ' if (document.getElementById(confirm).checked) {\n' +
  37. ' var field = target.split(",");\n' +
  38. '\n' +
  39. ' switchField(field[0], field[1], field[2]);\n' +
  40. ' } else {\n' +
  41. ' alert("Please check the confirm box!");\n' +
  42. ' }\n' +
  43. ' } catch(e) {\n' +
  44. ' alert("Exception!\\n\\nError name: " + e.name + "\\nError message: " + e.message);\n' +
  45. ' }\n' +
  46. '\n' +
  47. ' return false;\n' +
  48. '}\n' +
  49. '\n' +
  50. 'function switchField(key1, key2, key3) {\n' +
  51. ' try {\n' +
  52. ' switchFieldKey(document.field.key_1, unescape(key1));\n' +
  53. ' switchFieldKey(document.field.key_2, unescape(key2));\n' +
  54. ' switchFieldKey(document.field.key_3, unescape(key3));\n' +
  55. '\n' +
  56. ' document.field.submit();\n' +
  57. ' } catch(e) {\n' +
  58. ' if (e == "KeyError")\n' +
  59. ' alert("Failed to switch to the desired Field. You may not have the keys necessary to travel there.");\n' +
  60. ' else\n' +
  61. ' throw(e);\n' +
  62. ' }\n' +
  63. '}\n' +
  64. '\n' +
  65. 'function switchFieldKey(keyfield, keyvalue) {\n' +
  66. ' for (var i = 0; i < keyfield.length; i++) {\n' +
  67. ' if (keyfield[i].text == keyvalue)\n' +
  68. ' break;\n' +
  69. ' }\n' +
  70. '\n' +
  71. ' if (i == keyfield.length)\n' +
  72. ' throw("KeyError");\n' +
  73. '\n' +
  74. ' keyfield.selectedIndex = i;\n' +
  75. '}\n';
  76.  
  77. String.prototype.startsWith = function(str) { return (this.match("^"+str) == str); }
  78. String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); }
  79.  
  80.  
  81. function getCurrentTarget() {
  82. var target = GM_getValue("currentTarget_" + playerName, "");
  83.  
  84. if (target != "") {
  85. var info = target.split(";");
  86. if (info[0] == "")
  87. info[0] = "[<i>Unknown Hacker</i>]";
  88.  
  89. return info;
  90. }
  91.  
  92. return new Array("", "");
  93. }
  94.  
  95. function getHackTargets() {
  96. var rtrn = GM_getValue("oldTargets_" + playerName, "").split(",");
  97. var removed = false;
  98.  
  99. while (rtrn.length > 0) {
  100. if (currentTime >= (parseInt(rtrn[1]) || 0) + 172800) { //2 days
  101. rtrn.splice(0, 2);
  102. remove = true;
  103. } else
  104. break;
  105. }
  106.  
  107. if (removed) {
  108. GM_setValue("oldTargets_" + playerName, rtrn.join(","))
  109. }
  110.  
  111. return rtrn;
  112. }
  113.  
  114. function saveHackTargets(targets) {
  115. GM_setValue("oldTargets_" + playerName, targets.join(","))
  116. }
  117.  
  118. function addHackedTarget(targetName) {
  119. var targets = getHackTargets();
  120.  
  121. targets.push(targetName);
  122. targets.push(currentTime);
  123.  
  124. saveHackTargets(targets);
  125. }
  126.  
  127. function countHacks24Hours(targets) {
  128. var count = 0;
  129.  
  130. for (var i = 0; i < targets.length; i += 2) {
  131. if (currentTime < (parseInt(targets[i+1]) || 0) + 86400) { //1 day
  132. count++;
  133. }
  134. }
  135.  
  136. return count;
  137. }
  138.  
  139. function getTimeAgo(time) {
  140. var diff = currentTime - time;
  141. var rtrn = "";
  142.  
  143. if (diff >= 3600) {
  144. rtrn += Math.round(diff / 3600) + " hrs ";
  145. diff %= 3600;
  146. }
  147.  
  148. rtrn += Math.round(diff / 60) + " mins";
  149.  
  150. return rtrn;
  151. }
  152.  
  153. function QueryServer_FindPlayer(player) {
  154. if ((player == null) || (player == undefined)) {
  155. player = getCurrentTarget()[0];
  156.  
  157. if (player.indexOf("<i>") != -1)
  158. return;
  159. }
  160.  
  161. QueryServer("action=find&player=" + player);
  162. }
  163.  
  164. function QueryServer(query) {
  165. GM_xmlhttpRequest({
  166. method: 'POST',
  167. url: 'http://rveach.romhack.org/BvS/hackhelper.php',
  168. headers: {'Content-type' : 'application/x-www-form-urlencoded'},
  169. data: encodeURI(query),
  170.  
  171. onerror: function(response) {
  172. alert("Hack Download Failed!");
  173. },
  174. onload: function(response) {
  175. try {
  176. var text = response.responseText;
  177.  
  178. if (text.startsWith("Saved;")) {
  179. //saved hack info
  180. } else if (text.startsWith("Info;")) {
  181. GM_setValue("currentTarget_" + playerName, text.substr(5));
  182.  
  183. updateHackDisplay();
  184. } else if ((text == null) || (text.length == 0)) {
  185. alert("Hack Download Error:\n\nUnknown Error");
  186. } else if (text.length >= 200) {
  187. alert("Hack Download Error:\n\nError Message too big to display!");
  188. } else {
  189. alert("Hack Download Error:\n\n" + text);
  190. }
  191. } catch(e) {
  192. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  193. }
  194. }
  195. });
  196. }
  197.  
  198. function updateHackDisplay(info) {
  199. if ((info == null) || (info == undefined))
  200. info = getCurrentTarget();
  201.  
  202. if (info[0] == "")
  203. return;
  204. if ((info[1] == null) || (info[1] == undefined))
  205. info[1] = "";
  206.  
  207. var helper;
  208. var insert;
  209.  
  210. var snap = document.evaluate("//table/tbody/tr/td/form/a", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  211. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  212. if (match = temp.textContent.match(/.*Remove Target \(.* Core\).*/)) {
  213. if (helper = document.getElementById("minihackdisplay")) {
  214. insert = false;
  215. } else {
  216. insert = true;
  217. helper = document.createElement("div");
  218.  
  219. helper.setAttribute("id", "minihackdisplay");
  220. helper.setAttribute("style", helperBoxStyle + "margin-top: 5px; font-size: 12px;");
  221. }
  222. var helperText = "";
  223.  
  224. helperText += ("<b>" + info[0] + "</b><br>\n");
  225.  
  226. if (info[1] == "") { //no location saved
  227. helperText += "<i>Location Unknown</i>";
  228. } else {
  229. helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
  230. helperText += ("\n<br><input style='margin-bottom: 7px;' type='checkbox' id='targetfieldswitch2' value='1'> <a href='javascript:;' onclick='return switchTargetField(\"" + escape(info[1]) + "," + escape(info[2]) + "," + escape(info[3]) + "\", \"targetfieldswitch2\")' style='color: white;'>Switch to Field!</a>");
  231. }
  232.  
  233. helperText += "<br>\n<a href='javascript:;' id='hackretry2' style='color: white;'>Retry</a>";
  234.  
  235. helper.innerHTML = helperText;
  236.  
  237. if (insert)
  238. temp.parentNode.insertBefore(helper, temp.nextSibling);
  239.  
  240. document.getElementById("hackretry2").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
  241. break;
  242. }
  243. }
  244.  
  245. if (helper = document.getElementById("hackdisplay")) {
  246. helperText = ("<br>Current Target: <b>" + info[0] + "</b> [<a href='javascript:;' id='hackretry1' style='color: white;'>Retry</a>]<br>(");
  247. if (info[1] == "") { //no location saved
  248. helperText += "<i>Location Unknown</i>";
  249. } else {
  250. helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
  251. }
  252.  
  253. helperText += ")\n";
  254.  
  255. if (info[1] != "") {
  256. helperText += "<br><input type='checkbox' id='targetfieldswitch1' value='1'> <a href='javascript:;' onclick='return switchTargetField(\"" + escape(info[1]) + "," + escape(info[2]) + "," + escape(info[3]) + "\", \"targetfieldswitch1\")' style='color: white;'>Switch to Target's Last Known Field!</a><br>\n";
  257. }
  258.  
  259. helper.innerHTML = helperText;
  260.  
  261. document.getElementById("hackretry1").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
  262. }
  263. }
  264.  
  265. /////////////////////////////////////////////////////////////////
  266.  
  267. try {
  268. var match;
  269. var currentTime = Math.round(new Date().getTime()/1000.0);
  270.  
  271. /////////////////////////////////////////////////////////////////
  272. // Get Form Fields
  273. /////////////////////////////////////////////////////////////////
  274. var fieldForm = document.getElementsByName("field")[0];
  275. var playerName = document.getElementsByName("player")[0].value;
  276. var key_1;
  277. var key_2;
  278. var key_3;
  279. var element;
  280.  
  281. for (var i = 0; element = fieldForm.elements[i]; i++) {
  282. if (element.name == "key_1")
  283. key_1 = element;
  284. else if (element.name == "key_2")
  285. key_2 = element;
  286. else if (element.name == "key_3")
  287. key_3 = element;
  288. }
  289.  
  290. /////////////////////////////////////////////////////////////////
  291. // Insert JS Functions
  292. /////////////////////////////////////////////////////////////////
  293. var head = document.getElementsByTagName("head")[0];
  294. var node = document.createElement("script");
  295. node.type = "text/javascript";
  296. node.innerHTML = scripts;
  297. head.appendChild(node);
  298.  
  299. /////////////////////////////////////////////////////////////////
  300. // Create Helper
  301. /////////////////////////////////////////////////////////////////
  302. var helper = document.createElement("div");
  303. var helperText = "<center><h3 style='display: inline'>Hacker Helper</h3></center>\n";
  304. helper.setAttribute("style", helperBoxStyle);
  305. fieldForm.parentNode.insertBefore(helper, fieldForm.nextSibling);
  306.  
  307. /////////////////////////////////////////////////////////////////
  308. // Get Player List
  309. /////////////////////////////////////////////////////////////////
  310. var playerlist = "";
  311. var playertemp;
  312. var snap = document.evaluate("//table/tbody/tr/td/i", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  313. for (var i = 0; playertemp = snap.snapshotItem(i); i++) {
  314. if (match = playertemp.textContent.replace(/[\n\r\t]/g, " ").match(/.*Other Ninja on this Field:\s*(.*)/)) {
  315. playerlist = match[1].replace(/ /g, " ").replace(/, /g, ",");
  316. break;
  317. }
  318. }
  319.  
  320. /////////////////////////////////////////////////////////////////
  321. // Get New Target, Hacked Target, or Target Dropped (can't be both)
  322. /////////////////////////////////////////////////////////////////
  323. snap = document.evaluate("//table/tbody/tr/td/b", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  324. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  325. temp2 = temp.textContent.replace(/[\n\r\t]/g, " ");
  326. if (match = temp2.match(/.*Target Found:\s*(.*)/)) { //got new target
  327. GM_setValue("currentTarget_" + playerName, "");
  328. QueryServer_FindPlayer(match[1].replace(/ /g, " ").trim());
  329. break;
  330. } else if (match = temp2.match(/.*Hack Successful!.*/)) { //hacked target
  331. var info = getCurrentTarget();
  332.  
  333. if (info[0] != "")
  334. addHackedTarget(info[0]);
  335.  
  336. GM_setValue("currentTarget_" + playerName, "");
  337. break;
  338. } else if (match = temp2.match(/.*Get a Target.*/)) { //dropped hack
  339. GM_setValue("currentTarget_" + playerName, "");
  340. break;
  341. }
  342. }
  343.  
  344. /////////////////////////////////////////////////////////////////
  345. // Get Keys
  346. /////////////////////////////////////////////////////////////////
  347. var key1 = key_1[key_1.selectedIndex].text;
  348. var key2 = key_2[key_2.selectedIndex].text;
  349. var key3 = key_3[key_3.selectedIndex].text;
  350. var keyString = key1 + "," + key2 + "," + key3;
  351.  
  352. /////////////////////////////////////////////////////////////////
  353. // Logic
  354. /////////////////////////////////////////////////////////////////
  355. if (playerlist != "") {
  356. QueryServer("action=save&field=" + keyString + "&playerlist=" + playerlist);
  357.  
  358. var info = getCurrentTarget();
  359.  
  360. if (info[0] != "")
  361. playertemp.innerHTML = playertemp.innerHTML.replace(info[0], "<h3><u>" + info[0] + "</u></h3>");
  362. }
  363.  
  364. helperText += "<div id='hackdisplay'></div>";
  365. helperText += "<br><input type='checkbox' id='hackfieldswitch' value='1'> <a href='javascript:;' onclick='return switchHuntAndHack()' style='color: white;'>Switch to 'Hunt and Hack' Field!</a>\n";
  366.  
  367. var targets = getHackTargets();
  368. if (targets.length > 0) {
  369. helperText += "<br><br><b>" + countHacks24Hours(targets) + "</b> successful hacks in the past 24 hours.";
  370. helperText += "<br><b>" + (targets.length / 2) + "</b> in the past 48 hours.";
  371.  
  372. helperText += "<br><font size='1'>";
  373.  
  374. for (var i = 0; i < targets.length; i += 2) {
  375. if (i)
  376. helperText += ", ";
  377.  
  378. helperText += "<i><b>" + targets[i] + "</b></i> (" + getTimeAgo(targets[i+1]) + " ago)";
  379. }
  380.  
  381. helperText += "</font>";
  382. }
  383.  
  384. helper.innerHTML = helperText;
  385.  
  386. updateHackDisplay();
  387. } catch(e) {
  388. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  389. }