Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var http = require('http');
- var url = require('url');
- var fs = require('fs');
- var crypto = require('crypto');
- var chance = require('chance');
- var salts = new chance();
- var waiting = [];
- var game_id = [];
- var connections = [];
- var jogos;
- function gameStarted(hash,user){
- for(var i=0;i<game_id.length;i++){
- //console.log("HASH " + game_id[i].game.hash + " user " + game_id[i].user1.nick);
- if(game_id[i].game.hash===hash && (game_id[i].user1.nick===user || game_id[i].user2.nick===user))
- return i;
- }
- return -1;
- }
- function isInteger(x) {
- return x % 1 === 0;
- }
- check_file();
- var headers = {
- plain: {
- 'Content-Type': 'application/javascript',
- 'Cache-Control': 'no-cache',
- 'Access-Control-Allow-Origin': '*'
- },
- sse: {
- 'Content-Type': 'text/event-stream',
- 'Cache-Control': 'no-cache',
- 'Access-Control-Allow-Origin': '*',
- 'Connection': 'keep-alive'
- }
- };
- function check_file()
- {
- fs.readFile('dados.json', function(err, data)
- {
- try
- {
- JSON.parse(data.toString());
- }
- catch (e)
- {
- fs.writeFile('dados.json', "[]", function(err){});
- }
- });
- fs.readFile('ranking.json', function(err, data)
- {
- try
- {
- JSON.parse(data.toString());
- }
- catch (e)
- {
- fs.writeFile('ranking.json', "[]", function(err){});
- }
- });
- fs.readFile('join.json', function(err, data)
- {
- try
- {
- JSON.parse(data.toString());
- }
- catch (e)
- {
- fs.writeFile('join.json', "[]", function(err){});
- }
- });
- fs.readFile('update.json', function(err, data)
- {
- try
- {
- JSON.parse(data.toString());
- }
- catch (e)
- {
- fs.writeFile('update.json', "[]", function(err){});
- }
- });
- }
- function sort_object(object){
- object.sort(function(a, b) {
- if(a.victories==b.victories)
- return parseInt(a.games) - parseInt(b.games);
- return -(parseInt(a.victories) - parseInt(b.victories));
- });
- }
- function start_game(index){
- var jogo=game_id[index];
- }
- function find_game(hash,nick){
- for(var i=0;i<game_id.length;i++){
- if(game_id[i].game.hash===hash && (game_id[i].user1.nick===nick || game_id[i].user2.nick===nick)){
- return i;
- }
- }
- return -1;
- }
- function oponent(group,size){
- console.log("entra waiting");
- if(waiting.length==0){
- console.log("entra vazio waiting");
- return null;
- }
- for(var i = 0; i < waiting.length; i++)
- {
- console.log("entra for waiting");
- if(waiting[i].group == group && waiting[i].size == size)
- {
- var temp = waiting[i];
- waiting.splice(i, 1);
- return temp;
- }
- }
- return null;
- }
- function newGame(user1,user2,hash,size){
- var rack=[]; var pieces=0;
- var j=0;
- for(var i=1;i<=size;i++){
- rack[j]=i;
- j++;
- }
- var data ={
- board:{
- table: null,
- size: size,
- rack: rack,
- pieces: size
- },
- user1 :{
- nick : user1
- },
- user2:{
- nick: user2
- },
- game :
- {
- turn: user2,
- hash: hash
- }
- };
- var index = game_id.push(data);
- return index-1;
- }
- var server = http.createServer(function (req, res){
- var preq = url.parse(req.url,true);
- var pathname = preq.pathname;
- console.log("ENtrou um pedido : " + pathname);
- var answer = {};
- switch(req.method){
- case "POST":
- doPost(pathname,req,res);
- break;
- case "GET":
- doGet(pathname,preq.query,res);
- break;
- }
- // res.writeHead(200, headers.plain);
- });
- server.listen(8080);
- function check(data){
- var nick = data.nick;
- var pass = data.pass;
- var game = data.game;
- for(var i=0;i<waiting.length;i++){
- if(waiting[i].nick==nick && waiting[i].game==game){
- return true;
- }
- }
- //notify && update
- if(game_id[index] == undefined){
- return false;
- }
- else if(game_id[index].user1.nick==nick){
- return true;
- }
- else if(game_id[index].user2.nick==nick){
- return true;
- }
- return false;
- }
- function doGet(pathname,req,res) {
- var body = "";
- var resposta;
- res.setHeader('Access-Control-Allow-Origin','*');
- switch(pathname)
- {
- case "/update":
- var nick = req.nick;
- var game = req.game;
- res.writeHead(200,
- {
- 'Content-Type' : 'text/event-stream',
- 'Cache-Control': 'no-cache',
- 'Connection' : 'keep-alive'
- });
- res.write("\n");
- var connection_temp =
- {
- nick: nick,
- res: res,
- game: game
- };
- connections.push(connection_temp);
- var index= gameStarted(game,nick);
- console.log("index" + index);
- console.log(nick);
- if(index!=-1)
- {
- console.log("index" + index);
- var object = game_id[find_game(game,nick)];
- // res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
- var other_player = -1;
- for(var i = 0; i < connections.length; i++)
- {
- if(connections[i].game === game && connections[i].nick !== nick)
- other_player = i;
- }
- if(other_player !== -1)
- {
- console.log("Update 2nd player: " + connections[other_player].nick);
- connections[other_player].res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
- res.write("data: " + JSON.stringify({turn: object.game.turn, rack: object.board.rack }) + "\n\n");
- }
- else
- res.write("data: {}\n\n");
- }
- /*else
- {
- console.log("ERROR");
- res.end(JSON.stringify({error:"ERROR update"}));
- return; //return erro
- }
- */
- break;
- }
- return;
- }
- // guardar globalmente todos os jogos
- function alterar_table(data,stack,pieces){
- data.board.rack[stack-1]=pieces;
- if(data.game.turn===data.user1.nick)
- data.game.turn=data.user2.nick;
- else
- data.game.turn=data.user1.nick;
- return data;
- }
- function winner_func(data)
- {
- for(var i = 0; i<data.board.size; i++)
- {
- if(data.board.rack[i] > 0)
- return "";
- }
- return data.game.turn;
- }
- function doPost(pathname, req, res){
- var body = "";
- var resposta;
- console.log("do post " + pathname);
- res.setHeader('Access-Control-Allow-Origin','*');
- switch(pathname) {
- case "/notify":
- req
- .on("data",function(data) {body +=data})
- .on("end",function(){
- try{
- var dados = JSON.parse(body);
- // verificar pass, game, user
- console.log("NOTIFY");
- var nick = dados.nick;
- var pass = dados.pass;
- var game = dados.game; //hash
- var stack = dados.stack;
- var pieces = dados.pieces;
- var index=find_game(game,nick);
- if(index!=-1){
- var data = game_id[index];
- if((data.board.pieces>pieces && pieces>=0 && stack > 0) && data.game.turn===nick){
- if(data.board.rack[stack-1] > pieces)
- data.board.rack[stack-1]=pieces;
- else
- {
- res.writeHead(401, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify({error:"ERROR"}));
- return;
- }
- var winner = winner_func(data);
- console.log("winner " + winner);
- if(winner !== "")
- {
- // update winner
- // fechar update
- // tirar de connections os dois users
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.end("{}");
- for(var i = 0; i < connections.length ;i++)
- {
- if(connections[i].game == game)
- {
- console.log(connections[i].nick);
- connections[i].res.end("data: " + JSON.stringify({ winner: winner, rack: data.board.rack, stack: 0, pieces: 0 }) + "\n\n");
- }
- }
- console.log("REMOVe");
- for(var i = 0; i < connections.length ;i++)
- if(connections[i].game == game)
- {
- console.log(connections[i].nick);
- connections.splice(i,1);
- i--;
- }
- game_id.splice(index,1);
- return;
- }
- data = alterar_table(data,stack,pieces);
- game_id[index] = data;
- for(var i = 0; i < connections.length;i++)
- {
- if(connections[i].game == game)
- connections[i].res.write("data: " + JSON.stringify({turn1: data.game.turn, rack: data.board.rack}) + "\n\n");
- }
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.end("{}");
- }
- else if(pieces<0){
- res.writeHead(401, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify({error:"Stack cannot have a negative number of pieces"}));
- }
- else if(data.game.turn!=nick){
- res.writeHead(401, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify({error:"Not your turn to play"}));
- }
- }
- else
- {
- res.writeHead(401, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify({error:"ahdjkhabkwdbawkd ERROR"}));
- }
- }
- catch(err) { console.log("erro json"); }})
- .on("error", function(err) { console.log(err.message); })
- break;
- //---------------------------LEAVE---------------------------
- case "/leave":
- req
- .on("data",function(data){body+=data})
- .on("end",function()
- {
- try
- {
- var dados = JSON.parse(body);
- var nick = dados.nick;
- var pass = dados.pass;
- var game = dados.game;
- var index=find_game(game,nick);
- console.log("DEBUG1");
- /*
- if(index != -1)
- {*/
- for(var i =0; i< waiting.length; i++)
- {
- console.log(waiting[i].game + " wait " +waiting[i].nick);
- if(waiting[i].nick == nick && waiting[i].game == game)
- {
- console.log("DEBUG1");
- waiting.splice(i,1);
- i--;
- console.log("REMOVE_WAITING");
- }
- }
- //}
- console.log("DEBUG1");
- for(var i = 0; i < connections.length; i++)
- {
- console.log(connections[i].game + " con " +connections[i].nick);
- if(connections[i].game == game && connections[i].nick == nick)
- {
- connections.splice(i, 1);
- console.log("REMOVE_CONN");
- i--;
- }
- }
- console.log("DEBUG1");
- }
- catch(err){ console.log("Erro no leave");}
- })
- .on("error",function(err){console.log(err.message)})
- break;
- case "/join":
- req
- .on("data",function(data) {body +=data})
- .on("end",function(){
- try{
- console.log("create join");
- var file = fs.readFile('join.json', function(err, data) {
- if(!err)
- {
- var flag = 0;
- var dados = JSON.parse(body);
- dados.res=res;
- //console.log(dados.res);
- //console.log("dados" + dados);
- var group = dados.group;
- var nick = dados.nick;
- var pass = dados.pass;
- var size = dados.size;
- var opo = oponent(group,size);
- if(opo === null){ //insere jogador
- var hash = crypto.createHash('md5').update(salts.string({length:8})).digest('hex');
- dados.game = hash;
- waiting.splice(0,0,dados);
- console.log("adicionar a waiting");
- //console.log(waiting);
- var object = {game: hash};
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify(object));
- }
- else{
- console.log("possivel jogo");
- //var hash = crypto.createHash('md5').update(salts.string({length:8})).digest('hex');
- var hash = opo.game;
- console.log("GAME_ID");
- console.log(nick+ " " + opo.nick + " " + hash + " " + size);
- var index = newGame(nick,opo.nick,hash,size);
- var game_data = game_id[index].game.hash;
- var object = {game: game_data};
- if(game_data != hash){
- flag=1;
- res.writeHead(401, {'Content-Type' : 'text/plain'});
- res.end(JSON.stringify({error:"Playing in other game!"}));
- return;
- }
- fs.writeFile('join.json', JSON.stringify(object), function(err) {
- if (err)
- return console.log(err);
- });
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- //console.log(res);
- res.end(JSON.stringify(object));
- }
- }
- else{
- res.writeHead(404, {'Content-Type' : 'text/plain'});
- res.end();
- console.log("erro join");
- }
- })
- }
- catch(err) { console.log("erro json"); }
- })
- .on("error", function(err) { console.log(err.message); })
- break;
- case "/register":
- req
- .on("data",function(data) {body +=data})
- .on("end",function(){
- try{
- var data = "";
- var file = fs.readFile('dados.json', function(err, data) {
- if (!err) {
- var dados = JSON.parse(body);
- var user = dados.nick;
- var pass = dados.pass;
- var flag = 1;
- var object = JSON.parse(data.toString('utf8'));
- for(var i=0;i<object.length;i++){
- var object_teste = JSON.stringify(object);
- if(object[i].nick === user){
- console.log("This user already exits");
- if(pass === object[i].pass){
- flag=2; // 200
- break;
- }
- else {
- flag=3; // 401
- break;
- }
- }
- else{
- flag=1;
- }
- }
- console.log("falg final " + flag);
- if(flag==1){
- var salt = salts.string({length: 4});
- var password = crypto.createHash('md5').update(salt + pass).digest('hex');
- // console.log(" data " + object[0]);
- var savefile = {};
- savefile.nick=user;
- savefile.pass=password;
- savefile.salt=salt;
- object.push(savefile);
- fs.writeFile('dados.json', JSON.stringify(object), function(err) {
- if (err)
- return console.log(err);
- });
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.write("{}");
- }
- else if(flag==2){
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.write("{}");
- console.log("flag2" + flag);
- }
- else{
- res.writeHead(401, {'Content-Type' : 'text/hml'});
- res.write(JSON.stringify({error: "User registered with a different password"}));
- console.log("flag3" + flag);
- }
- res.end();
- }
- else{
- res.writeHead(404, {'Content-Type' : 'text/html'});
- res.write(JSON.stringify({error: "ERROR"}));
- }
- })}
- catch(err) { console.log("erro json"); /* erros de JSON */ }
- })
- .on("error", function(err) { console.log(err.message); })
- break;
- case "/ranking":
- req
- .on("data",function(data) {body +=data})
- .on("end",function(){
- try{
- console.log("create server ranking");
- var file = fs.readFile('ranking.json', function(err, data) {
- if (!err) {
- console.log(body);
- var dados = JSON.parse(body);
- var size = dados.size;
- if(isInteger(size) && (size>=2 && size<=10)){
- var object = JSON.parse(data.toString('utf8'));
- if(object[size] != undefined){
- sort_object(object);
- res.writeHead(200, {'Content-Type' : 'text/plain'});
- res.write(JSON.stringify(object[size]));
- console.log(object[size]);
- }
- else{
- res.writeHead(401, {'Content-Type' : 'text/html'});
- res.write(JSON.stringify({error: "Doens't exits table with this size"}));
- console.log("nao tem tabela");
- }
- }
- else{
- res.writeHead(401, {'Content-Type' : 'text/html'});
- res.write(JSON.stringify({error: "Size isn't a valid"}));
- console.log("deu erro com size not int");
- }
- res.end();
- }
- else{
- res.writeHead(404, {'Content-Type' : 'text/html'});
- res.end();
- console.log("deu erro");
- }
- });
- }
- catch(err) { console.log("erro json"); /* erros de JSON */ }
- })
- .on("error", function(err) { console.log(err.message); })
- break;
- return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement