Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.86 KB | None | 0 0
  1. // ==UserScript==
  2. // @name JuniorBots Client
  3. // @namespace Work NOT ENDED
  4. // @version 1.4
  5. // @description Bots for: agar.red | 3rb.io | agarix.esy.es | agariocity
  6. // @author iSlot | MrJunior
  7. // @match http://soapplus.tk/?ip=192.95.15.93:4437
  8. // @match http://mgar.io/?ip=164.132.200.92:2017
  9. // @match http://mgar.io/mgar/?ip=213.32.6.56:443
  10. // @match http://mgar.io/mgar/?ip=213.32.6.56:444
  11. // @match http://mgar.io/mgar/?ip=213.32.6.56:446
  12. // @match http://mgar.io/mgar/?ip=213.32.6.56:447
  13. // @match http://mgar.io/mgar/?ip=213.32.6.56:448
  14. // @match http://mgar.io/mgar/?ip=213.32.6.56:449
  15. // @match http://mgar.io/mgar/?ip=192.169.81.70:447
  16. // @match http://mgar.io/mgar/?ip=213.32.6.56:450
  17. // @match http://mgar.io/mgar/?ip=213.32.6.56:451
  18. // @match http://mgar.io/mgar/?ip=213.32.6.56:452
  19. // @match http://mgar.io/mgar/?ip=213.32.6.56:453
  20. // @match http://mgar.io/mgar/?ip=213.32.6.56:454
  21. // @match http://mgar.io/mgar/?ip=164.132.200.92:2021
  22. // @match http://mgar.io/mgar/?ip=164.132.200.92:2017
  23. // @match http://mgar.io/mgar/?ip=192.95.15.93:4437
  24. // @match astr.io
  25. // @match http://mgar.io/mgar/?ip=137.74.162.192:50000
  26. // @match http://mgar.io/mgar/?ip=149.56.131.65:50000
  27. // @match http://mgar.io/mgar/?ip=211.107.90.50:50001
  28. // @match agarxi.esy.es
  29. // @match http://mgar.io/mgar/?ip=109.234.37.246:450
  30. // @match http://mgar.io/mgar/?ip=109.234.37.246:444
  31. // @match http://mgar.io/mgar/?ip=109.234.37.246:447
  32. // @require https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js
  33. // @grant none
  34. // @run-at document-start
  35. // ==/UserScript==
  36.  
  37. setTimeout(function() {
  38. var real_minx = -7071;
  39. var real_miny = -7071;
  40. var real_maxx = 7071;
  41. var real_maxy = 7071;
  42. var lastsent = {
  43. minx: 0,
  44. miny: 0,
  45. maxx: 0,
  46. maxy: 0
  47. };
  48.  
  49. function valcompare(Y, Z) {
  50. return 0.01 > Y - Z && -0.01 < Y - Z
  51. }
  52. window.agar.hooks.dimensionsUpdated = function(server_minx, server_miny, server_maxx, server_maxy) {
  53. if (valcompare(server_maxx - server_minx, server_maxy - server_miny)) {
  54. real_minx = server_minx;
  55. real_miny = server_miny;
  56. real_maxx = server_maxx;
  57. real_maxy = server_maxy
  58. } else {
  59. if (valcompare(server_minx, lastsent.minx)) {
  60. if (0.01 < server_maxx - lastsent.maxx || -0.01 > server_maxx - lastsent.maxx) {
  61. real_minx = server_minx;
  62. real_maxx = server_minx + 14142.135623730952
  63. }
  64. }
  65. if (0.01 < server_minx - lastsent.minx || -0.01 > server_minx - lastsent.minx) {
  66. if (valcompare(server_maxx, lastsent.maxx)) {
  67. real_maxx = server_maxx;
  68. real_minx = server_maxx - 14142.135623730952
  69. }
  70. }
  71. if (0.01 < server_miny - lastsent.miny || -0.01 > server_miny - lastsent.miny) {
  72. if (valcompare(server_maxy, lastsent.maxy)) {
  73. real_maxy = server_maxy;
  74. real_miny = server_maxy - 14142.135623730952
  75. }
  76. }
  77. if (valcompare(server_miny, lastsent.miny)) {
  78. if (0.01 < server_maxy - lastsent.maxy || -0.01 > server_maxy - lastsent.maxy) {
  79. real_miny = server_miny;
  80. real_maxy = server_miny + 14142.135623730952
  81. }
  82. }
  83. if (server_minx < real_minx) {
  84. real_minx = server_minx;
  85. real_maxx = server_minx + 14142.135623730952
  86. }
  87. if (server_maxx > real_maxx) {
  88. real_maxx = server_maxx;
  89. real_minx = server_maxx - 14142.135623730952
  90. }
  91. if (server_miny < real_miny) {
  92. real_miny = server_miny;
  93. real_maxy = server_miny + 14142.135623730952
  94. }
  95. if (server_maxy > real_maxy) {
  96. real_maxy = server_maxy;
  97. real_miny = server_maxy - 14142.135623730952
  98. }
  99. lastsent.minx = server_minx;
  100. lastsent.miny = server_miny;
  101. lastsent.maxy = server_maxy;
  102. lastsent.maxx = server_maxx
  103. }
  104. offset_x = real_minx || -7071;
  105. offset_y = real_miny || -7071
  106. };
  107. var socket = io.connect('ws://127.0.0.1:8081');
  108. var canMove = true;
  109. var movetoMouse = true;
  110. var moveEvent = new Array(2);
  111. var canvas = document.getElementById("canvas");
  112. last_transmited_game_server = null;
  113. socket.on('force-login', function(data) {
  114. socket.emit("login", {
  115. "uuid": client_uuid,
  116. "type": "client"
  117. });
  118. transmit_game_server()
  119. });
  120.  
  121. socket.on('spawn-count', function(data) {
  122. document.getElementById('minionCount').innerHTML = '<div style="position: absolute; top: 63px; left: 108px;"><span id="botlayer-bots" class="label label-success pull-right">' + data + '</span></a></div>';
  123. });
  124. var client_uuid = localStorage.getItem('client_uuid');
  125. if(client_uuid == null){
  126. console.log("generating a uuid for this user");
  127. client_uuid = Math.floor((5 + Math.random()) * 0x100110 * Math.random() * 152.22158531 / Math.random() * 15.1 / 553.1 - 515/2*51 / 999999*9999999 -99).toString(16).substring(3);
  128. localStorage.setItem('client_uuid', client_uuid);
  129. //console.log(client_uuid);
  130. }
  131. socket.emit("login", client_uuid);
  132.  
  133. $("span[data-itr=option_show_mass]").prev()[0].checked = true;
  134. // setShowMass(true);
  135. var a = document.getElementById('gamemode').getElementsByTagName('option');
  136. if (a.length > 0) {
  137. for (var i = 0; i < a.length; i++) {
  138. if (a[i].getAttribute('data-itr') != 'party') {
  139. a[i].innerHTML += ' (Bots not working)';
  140. }
  141. }
  142. }
  143.  
  144. var iDiv = document.createElement('div');
  145. iDiv.id = 'block';
  146. document.getElementsByTagName('body')[0].appendChild(iDiv);
  147. iDiv.innerHTML = '<div style="position: absolute;\
  148. top: 90px; left: 30x; padding: 5px 20px; font-family: Tahoma; color: rgb(0, 200, 0); z-index: 9999; border-radius: 15px; min-width: 200px; background-color: rgba(0, 0, 0, 0.6);">\
  149. <br><center><b>JuniorBots - Client<span class="label label-success pull-right"></span></center></b></b><br>&#160;<br>&#160;<br>\
  150. <b>Bots Split<span class="label label-info pull-right">E</span></b>\
  151. <b><br>Bots Eject Mass <span class="label label-info pull-right">R</b></span><br>&#160; \
  152. <br><b> Stop Move <a id="move"> <span class="label label-danger pull-right">OFF</span></a><span class="label label-info pull-right">D</span>&#160; \
  153. <br><b> Move to Mouse <a id = "follow"><span class="label label-success pull-right">ON</b></span></a><span class="label label-info pull-right">A</span>&#160; \
  154. <br>&#160;\
  155. <b><div style="position: absolute; top: 60px;">Minions:</div> <a id="minionCount"><div style="position: absolute; top: 63px; left: 108px;><span id="botlayer-bots" class="label label-danger pull-right">Connecting...</span></div></a><b><br> \
  156. <br>&#160;<br>&#160;<span class="label label-danger pull-right"></b></span><br><b><div style="position: absolute; top: 216px;">UUID</div> <div style="position: absolute; top: 220px; left: 85px;><span id="botlayer-bots" class="label label-success pull-left">' + client_uuid + '</span></div></b>';
  157. function isMe(cell) {
  158. for (var i = 0; i < window.agar.myCells.length; i++) {
  159. if (window.agar.myCells[i] == cell.id) {
  160. return true
  161. }
  162. }
  163. return false
  164. }
  165.  
  166. function getCell() {
  167. var me = [];
  168. for (var key in window.agar.allCells) {
  169. var cell = window.agar.allCells[key];
  170. if (isMe(cell)) {
  171. me.push(cell)
  172. }
  173. }
  174. return me[0]
  175. }
  176. var skin_var = 0;
  177.  
  178. function emitPosition() {
  179. for (i = 0; i < agar.myCells.length; i++) {}
  180. x = (mouseX - window.innerWidth / 2) / window.agar.drawScale + window.agar.rawViewport.x;
  181. y = (mouseY - window.innerHeight / 2) / window.agar.drawScale + window.agar.rawViewport.y;
  182. if (!movetoMouse) {
  183. x = getCell().x;
  184. y = getCell().y
  185. }
  186. socket.emit("pos", {
  187. "x": x - (real_minx + 7071),
  188. "y": y - (real_miny + 7071),
  189. "dimensions": [-7071, -7071, 7071, 7071],
  190. "suicide_targets": [-7071, -7071, 7071, 7071]
  191. })
  192. }
  193.  
  194.  
  195. function emitSplit(){
  196. socket.emit("cmd", {"name":"split"} );
  197. }
  198.  
  199. function s(){
  200. socket.emit("Stop")
  201. }
  202. function emitMassEject() {
  203. socket.emit("cmd", {
  204. "name": "eject"
  205. })
  206. }
  207. function emi() {
  208. socket.emit("cmd", {
  209. "name": ""
  210.  
  211. })
  212. }
  213.  
  214. function toggleMovement() {
  215. canMove = !canMove;
  216. switch (canMove) {
  217. case true:
  218. canvas.onmousemove = moveEvent[0];
  219. moveEvent[0] = null;
  220. canvas.onmousedown = moveEvent[1];
  221. moveEvent[1] = null;
  222. break;
  223. case false:
  224. canvas.onmousemove({
  225. clientX: innerWidth / 2,
  226. clientY: innerHeight / 2
  227. });
  228. moveEvent[0] = canvas.onmousemove;
  229. canvas.onmousemove = null;
  230. moveEvent[1] = canvas.onmousedown;
  231. canvas.onmousedown = null;
  232. break
  233. }
  234. }
  235. interval_id = setInterval(function() {
  236. emitPosition()
  237. }, 100);
  238. interval_id2 = setInterval(function() {
  239. transmit_game_server_if_changed()
  240. }, 200);
  241. var check = true;
  242. var check2 = false;
  243. document.addEventListener('keydown', function(e) {
  244. var key = e.keyCode || e.which;
  245. switch (key) {
  246. case 65:
  247. movetoMouse = !movetoMouse;
  248. if(check2 == true) { document.getElementById('follow').innerHTML = '<span class="label label-success pull-right">ON</span>'; check2 = false; } else { document.getElementById('follow').innerHTML = '<span class="label label-danger pull-right">OFF</span>'; check2 = true; }
  249. break;
  250. case 68:
  251. toggleMovement();
  252. if(check == true) { document.getElementById('move').innerHTML = '<span class="label label-success pull-right">ON</span>'; check = false; } else { document.getElementById('move').innerHTML = '<span class="label label-danger pull-right">OFF</span>'; check = true; }
  253. break;
  254. case 69:
  255. emitSplit();
  256. break;
  257. case 82:
  258. emitMassEject();
  259. break;
  260. }
  261. });
  262.  
  263. var SplitInterval;
  264. var MacroInterval;
  265. var SplitDebounce = false;
  266. var MacroDebounce = false;
  267. $(document).on('keydown', function(input) {
  268. console.log("got keydown")
  269. if (input.keyCode == 16) {
  270. if (SplitDebounce) {
  271. return;
  272. }
  273. SplitDebounce = true;
  274. SplitInterval = setInterval(function() {
  275. $("body").trigger($.Event("keydown", {
  276. keyCode: 32
  277. }));
  278. $("body").trigger($.Event("keyup", {
  279. keyCode: 32
  280. }));
  281. }, 0);
  282. } else if (input.keyCode == 83) {
  283. if (MacroDebounce) {
  284. return;
  285. }
  286. MacroDebounce = true;
  287. MacroInterval = setInterval(function() {
  288. $("body").trigger($.Event("keydown", {
  289. keyCode: 87
  290. }));
  291. $("body").trigger($.Event("keyup", {
  292. keyCode: 87
  293. }));
  294. }, 0);
  295. }
  296. })
  297.  
  298. $(document).on('keyup', function(input) {
  299. if (input.keyCode == 16) {
  300. SplitDebounce = false;
  301. clearInterval(SplitInterval);
  302. return;
  303. } else if (input.keyCode == 83) {
  304. MacroDebounce = false;
  305. clearInterval(MacroInterval);
  306. return;
  307. }
  308. })
  309.  
  310. function transmit_game_server_if_changed() {
  311. if (last_transmited_game_server != window.agar.ws) {
  312. last_transmited_game_server = window.agar.ws;
  313. socket.emit("cmd", {
  314. "name": "reconnect_server",
  315. "ip": last_transmited_game_server
  316. })
  317. }
  318. }
  319.  
  320. function transmit_game_server() {
  321. last_transmited_game_server = window.agar.ws;
  322. socket.emit("cmd", {
  323. "name": "connect_server",
  324. "ip": last_transmited_game_server
  325. })
  326. }
  327. var mouseX = 0;
  328. var mouseY = 0;
  329. $("body").mousemove(function(event) {
  330. mouseX = event.clientX;
  331. mouseY = event.clientY
  332. });
  333. window.agar.minScale = -30
  334. }, 5000);
  335.  
  336. var allRules = [
  337. { hostname: ["agar.io"],
  338. scriptUriRe: /^http:\/\/agar\.io\/main_out\.js/,
  339. replace: function (m) {
  340. m.removeNewlines()
  341.  
  342. m.replace("var:allCells",
  343. /(=null;)(\w+)(.hasOwnProperty\(\w+\)?)/,
  344. "$1" + "$v=$2;" + "$2$3",
  345. "$v = {}")
  346.  
  347. m.replace("var:myCells",
  348. /(case 32:)(\w+)(\.push)/,
  349. "$1" + "$v=$2;" + "$2$3",
  350. "$v = []")
  351.  
  352. m.replace("var:top",
  353. /case 49:[^:]+?(\w+)=\[];/,
  354. "$&" + "$v=$1;",
  355. "$v = []")
  356.  
  357. m.replace("var:topTeams",
  358. /case 50:(\w+)=\[];/,
  359. "$&" + "$v=$1;",
  360. "$v = []")
  361.  
  362. var dr = "(\\w+)=\\w+\\.getFloat64\\(\\w+,!0\\);\\w+\\+=8;\\n?"
  363. var dd = 7071.067811865476
  364. m.replace("var:dimensions hook:dimensionsUpdated",
  365. RegExp("case 64:"+dr+dr+dr+dr),
  366. "$&" + "$v = [$1,$2,$3,$4],$H($1,$2,$3,$4),",
  367. "$v = " + JSON.stringify([-dd,-dd,dd,dd]))
  368.  
  369. var vr = "(\\w+)=\\w+\\.getFloat32\\(\\w+,!0\\);\\w+\\+=4;"
  370. m.save() &&
  371. m.replace("var:rawViewport:x,y var:disableRendering:1",
  372. /else \w+=\(5\*\w+\+(\w+)\)\/6,\w+=\(5\*\w+\+(\w+)\)\/6,.*?;/,
  373. "$&" + "$v0.x=$1; $v0.y=$2; if($v1)return;") &&
  374. m.replace("var:disableRendering:2 hook:skipCellDraw",
  375. /(\w+:function\(\w+\){)(if\(this\.\w+\(\)\){\+\+this\.[\w$]+;)/,
  376. "$1" + "if($v || $H(this))return;" + "$2") &&
  377. m.replace("var:rawViewport:scale",
  378. /Math\.pow\(Math\.min\(64\/\w+,1\),\.4\)/,
  379. "($v.scale=$&)") &&
  380. m.replace("var:rawViewport:x,y,scale",
  381. RegExp("case 17:"+vr+vr+vr),
  382. "$&" + "$v.x=$1; $v.y=$2; $v.scale=$3;") &&
  383. m.reset_("window.agar.rawViewport = {x:0,y:0,scale:1};" +
  384. "window.agar.disableRendering = false;") ||
  385. m.restore()
  386.  
  387. m.replace("reset hook:connect var:ws var:webSocket",
  388. /new WebSocket\((\w+)\);/,
  389. "$v1 = $&; $v0=$1;" + m.reset + "$H();",
  390. "$v0 = ''; $v1 = null;")
  391.  
  392. m.replace("property:scale",
  393. /function \w+\(\w+\){\w+\.preventDefault\(\);[^;]+;1>(\w+)&&\(\1=1\)/,
  394. `;${makeProperty("scale", "$1")};$&`)
  395.  
  396. m.replace("var:minScale",
  397. /;1>(\w+)&&\(\1=1\)/,
  398. ";$v>$1 && ($1=$v)",
  399. "$v = 1")
  400.  
  401. m.replace("var:region",
  402. /console\.log\("Find "\+(\w+\+\w+)\);/,
  403. "$&" + "$v=$1;",
  404. "$v = ''")
  405.  
  406. m.replace("cellProperty:isVirus",
  407. /((\w+)=!!\(\w+&1\)[\s\S]{0,400})((\w+).(\w+)=\2;)/,
  408. "$1$4.isVirus=$3")
  409.  
  410. m.replace("var:dommousescroll",
  411. /("DOMMouseScroll",)(\w+),/,
  412. "$1($v=$2),")
  413.  
  414. m.replace("var:skinF hook:cellSkin",
  415. /(\w+.fill\(\))(;null!=(\w+))/,
  416. "$1;" +
  417. "if($v)$3 = $v(this,$3);" +
  418. "if($h)$3 = $h(this,$3);" +
  419. "$2");
  420.  
  421. /*m.replace("bigSkin",
  422. /(null!=(\w+)&&\((\w+)\.save\(\),)(\3\.clip\(\),\w+=)(Math\.max\(this\.size,this\.\w+\))/,
  423. "$1" + "$2.big||" + "$4" + "($2.big?2:1)*" + "$5")*/
  424.  
  425. m.replace("hook:afterCellStroke",
  426. /\((\w+)\.strokeStyle="#000000",\1\.globalAlpha\*=\.1,\1\.stroke\(\)\);\1\.globalAlpha=1;/,
  427. "$&" + "$H(this);")
  428.  
  429. m.replace("var:showStartupBg",
  430. /\w+\?\(\w\.globalAlpha=\w+,/,
  431. "$v && $&",
  432. "$v = true")
  433.  
  434. var vAlive = /\((\w+)\[(\w+)\]==this\){\1\.splice\(\2,1\);/.exec(m.text)
  435. var vEaten = /0<this\.[$\w]+&&(\w+)\.push\(this\)}/.exec(m.text)
  436. !vAlive && console.error("Expose: can't find vAlive")
  437. !vEaten && console.error("Expose: can't find vEaten")
  438. if (vAlive && vEaten)
  439. m.replace("var:aliveCellsList var:eatenCellsList",
  440. RegExp(vAlive[1] + "=\\[\\];" + vEaten[1] + "=\\[\\];"),
  441. "$v0=" + vAlive[1] + "=[];" + "$v1=" + vEaten[1] + "=[];",
  442. "$v0 = []; $v1 = []")
  443.  
  444. m.replace("hook:drawScore",
  445. /(;(\w+)=Math\.max\(\2,(\w+\(\))\);)0!=\2&&/,
  446. "$1($H($3))||0!=$2&&")
  447.  
  448. m.replace("hook:beforeTransform hook:beforeDraw var:drawScale",
  449. /(\w+)\.save\(\);\1\.translate\((\w+\/2,\w+\/2)\);\1\.scale\((\w+),\3\);\1\.translate\((-\w+,-\w+)\);/,
  450. "$v = $3;$H0($1,$2,$3,$4);" + "$&" + "$H1($1,$2,$3,$4);",
  451. "$v = 1")
  452.  
  453. m.replace("hook:afterDraw",
  454. /(\w+)\.restore\(\);(\w+)&&\2\.width&&\1\.drawImage/,
  455. "$H();" + "$&")
  456.  
  457. m.replace("hook:cellColor",
  458. /(\w+=)this\.color,/,
  459. "$1 ($h && $h(this, this.color) || this.color),")
  460.  
  461. m.replace("var:drawGrid",
  462. /(\w+)\.globalAlpha=(\.2\*\w+);/,
  463. "if(!$v)return;" + "$&",
  464. "$v = true")
  465.  
  466. m.replace("hook:drawCellMass",
  467. /&&\((\w+\|\|0==\w+\.length&&\(!this\.\w+\|\|this\.\w+\)&&20<this\.size)\)&&/,
  468. "&&( $h ? $h(this,$1) : ($1) )&&")
  469.  
  470. m.replace("hook:cellMassText",
  471. /(\.\w+)(\(~~\(this\.size\*this\.size\/100\)\))/,
  472. "$1( $h ? $h(this,$2) : $2 )")
  473.  
  474. m.replace("hook:cellMassTextScale",
  475. /(\.\w+)\((this\.\w+\(\))\)([\s\S]{0,1000})\1\(\2\/2\)/,
  476. "$1($2)$3$1( $h ? $h(this,$2/2) : ($2/2) )")
  477.  
  478. m.replace("var:enableDirectionSending",
  479. /;64>(\w+)\*\1\+(\w+)\*\2/,
  480. ";if(!$v)return" + "$&",
  481. "$v = true")
  482.  
  483. m.replace("var:simpleCellDraw",
  484. /(:function\(\){)(var a=10;)/,
  485. "$1 if($v)return true;$2",
  486. "$v=false")
  487.  
  488. m.replace("hook:updateLeaderboard",
  489. /({\w+=null;)(if\(null!=)/,
  490. "$1 if($H())return; $2")
  491.  
  492. var template = (key,n) =>
  493. `this\\.${key}=\\w+\\*\\(this\\.(\\w+)-this\\.(\\w+)\\)\\+this\\.\\${n};`
  494. var re = new RegExp(template('x', 2) + template('y', 4) + template('size', 6))
  495. var match = re.exec(m.text)
  496. if (match) {
  497. m.cellProp.nx = match[1]
  498. m.cellProp.ny = match[3]
  499. m.cellProp.nSize = match[5]
  500. } else
  501. console.error("Expose: cellProp:x,y,size search failed!")
  502.  
  503. }},
  504. ]
  505.  
  506. function makeProperty(name, varname) {
  507. return "'" + name + "' in window.agar || " +
  508. "Object.defineProperty( window.agar, '"+name+"', " +
  509. "{get:function(){return "+varname+"},set:function(){"+varname+"=arguments[0]},enumerable:true})"
  510. }
  511.  
  512. if (window.top != window.self)
  513. return
  514.  
  515. if (document.readyState !== 'loading')
  516. return console.error("Expose: this script should run at document-start")
  517.  
  518. var isFirefox = /Firefox/.test(navigator.userAgent)
  519.  
  520. // Stage 1: Find corresponding rule
  521. var rules
  522. for (var i = 0; i < allRules.length; i++)
  523. if (allRules[i].hostname.indexOf(window.location.hostname) !== -1) {
  524. rules = allRules[i]
  525. break
  526. }
  527. if (!rules)
  528. return console.error("Expose: cant find corresponding rule")
  529.  
  530.  
  531. // Stage 2: Search for `main_out.js`
  532. if (isFirefox) {
  533. function bse_listener(e) { tryReplace(e.target, e) }
  534. window.addEventListener('beforescriptexecute', bse_listener, true)
  535. } else {
  536. // Iterate over document.head child elements and look for `main_out.js`
  537. for (var i = 0; i < document.head.childNodes.length; i++)
  538. if (tryReplace(document.head.childNodes[i]))
  539. return
  540. // If there are no desired element in document.head, then wait until it appears
  541. function observerFunc(mutations) {
  542. for (var i = 0; i < mutations.length; i++) {
  543. var addedNodes = mutations[i].addedNodes
  544. for (var j = 0; j < addedNodes.length; j++)
  545. if (tryReplace(addedNodes[j]))
  546. return observer.disconnect()
  547. }
  548. }
  549. var observer = new MutationObserver(observerFunc)
  550. observer.observe(document.head, {childList: true})
  551. }
  552.  
  553. // Stage 3: Replace found element using rules
  554. function tryReplace(node, event) {
  555. var scriptLinked = rules.scriptUriRe && rules.scriptUriRe.test(node.src)
  556. var scriptEmbedded = rules.scriptTextRe && rules.scriptTextRe.test(node.textContent)
  557. if (node.tagName != "SCRIPT" || (!scriptLinked && !scriptEmbedded))
  558. return false // this is not desired element; get back to stage 2
  559.  
  560. if (isFirefox) {
  561. event.preventDefault()
  562. window.removeEventListener('beforescriptexecute', bse_listener, true)
  563. }
  564.  
  565. var mod = {
  566. reset: "",
  567. text: null,
  568. history: [],
  569. cellProp: {},
  570. save() {
  571. this.history.push({reset:this.reset, text:this.text})
  572. return true
  573. },
  574. restore() {
  575. var state = this.history.pop()
  576. this.reset = state.reset
  577. this.text = state.text
  578. return true
  579. },
  580. reset_(reset) {
  581. this.reset += reset
  582. return true
  583. },
  584. replace(what, from, to, reset) {
  585. var vars = [], hooks = []
  586. what.split(" ").forEach((x) => {
  587. x = x.split(":")
  588. x[0] === "var" && vars.push(x[1])
  589. x[0] === "hook" && hooks.push(x[1])
  590. })
  591. function replaceShorthands(str) {
  592. function nope(letter, array, fun) {
  593. str = str
  594. .split(new RegExp('\\$' + letter + '([0-9]?)'))
  595. .map((v,n) => n%2 ? fun(array[v||0]) : v)
  596. .join("")
  597. }
  598. nope('v', vars, (name) => "window.agar." + name)
  599. nope('h', hooks, (name) => "window.agar.hooks." + name)
  600. nope('H', hooks, (name) =>
  601. "window.agar.hooks." + name + "&&" +
  602. "window.agar.hooks." + name)
  603. return str
  604. }
  605. var newText = this.text.replace(from, replaceShorthands(to))
  606. if(newText === this.text) {
  607. console.error("Expose: `" + what + "` replacement failed!")
  608. return false
  609. } else {
  610. this.text = newText
  611. if (reset)
  612. this.reset += replaceShorthands(reset) + ";"
  613. return true
  614. }
  615. },
  616. removeNewlines() {
  617. this.text = this.text.replace(/([,\/;])\n/mg, "$1")
  618. },
  619. get: function() {
  620. var cellProp = JSON.stringify(this.cellProp)
  621. return `window.agar={hooks:{},cellProp:${cellProp}};` +
  622. this.reset + this.text
  623. }
  624. }
  625.  
  626. if (scriptEmbedded) {
  627. mod.text = node.textContent
  628. rules.replace(mod)
  629. if (isFirefox) {
  630. document.head.removeChild(node)
  631. var script = document.createElement("script")
  632. script.textContent = mod.get()
  633. document.head.appendChild(script)
  634. } else {
  635. node.textContent = mod.get()
  636. }
  637. console.log("Expose: replacement done")
  638. } else {
  639. document.head.removeChild(node)
  640. var request = new XMLHttpRequest()
  641. request.onload = function() {
  642. var script = document.createElement("script")
  643. mod.text = this.responseText
  644. rules.replace(mod)
  645. script.textContent = mod.get()
  646. // `main_out.js` should not executed before jQuery was loaded, so we need to wait jQuery
  647. function insertScript(script) {
  648. if (typeof jQuery === "undefined")
  649. return setTimeout(insertScript, 0, script)
  650. document.head.appendChild(script)
  651. console.log("Expose: replacement done")
  652. }
  653. insertScript(script)
  654. }
  655. request.onerror = function() { console.error("Expose: response was null") }
  656. request.open("get", node.src, true)
  657. request.send()
  658. }
  659.  
  660. return true
  661. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement