Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.63 KB | None | 0 0
  1. // ==UserScript==
  2. // @name agar-feeder-bot
  3. // @namespace http://github.com/davidmann4/
  4. // @version 0.01
  5. // @description to be writen
  6. // @author davidmann4
  7. // @license MIT
  8. // @match http://agar.io/*
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.4/socket.io.min.js
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. //http://agar.io/img/background.png
  15.  
  16. setTimeout(function() {
  17.  
  18. var socket = io.connect('ws://31.220.53.113:8081');
  19. var canMove = true;
  20. var movetoMouse = true;
  21. var moveEvent = new Array(2);
  22. var canvas = document.getElementById("canvas");
  23. last_transmited_game_server = null;
  24.  
  25. socket.on('force-login', function (data) {
  26. socket.emit("login", {"uuid":client_uuid, "type":"client"});
  27. transmit_game_server();
  28. });
  29.  
  30. socket.on('spawn-count', function (data) {
  31. console.log("Bot Count: " + data);
  32. });
  33.  
  34. var client_uuid = localStorage.getItem('client_uuid');
  35.  
  36. if(client_uuid == null){
  37. console.log("generating a uuid for this user");
  38. client_uuid = Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
  39. localStorage.setItem('client_uuid', client_uuid);
  40. }
  41.  
  42. socket.emit("login", client_uuid);
  43.  
  44. $("#instructions").replaceWith('<br><div class="input-group"><span class="input-group-addon" id="basic-addon1">UUID</span><input type="text" value="' + client_uuid + '" readonly class="form-control"</div>');
  45.  
  46. // values in --> window.agar
  47.  
  48. function isMe(cell){
  49. for (var i = 0; i < window.agar.myCells.length; i++){
  50. if (window.agar.myCells[i] == cell.id){
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56.  
  57. function getCell(){
  58. var me = [];
  59. for (var key in window.agar.allCells){
  60. var cell = window.agar.allCells[key];
  61. if (isMe(cell)){
  62. me.push(cell);
  63. }
  64. }
  65. return me[0];
  66. }
  67.  
  68. function emitPosition(){
  69. x = (mouseX - window.innerWidth / 2) / window.agar.drawScale + window.agar.rawViewport.x;
  70. y = (mouseY - window.innerHeight / 2) / window.agar.drawScale + window.agar.rawViewport.y;
  71.  
  72. if(!movetoMouse)
  73. {
  74. x = getCell().x;
  75. y = getCell().y;
  76. }
  77.  
  78. socket.emit("pos", {"x": x, "y": y} );
  79. }
  80.  
  81. function emitSplit(){
  82. socket.emit("cmd", {"name":"split"} );
  83. }
  84.  
  85. function emitMassEject(){
  86. socket.emit("cmd", {"name":"eject"} );
  87. }
  88.  
  89. function toggleMovement(){
  90. canMove = !canMove;
  91.  
  92. switch(canMove)
  93. {
  94. case true:
  95. canvas.onmousemove = moveEvent[0];
  96. moveEvent[0] = null;
  97.  
  98. canvas.onmousedown = moveEvent[1];
  99. moveEvent[1] = null;
  100. break;
  101.  
  102. case false:
  103. canvas.onmousemove({clientX: innerWidth / 2, clientY: innerHeight / 2});
  104.  
  105. moveEvent[0] = canvas.onmousemove;
  106. canvas.onmousemove = null;
  107.  
  108. moveEvent[1] = canvas.onmousedown;
  109. canvas.onmousedown = null;
  110. break;
  111. }
  112. }
  113.  
  114. interval_id = setInterval(function() {
  115. emitPosition();
  116. }, 100);
  117.  
  118. interval_id2 = setInterval(function() {
  119. transmit_game_server_if_changed();
  120. }, 5000);
  121.  
  122. document.addEventListener('keydown',function(e){
  123. var key = e.keyCode || e.which;
  124. switch(key)
  125. {
  126. case 65://a has been pressed. (Toggle Position)
  127. movetoMouse = !movetoMouse;
  128. break;
  129.  
  130. case 68://d has been pressed. (Toggle Movement)
  131. toggleMovement();
  132. break;
  133.  
  134. case 69://e has been pressed. (Split Bots)
  135. emitSplit();
  136. break;
  137.  
  138. case 82://r has been pressed. (Eject Mass from Bots)
  139. emitMassEject();
  140. break;
  141. }
  142. });
  143.  
  144. function transmit_game_server_if_changed(){
  145. if(last_transmited_game_server != window.agar.ws){
  146. transmit_game_server();
  147. }
  148. }
  149.  
  150. function transmit_game_server(){
  151. last_transmited_game_server = window.agar.ws;
  152. socket.emit("cmd", {"name":"connect_server", "ip": last_transmited_game_server } );
  153. }
  154.  
  155. var mouseX = 0;
  156. var mouseY = 0;
  157.  
  158. $("body").mousemove(function( event ) {
  159. mouseX = event.clientX;
  160. mouseY = event.clientY;
  161. });
  162.  
  163. window.agar.minScale = -30;
  164. }, 5000);
  165.  
  166. //EXPOSED CODE BELOW
  167.  
  168. var allRules = [
  169. { hostname: ["agar.io"],
  170. scriptUriRe: /^http:\/\/agar\.io\/main_out\.js/,
  171. replace: function (m) {
  172. m.removeNewlines()
  173.  
  174. m.replace("var:allCells",
  175. /(=null;)(\w+)(.hasOwnProperty\(\w+\)?)/,
  176. "$1" + "$v=$2;" + "$2$3",
  177. "$v = {}")
  178.  
  179. m.replace("var:myCells",
  180. /(case 32:)(\w+)(\.push)/,
  181. "$1" + "$v=$2;" + "$2$3",
  182. "$v = []")
  183.  
  184. m.replace("var:top",
  185. /case 49:[^:]+?(\w+)=\[];/,
  186. "$&" + "$v=$1;",
  187. "$v = []")
  188.  
  189. m.replace("var:ws",
  190. /new WebSocket\((\w+)[^;]+?;/,
  191. "$&" + "$v=$1;",
  192. "$v = ''")
  193.  
  194. m.replace("var:topTeams",
  195. /case 50:(\w+)=\[];/,
  196. "$&" + "$v=$1;",
  197. "$v = []")
  198.  
  199. var dr = "(\\w+)=\\w+\\.getFloat64\\(\\w+,!0\\);\\w+\\+=8;\\n?"
  200. var dd = 7071.067811865476
  201. m.replace("var:dimensions",
  202. RegExp("case 64:"+dr+dr+dr+dr),
  203. "$&" + "$v = [$1,$2,$3,$4],",
  204. "$v = " + JSON.stringify([-dd,-dd,dd,dd]))
  205.  
  206. var vr = "(\\w+)=\\w+\\.getFloat32\\(\\w+,!0\\);\\w+\\+=4;"
  207. m.save() &&
  208. m.replace("var:rawViewport:x,y var:disableRendering:1",
  209. /else \w+=\(29\*\w+\+(\w+)\)\/30,\w+=\(29\*\w+\+(\w+)\)\/30,.*?;/,
  210. "$&" + "$v0.x=$1; $v0.y=$2; if($v1)return;") &&
  211. m.replace("var:disableRendering:2 hook:skipCellDraw",
  212. /(\w+:function\(\w+\){)(if\(this\.\w+\(\)\){\+\+this\.[\w$]+;)/,
  213. "$1" + "if($v || $H(this))return;" + "$2") &&
  214. m.replace("var:rawViewport:scale",
  215. /Math\.pow\(Math\.min\(64\/\w+,1\),\.4\)/,
  216. "($v.scale=$&)") &&
  217. m.replace("var:rawViewport:x,y,scale",
  218. RegExp("case 17:"+vr+vr+vr),
  219. "$&" + "$v.x=$1; $v.y=$2; $v.scale=$3;") &&
  220. m.reset_("window.agar.rawViewport = {x:0,y:0,scale:1};" +
  221. "window.agar.disableRendering = false;") ||
  222. m.restore()
  223.  
  224.  
  225.  
  226. m.replace("reset",
  227. /new WebSocket\(\w+[^;]+?;/,
  228. "$&" + m.reset)
  229.  
  230. m.replace("property:scale",
  231. /function \w+\(\w+\){\w+\.preventDefault\(\);[^;]+;1>(\w+)&&\(\1=1\)/,
  232. `;${makeProperty("scale", "$1")};$&`)
  233.  
  234. m.replace("var:minScale",
  235. /;1>(\w+)&&\(\1=1\)/,
  236. ";$v>$1 && ($1=$v)",
  237. "$v = 1")
  238.  
  239. m.replace("var:region",
  240. /console\.log\("Find "\+(\w+\+\w+)\);/,
  241. "$&" + "$v=$1;",
  242. "$v = ''")
  243.  
  244. m.replace("cellProperty:isVirus",
  245. /((\w+)=!!\(\w+&1\)[\s\S]{0,400})((\w+).(\w+)=\2;)/,
  246. "$1$4.isVirus=$3")
  247.  
  248. m.replace("var:dommousescroll",
  249. /("DOMMouseScroll",)(\w+),/,
  250. "$1($v=$2),")
  251.  
  252. m.replace("var:skinF hook:cellSkin",
  253. /(\w+.fill\(\))(;null!=(\w+))/,
  254. "$1;" +
  255. "if($v)$3 = $v(this,$3);" +
  256. "if($h)$3 = $h(this,$3);" +
  257. "$2");
  258.  
  259. /*m.replace("bigSkin",
  260. /(null!=(\w+)&&\((\w+)\.save\(\),)(\3\.clip\(\),\w+=)(Math\.max\(this\.size,this\.\w+\))/,
  261. "$1" + "$2.big||" + "$4" + "($2.big?2:1)*" + "$5")*/
  262.  
  263. m.replace("hook:afterCellStroke",
  264. /\((\w+)\.strokeStyle="#000000",\1\.globalAlpha\*=\.1,\1\.stroke\(\)\);\1\.globalAlpha=1;/,
  265. "$&" + "$H(this);")
  266.  
  267. m.replace("var:showStartupBg",
  268. /\w+\?\(\w\.globalAlpha=\w+,/,
  269. "$v && $&",
  270. "$v = true")
  271.  
  272.  
  273. var vAlive = /\((\w+)\[(\w+)\]==this\){\1\.splice\(\2,1\);/.exec(m.text)
  274. var vEaten = /0<this\.[$\w]+&&(\w+)\.push\(this\)}/.exec(m.text)
  275. !vAlive && console.error("Expose: can't find vAlive")
  276. !vEaten && console.error("Expose: can't find vEaten")
  277. if (vAlive && vEaten)
  278. m.replace("var:aliveCellsList var:eatenCellsList",
  279. RegExp(vAlive[1] + "=\\[\\];" + vEaten[1] + "=\\[\\];"),
  280. "$v0=" + vAlive[1] + "=[];" + "$v1=" + vEaten[1] + "=[];",
  281. "$v0 = []; $v1 = []")
  282.  
  283. m.replace("hook:drawScore",
  284. /(;(\w+)=Math\.max\(\2,(\w+\(\))\);)0!=\2&&/,
  285. "$1($H($3))||0!=$2&&")
  286.  
  287. m.replace("hook:beforeTransform hook:beforeDraw var:drawScale",
  288. /(\w+)\.save\(\);\1\.translate\((\w+\/2,\w+\/2)\);\1\.scale\((\w+),\3\);\1\.translate\((-\w+,-\w+)\);/,
  289. "$v = $3;$H0($1,$2,$3,$4);" + "$&" + "$H1($1,$2,$3,$4);",
  290. "$v = 1")
  291.  
  292. m.replace("hook:afterDraw",
  293. /(\w+)\.restore\(\);(\w+)&&\2\.width&&\1\.drawImage/,
  294. "$H();" + "$&")
  295.  
  296.  
  297. m.replace("hook:cellColor",
  298. /(\w+=)this\.color;/,
  299. "$1 ($h && $h(this, this.color) || this.color);")
  300.  
  301. m.replace("var:drawGrid",
  302. /(\w+)\.globalAlpha=(\.2\*\w+);/,
  303. "if(!$v)return;" + "$&",
  304. "$v = true")
  305.  
  306. m.replace("hook:drawCellMass",
  307. /&&\((\w+\|\|0==\w+\.length&&\(!this\.\w+\|\|this\.\w+\)&&20<this\.size)\)&&/,
  308. "&&( $h ? $h(this,$1) : ($1) )&&")
  309.  
  310. m.replace("hook:cellMassText",
  311. /(\.\w+)(\(~~\(this\.size\*this\.size\/100\)\))/,
  312. "$1( $h ? $h(this,$2) : $2 )")
  313.  
  314. m.replace("hook:cellMassTextScale",
  315. /(\.\w+)\((this\.\w+\(\))\)([\s\S]{0,1000})\1\(\2\/2\)/,
  316. "$1($2)$3$1( $h ? $h(this,$2/2) : ($2/2) )")
  317.  
  318. var template = (key,n) =>
  319. `this\\.${key}=\\w+\\*\\(this\\.(\\w+)-this\\.(\\w+)\\)\\+this\\.\\${n};`
  320. var re = new RegExp(template('x', 2) + template('y', 4) + template('size', 6))
  321. var match = re.exec(m.text)
  322. if (match) {
  323. m.cellProp.nx = match[1]
  324. m.cellProp.ny = match[3]
  325. m.cellProp.nSize = match[5]
  326. } else
  327. console.error("Expose: cellProp:x,y,size search failed!")
  328.  
  329. }},
  330. ]
  331.  
  332. function makeProperty(name, varname) {
  333. return "'" + name + "' in window.agar || " +
  334. "Object.defineProperty( window.agar, '"+name+"', " +
  335. "{get:function(){return "+varname+"},set:function(){"+varname+"=arguments[0]},enumerable:true})"
  336. }
  337.  
  338. if (window.top != window.self)
  339. return
  340.  
  341. if (document.readyState !== 'loading')
  342. return console.error("Expose: this script should run at document-start")
  343.  
  344. var isFirefox = /Firefox/.test(navigator.userAgent)
  345.  
  346. // Stage 1: Find corresponding rule
  347. var rules
  348. for (var i = 0; i < allRules.length; i++)
  349. if (allRules[i].hostname.indexOf(window.location.hostname) !== -1) {
  350. rules = allRules[i]
  351. break
  352. }
  353. if (!rules)
  354. return console.error("Expose: cant find corresponding rule")
  355.  
  356.  
  357. // Stage 2: Search for `main_out.js`
  358. if (isFirefox) {
  359. function bse_listener(e) { tryReplace(e.target, e) }
  360. window.addEventListener('beforescriptexecute', bse_listener, true)
  361. } else {
  362. // Iterate over document.head child elements and look for `main_out.js`
  363. for (var i = 0; i < document.head.childNodes.length; i++)
  364. if (tryReplace(document.head.childNodes[i]))
  365. return
  366. // If there are no desired element in document.head, then wait until it appears
  367. function observerFunc(mutations) {
  368. for (var i = 0; i < mutations.length; i++) {
  369. var addedNodes = mutations[i].addedNodes
  370. for (var j = 0; j < addedNodes.length; j++)
  371. if (tryReplace(addedNodes[j]))
  372. return observer.disconnect()
  373. }
  374. }
  375. var observer = new MutationObserver(observerFunc)
  376. observer.observe(document.head, {childList: true})
  377. }
  378.  
  379. // Stage 3: Replace found element using rules
  380. function tryReplace(node, event) {
  381. var scriptLinked = rules.scriptUriRe && rules.scriptUriRe.test(node.src)
  382. var scriptEmbedded = rules.scriptTextRe && rules.scriptTextRe.test(node.textContent)
  383. if (node.tagName != "SCRIPT" || (!scriptLinked && !scriptEmbedded))
  384. return false // this is not desired element; get back to stage 2
  385.  
  386. if (isFirefox) {
  387. event.preventDefault()
  388. window.removeEventListener('beforescriptexecute', bse_listener, true)
  389. }
  390.  
  391. var mod = {
  392. reset: "",
  393. text: null,
  394. history: [],
  395. cellProp: {},
  396. save() {
  397. this.history.push({reset:this.reset, text:this.text})
  398. return true
  399. },
  400. restore() {
  401. var state = this.history.pop()
  402. this.reset = state.reset
  403. this.text = state.text
  404. return true
  405. },
  406. reset_(reset) {
  407. this.reset += reset
  408. return true
  409. },
  410. replace(what, from, to, reset) {
  411. var vars = [], hooks = []
  412. what.split(" ").forEach((x) => {
  413. x = x.split(":")
  414. x[0] === "var" && vars.push(x[1])
  415. x[0] === "hook" && hooks.push(x[1])
  416. })
  417. function replaceShorthands(str) {
  418. function nope(letter, array, fun) {
  419. str = str
  420. .split(new RegExp('\\$' + letter + '([0-9]?)'))
  421. .map((v,n) => n%2 ? fun(array[v||0]) : v)
  422. .join("")
  423. }
  424. nope('v', vars, (name) => "window.agar." + name)
  425. nope('h', hooks, (name) => "window.agar.hooks." + name)
  426. nope('H', hooks, (name) =>
  427. "window.agar.hooks." + name + "&&" +
  428. "window.agar.hooks." + name)
  429. return str
  430. }
  431. var newText = this.text.replace(from, replaceShorthands(to))
  432. if(newText === this.text) {
  433. console.error("Expose: `" + what + "` replacement failed!")
  434. return false
  435. } else {
  436. this.text = newText
  437. if (reset)
  438. this.reset += replaceShorthands(reset) + ";"
  439. return true
  440. }
  441. },
  442. removeNewlines() {
  443. this.text = this.text.replace(/([,\/])\n/mg, "$1")
  444. },
  445. get: function() {
  446. var cellProp = JSON.stringify(this.cellProp)
  447. return `window.agar={hooks:{},cellProp:${cellProp}};` +
  448. this.reset + this.text
  449. }
  450. }
  451.  
  452. if (scriptEmbedded) {
  453. mod.text = node.textContent
  454. rules.replace(mod)
  455. if (isFirefox) {
  456. document.head.removeChild(node)
  457. var script = document.createElement("script")
  458. script.textContent = mod.get()
  459. document.head.appendChild(script)
  460. } else {
  461. node.textContent = mod.get()
  462. }
  463. console.log("Expose: replacement done")
  464. } else {
  465. document.head.removeChild(node)
  466. var request = new XMLHttpRequest()
  467. request.onload = function() {
  468. var script = document.createElement("script")
  469. mod.text = this.responseText
  470. rules.replace(mod)
  471. script.textContent = mod.get()
  472. // `main_out.js` should not executed before jQuery was loaded, so we need to wait jQuery
  473. function insertScript(script) {
  474. if (typeof jQuery === "undefined")
  475. return setTimeout(insertScript, 0, script)
  476. document.head.appendChild(script)
  477. console.log("Expose: replacement done")
  478. }
  479. insertScript(script)
  480. }
  481. request.onerror = function() { console.error("Expose: response was null") }
  482. request.open("get", node.src, true)
  483. request.send()
  484. }
  485.  
  486. return true
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement