Advertisement
Guest User

Untitled

a guest
Jan 4th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.07 KB | None | 0 0
  1. var http = require('http');
  2. var url = require('url');
  3. var fs = require('fs');
  4. var crypto = require('crypto');
  5. var chance = require('chance');
  6.  
  7. var salts = new chance();
  8.  
  9. var waiting = [];
  10. var game_id = [];
  11.  
  12. var connections = [];
  13.  
  14. var jogos;
  15.  
  16. function gameStarted(hash,user){
  17.  
  18. for(var i=0;i<game_id.length;i++){
  19. //console.log("HASH " + game_id[i].game.hash + " user " + game_id[i].user1.nick);
  20. if(game_id[i].game.hash===hash && (game_id[i].user1.nick===user || game_id[i].user2.nick===user))
  21. return i;
  22. }
  23.  
  24. return -1;
  25.  
  26. }
  27.  
  28. function isInteger(x) {
  29. return x % 1 === 0;
  30. }
  31. check_file();
  32. var headers = {
  33. plain: {
  34. 'Content-Type': 'application/javascript',
  35. 'Cache-Control': 'no-cache',
  36. 'Access-Control-Allow-Origin': '*'
  37. },
  38. sse: {
  39. 'Content-Type': 'text/event-stream',
  40. 'Cache-Control': 'no-cache',
  41. 'Access-Control-Allow-Origin': '*',
  42. 'Connection': 'keep-alive'
  43. }
  44. };
  45.  
  46. function check_file()
  47. {
  48. fs.readFile('dados.json', function(err, data)
  49. {
  50. try
  51. {
  52. JSON.parse(data.toString());
  53. }
  54. catch (e)
  55. {
  56. fs.writeFile('dados.json', "[]", function(err){});
  57. }
  58. });
  59. fs.readFile('ranking.json', function(err, data)
  60. {
  61. try
  62. {
  63. JSON.parse(data.toString());
  64. }
  65. catch (e)
  66. {
  67. fs.writeFile('ranking.json', "[]", function(err){});
  68. }
  69. });
  70. fs.readFile('join.json', function(err, data)
  71. {
  72. try
  73. {
  74. JSON.parse(data.toString());
  75. }
  76. catch (e)
  77. {
  78. fs.writeFile('join.json', "[]", function(err){});
  79. }
  80. });
  81. fs.readFile('update.json', function(err, data)
  82. {
  83. try
  84. {
  85. JSON.parse(data.toString());
  86. }
  87. catch (e)
  88. {
  89. fs.writeFile('update.json', "[]", function(err){});
  90. }
  91. });
  92. }
  93.  
  94. function sort_object(object){
  95. object.sort(function(a, b) {
  96. if(a.victories==b.victories)
  97. return parseInt(a.games) - parseInt(b.games);
  98.  
  99. return -(parseInt(a.victories) - parseInt(b.victories));
  100.  
  101. });
  102.  
  103. }
  104.  
  105. function start_game(index){
  106. var jogo=game_id[index];
  107. }
  108.  
  109. function find_game(hash,nick){
  110.  
  111.  
  112. for(var i=0;i<game_id.length;i++){
  113. if(game_id[i].game.hash===hash && (game_id[i].user1.nick===nick || game_id[i].user2.nick===nick)){
  114. return i;
  115. }
  116. }
  117.  
  118. return -1;
  119.  
  120. }
  121.  
  122. function oponent(group,size){
  123. console.log("entra waiting");
  124.  
  125. if(waiting.length==0){
  126. console.log("entra vazio waiting");
  127. return null;
  128. }
  129. for(var i = 0; i < waiting.length; i++)
  130. {
  131. console.log("entra for waiting");
  132.  
  133. if(waiting[i].group == group && waiting[i].size == size)
  134. {
  135. var temp = waiting[i];
  136. waiting.splice(i, 1);
  137. return temp;
  138. }
  139. }
  140.  
  141. return null;
  142.  
  143. }
  144. function newGame(user1,user2,hash,size){
  145. var rack=[]; var pieces=0;
  146. var j=0;
  147. for(var i=1;i<=size;i++){
  148.  
  149. rack[j]=i;
  150. j++;
  151. }
  152. var data ={
  153. board:{
  154. table: null,
  155. size: size,
  156. rack: rack,
  157. pieces: size
  158.  
  159. },
  160. user1 :{
  161. nick : user1
  162. },
  163. user2:{
  164. nick: user2
  165. },
  166. game :
  167. {
  168. turn: user2,
  169. hash: hash
  170. }
  171. };
  172. var index = game_id.push(data);
  173. return index-1;
  174. }
  175.  
  176.  
  177.  
  178. var server = http.createServer(function (req, res){
  179. var preq = url.parse(req.url,true);
  180.  
  181. var pathname = preq.pathname;
  182.  
  183. console.log("ENtrou um pedido : " + pathname);
  184.  
  185. var answer = {};
  186. switch(req.method){
  187. case "POST":
  188. doPost(pathname,req,res);
  189. break;
  190.  
  191. case "GET":
  192. doGet(pathname,preq.query,res);
  193. break;
  194.  
  195.  
  196. }
  197. // res.writeHead(200, headers.plain);
  198. });
  199.  
  200. server.listen(8080);
  201.  
  202. function check(data){
  203. var nick = data.nick;
  204. var pass = data.pass;
  205. var game = data.game;
  206.  
  207. for(var i=0;i<waiting.length;i++){
  208. if(waiting[i].nick==nick && waiting[i].game==game){
  209. return true;
  210. }
  211. }
  212.  
  213. //notify && update
  214. if(game_id[index] == undefined){
  215. return false;
  216. }
  217. else if(game_id[index].user1.nick==nick){
  218. return true;
  219. }
  220. else if(game_id[index].user2.nick==nick){
  221. return true;
  222. }
  223.  
  224. return false;
  225.  
  226. }
  227. function doGet(pathname,req,res) {
  228. var body = "";
  229. var resposta;
  230.  
  231. res.setHeader('Access-Control-Allow-Origin','*');
  232. switch(pathname)
  233. {
  234. case "/update":
  235.  
  236. var nick = req.nick;
  237. var game = req.game;
  238.  
  239. res.writeHead(200,
  240. {
  241. 'Content-Type' : 'text/event-stream',
  242. 'Cache-Control': 'no-cache',
  243. 'Connection' : 'keep-alive'
  244. });
  245.  
  246. res.write("\n");
  247.  
  248. var connection_temp =
  249. {
  250. nick: nick,
  251. res: res,
  252. game: game
  253. };
  254.  
  255. connections.push(connection_temp);
  256.  
  257. var index= gameStarted(game,nick);
  258. console.log("index" + index);
  259. console.log(nick);
  260.  
  261. if(index!=-1)
  262. {
  263. console.log("index" + index);
  264. var object = game_id[find_game(game,nick)];
  265. // res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
  266.  
  267. var other_player = -1;
  268. for(var i = 0; i < connections.length; i++)
  269. {
  270. if(connections[i].game === game && connections[i].nick !== nick)
  271. other_player = i;
  272. }
  273.  
  274. if(other_player !== -1)
  275. {
  276. console.log("Update 2nd player: " + connections[other_player].nick);
  277. connections[other_player].res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
  278. res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
  279. }
  280. else
  281. res.write("data: {}\n\n");
  282.  
  283.  
  284.  
  285. }
  286. /*else
  287. {
  288. console.log("ERROR");
  289. res.end(JSON.stringify({error:"ERROR update"}));
  290. return; //return erro
  291. }
  292. */
  293. break;
  294. }
  295.  
  296.  
  297.  
  298. return;
  299.  
  300. }
  301.  
  302. // guardar globalmente todos os jogos
  303. function alterar_table(data,stack,pieces){
  304.  
  305. data.board.rack[stack-1]=pieces;
  306.  
  307. if(data.game.turn===data.user1.nick)
  308. data.game.turn=data.user2.nick;
  309. else
  310. data.game.turn=data.user1.nick;
  311.  
  312. return data;
  313. }
  314.  
  315.  
  316. function winner_func(data)
  317. {
  318. for(var i = 0; i<data.board.size; i++)
  319. {
  320. if(data.board.rack[i] > 0)
  321. return "";
  322. }
  323. return data.game.turn;
  324. }
  325.  
  326. function doPost(pathname, req, res){
  327.  
  328. var body = "";
  329. var resposta;
  330. console.log("do post " + pathname);
  331. res.setHeader('Access-Control-Allow-Origin','*');
  332. switch(pathname) {
  333.  
  334. case "/notify":
  335. req
  336. .on("data",function(data) {body +=data})
  337. .on("end",function(){
  338. try{
  339. var dados = JSON.parse(body);
  340. // verificar pass, game, user
  341. console.log("NOTIFY");
  342. var nick = dados.nick;
  343. var pass = dados.pass;
  344. var game = dados.game; //hash
  345. var stack = dados.stack;
  346. var pieces = dados.pieces;
  347. var index=find_game(game,nick);
  348.  
  349. if(index!=-1){
  350. var data = game_id[index];
  351.  
  352. if((data.board.pieces>pieces && pieces>=0 && stack > 0) && data.game.turn===nick){
  353. if(data.board.rack[stack-1] > pieces)
  354. data.board.rack[stack-1]=pieces;
  355. else
  356. {
  357.  
  358. res.writeHead(401, {'Content-Type' : 'text/plain'});
  359. res.end(JSON.stringify({error:"ERROR"}));
  360. return;
  361. }
  362. var winner = winner_func(data);
  363. console.log("winner " + winner);
  364. if(winner !== "")
  365. {
  366. // update winner
  367. // fechar update
  368. // tirar de connections os dois users
  369. res.writeHead(200, {'Content-Type' : 'text/plain'});
  370. res.end("{}");
  371.  
  372. for(var i = 0; i < connections.length ;i++)
  373. {
  374. if(connections[i].game == game)
  375. {
  376. console.log(connections[i].nick);
  377. connections[i].res.end("data: " + JSON.stringify({ winner: winner, rack: data.board.rack, stack: 0, pieces: 0 }) + "\n\n");
  378. }
  379. }
  380. console.log("REMOVe");
  381. for(var i = 0; i < connections.length ;i++)
  382. if(connections[i].game == game)
  383. {
  384. console.log(connections[i].nick);
  385. connections.splice(i,1);
  386.  
  387.  
  388. i--;
  389. }
  390.  
  391.  
  392.  
  393. game_id.splice(index,1);
  394.  
  395. return;
  396. }
  397.  
  398. data = alterar_table(data,stack,pieces);
  399.  
  400. game_id[index] = data;
  401. for(var i = 0; i < connections.length;i++)
  402. {
  403. if(connections[i].game == game)
  404. connections[i].res.write("data: " + JSON.stringify({turn1: data.game.turn, rack: data.board.rack}) + "\n\n");
  405. }
  406.  
  407. res.writeHead(200, {'Content-Type' : 'text/plain'});
  408. res.end("{}");
  409. }
  410. else if(pieces<0){
  411. res.writeHead(401, {'Content-Type' : 'text/plain'});
  412. res.end(JSON.stringify({error:"Stack cannot have a negative number of pieces"}));
  413. }
  414. else if(data.game.turn!=nick){
  415. res.writeHead(401, {'Content-Type' : 'text/plain'});
  416. res.end(JSON.stringify({error:"Not your turn to play"}));
  417. }
  418. }
  419. else
  420. {
  421. res.writeHead(401, {'Content-Type' : 'text/plain'});
  422. res.end(JSON.stringify({error:"ahdjkhabkwdbawkd ERROR"}));
  423. }
  424.  
  425. }
  426.  
  427.  
  428. catch(err) { console.log("erro json"); }})
  429.  
  430.  
  431. .on("error", function(err) { console.log(err.message); })
  432. break;
  433.  
  434. //---------------------------LEAVE---------------------------
  435. case "/leave":
  436. req
  437. .on("data",function(data){body+=data})
  438. .on("end",function()
  439. {
  440. try
  441. {
  442. var dados = JSON.parse(body);
  443. var nick = dados.nick;
  444. var pass = dados.pass;
  445. var game = dados.game;
  446.  
  447. var index=find_game(game,nick);
  448.  
  449. console.log("DEBUG1");
  450. /*
  451. if(index != -1)
  452. {*/
  453. for(var i =0; i< waiting.length; i++)
  454. {
  455. console.log(waiting[i].game + " wait " +waiting[i].nick);
  456.  
  457. if(waiting[i].nick == nick && waiting[i].game == game)
  458. {
  459. console.log("DEBUG1");
  460.  
  461. waiting.splice(i,1);
  462.  
  463. i--;
  464. console.log("REMOVE_WAITING");
  465. }
  466. }
  467.  
  468. //}
  469. console.log("DEBUG1");
  470. for(var i = 0; i < connections.length; i++)
  471. {
  472. console.log(connections[i].game + " con " +connections[i].nick);
  473. if(connections[i].game == game && connections[i].nick == nick)
  474. {
  475. connections.splice(i, 1);
  476. console.log("REMOVE_CONN");
  477.  
  478. i--;
  479.  
  480. }
  481. }
  482. console.log("DEBUG1");
  483.  
  484. }
  485. catch(err){ console.log("Erro no leave");}
  486. })
  487. .on("error",function(err){console.log(err.message)})
  488. break;
  489.  
  490. case "/join":
  491. req
  492. .on("data",function(data) {body +=data})
  493. .on("end",function(){
  494. try{
  495. console.log("create join");
  496. var file = fs.readFile('join.json', function(err, data) {
  497. if(!err)
  498. {
  499. var flag = 0;
  500. var dados = JSON.parse(body);
  501. dados.res=res;
  502. //console.log(dados.res);
  503.  
  504. //console.log("dados" + dados);
  505. var group = dados.group;
  506. var nick = dados.nick;
  507. var pass = dados.pass;
  508. var size = dados.size;
  509. var opo = oponent(group,size);
  510.  
  511. if(opo === null){ //insere jogador
  512.  
  513. var hash = crypto.createHash('md5').update(salts.string({length:8})).digest('hex');
  514. dados.game = hash;
  515.  
  516. waiting.splice(0,0,dados);
  517. console.log("adicionar a waiting");
  518. //console.log(waiting);
  519. var object = {game: hash};
  520. res.writeHead(200, {'Content-Type' : 'text/plain'});
  521. res.end(JSON.stringify(object));
  522.  
  523. }
  524. else{
  525.  
  526. console.log("possivel jogo");
  527. //var hash = crypto.createHash('md5').update(salts.string({length:8})).digest('hex');
  528. var hash = opo.game;
  529. console.log("GAME_ID");
  530. console.log(nick+ " " + opo.nick + " " + hash + " " + size);
  531. var index = newGame(nick,opo.nick,hash,size);
  532. var game_data = game_id[index].game.hash;
  533.  
  534. var object = {game: game_data};
  535. if(game_data != hash){
  536. flag=1;
  537. res.writeHead(401, {'Content-Type' : 'text/plain'});
  538. res.end(JSON.stringify({error:"Playing in other game!"}));
  539. return;
  540. }
  541. fs.writeFile('join.json', JSON.stringify(object), function(err) {
  542. if (err)
  543. return console.log(err);
  544.  
  545. });
  546.  
  547. res.writeHead(200, {'Content-Type' : 'text/plain'});
  548. //console.log(res);
  549.  
  550. res.end(JSON.stringify(object));
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559. }
  560.  
  561.  
  562. }
  563. else{
  564. res.writeHead(404, {'Content-Type' : 'text/plain'});
  565. res.end();
  566. console.log("erro join");
  567. }
  568.  
  569. })
  570. }
  571. catch(err) { console.log("erro json"); }
  572. })
  573. .on("error", function(err) { console.log(err.message); })
  574. break;
  575.  
  576. case "/register":
  577. req
  578. .on("data",function(data) {body +=data})
  579. .on("end",function(){
  580. try{
  581. var data = "";
  582.  
  583. var file = fs.readFile('dados.json', function(err, data) {
  584.  
  585. if (!err) {
  586. var dados = JSON.parse(body);
  587. var user = dados.nick;
  588. var pass = dados.pass;
  589. var flag = 1;
  590. var object = JSON.parse(data.toString('utf8'));
  591.  
  592. for(var i=0;i<object.length;i++){
  593. var object_teste = JSON.stringify(object);
  594.  
  595. if(object[i].nick === user){
  596. console.log("This user already exits");
  597.  
  598. if(pass === object[i].pass){
  599. flag=2; // 200
  600.  
  601. break;
  602. }
  603. else {
  604. flag=3; // 401
  605.  
  606. break;
  607. }
  608.  
  609. }
  610. else{
  611. flag=1;
  612.  
  613. }
  614.  
  615. }
  616. console.log("falg final " + flag);
  617.  
  618. if(flag==1){
  619. var salt = salts.string({length: 4});
  620. var password = crypto.createHash('md5').update(salt + pass).digest('hex');
  621. // console.log(" data " + object[0]);
  622. var savefile = {};
  623. savefile.nick=user;
  624. savefile.pass=password;
  625. savefile.salt=salt;
  626.  
  627. object.push(savefile);
  628.  
  629. fs.writeFile('dados.json', JSON.stringify(object), function(err) {
  630. if (err)
  631. return console.log(err);
  632.  
  633. });
  634. res.writeHead(200, {'Content-Type' : 'text/plain'});
  635. res.write("{}");
  636.  
  637. }
  638. else if(flag==2){
  639. res.writeHead(200, {'Content-Type' : 'text/plain'});
  640. res.write("{}");
  641. console.log("flag2" + flag);
  642.  
  643. }
  644. else{
  645. res.writeHead(401, {'Content-Type' : 'text/hml'});
  646. res.write(JSON.stringify({error: "User registered with a different password"}));
  647. console.log("flag3" + flag);
  648.  
  649. }
  650. res.end();
  651.  
  652. }
  653. else{
  654. res.writeHead(404, {'Content-Type' : 'text/html'});
  655. res.write(JSON.stringify({error: "ERROR"}));
  656. }
  657. })}
  658.  
  659. catch(err) { console.log("erro json"); /* erros de JSON */ }
  660.  
  661.  
  662. })
  663. .on("error", function(err) { console.log(err.message); })
  664. break;
  665.  
  666. case "/ranking":
  667. req
  668. .on("data",function(data) {body +=data})
  669. .on("end",function(){
  670. try{
  671. console.log("create server ranking");
  672. var file = fs.readFile('ranking.json', function(err, data) {
  673. if (!err) {
  674. console.log(body);
  675. var dados = JSON.parse(body);
  676.  
  677. var size = dados.size;
  678. if(isInteger(size) && (size>=2 && size<=10)){
  679. var object = JSON.parse(data.toString('utf8'));
  680.  
  681. if(object[size] != undefined){
  682. sort_object(object);
  683. res.writeHead(200, {'Content-Type' : 'text/plain'});
  684. res.write(JSON.stringify(object[size]));
  685. console.log(object[size]);
  686. }
  687. else{
  688. res.writeHead(401, {'Content-Type' : 'text/html'});
  689. res.write(JSON.stringify({error: "Doens't exits table with this size"}));
  690. console.log("nao tem tabela");
  691. }
  692. }
  693. else{
  694. res.writeHead(401, {'Content-Type' : 'text/html'});
  695. res.write(JSON.stringify({error: "Size isn't a valid"}));
  696. console.log("deu erro com size not int");
  697.  
  698. }
  699. res.end();
  700. }
  701. else{
  702. res.writeHead(404, {'Content-Type' : 'text/html'});
  703. res.end();
  704. console.log("deu erro");
  705.  
  706. }
  707. });
  708. }
  709. catch(err) { console.log("erro json"); /* erros de JSON */ }
  710.  
  711. })
  712. .on("error", function(err) { console.log(err.message); })
  713. break;
  714.  
  715.  
  716.  
  717. return;
  718.  
  719. }
  720. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement