-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.js
158 lines (127 loc) · 4.17 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import { Server } from 'socket.io';
import express from 'express';
import crypto from 'crypto';
import http from 'http';
const app = express();
const server = http.createServer(app);
const io = new Server(server);
const host = 'localhost';
const port = process.env.PORT||3000;
/* Array que armazena objetos que representam uma
sala de jogo criada */
const gameRooms = [];
app.use(express.static('src'));
app.get("/", (request, response) => {
response.sendFile('index.html', { root: 'src' });
});
/* Cria o objeto que representa uma sala do jogo */
function createRoom() {
const room = {
id: null,
isClosed: false,
darkId: null,
whiteId: null
}
return room;
}
/* Fecha a sala de jogo com o ID passado */
function closeRoom(roomId) {
for (let i = 0; i < gameRooms.length; i++) {
if (gameRooms[i].id == roomId) {
gameRooms[i].isClosed = true;
break;
}
}
}
io.on('connection', socket => {
const url = socket.handshake.headers.referer.split('/');
const roomId = url[3];
const inGameRoom = (roomId != undefined && roomId.length == 30)
if (inGameRoom)
console.log(`> Jogador [${socket.id}] conectado na sala [${roomId}]`);
/* Ao receber o evento de desconexão de um client */
socket.on('disconnect', () => {
let url = socket.handshake.headers.referer.split('/');
let roomId = url[3];
/* Se o client estiver dentro de uma sala de jogo */
if (inGameRoom) {
console.log(`> Jogador [${socket.id}] desconectado da sala [${roomId}]`);
closeRoom(roomId);
io.to(roomId).emit('playerDisconnected', `http://${host}:${port}`);
}
});
/* Ao receber uma solicitação de criar uma sala por um jogador */
socket.on('createRoom', socketId => {
const roomId = crypto.randomBytes(3).toString('hex');
app.get(`/${roomId}`, (req, res) => {
res.sendFile('chess.html', { root: 'src' });
});
io.to(socketId).emit(
'roomCreated', `http://${host}:${port}/${roomId}`, roomId
);
});
/* Ao receber o evento de que um jogador entrou na sala */
socket.on('enteredRoom', () => {
let url = socket.handshake.headers.referer.split('/');
let roomId = url[3];
socket.join(roomId);
let room = null;
/* Verificando se a sala já foi criada */
gameRooms.forEach(e => {
if (e.id == roomId)
room = e;
});
/* Se a sala existir */
if (room) {
if (room.darkId === null) room.darkId = socket.id;
else if (room.whiteId === null) room.whiteId = socket.id;
/* Manda o comando de iniciar o jogo para
ambos os jogadores */
io.to(roomId).emit('startGame', room, `http://${host}:${port}`);
} else {
const room = createRoom();
room.id = roomId;
room.whiteId = socket.id;
gameRooms.push(room);
/* Como este é o primeiro jogador, exibir uma
mensagem com um botão disponível para copiar o
link do site */
socket.emit('showSendLinkMessage');
}
});
/* Ao receber o evento de uma peça mexida por um jogador */
socket.on('pieceMoved', (
mirroredOldPosition,
mirroredNewPosition,
roomId
) => {
/* Mandando o movimento espelhado para o outro jogador */
socket
.broadcast.to(roomId)
.emit('pieceMoved', mirroredOldPosition, mirroredNewPosition);
});
/* Ao receber o evento de que um peão foi transformado */
socket.on('pawnTransformed', command => {
/* Notificando a transformação para o outro jogador */
socket
.broadcast.to(command.roomId)
.emit('pawnTransformed', command);
});
/* Ao receber o evento de jogo terminado */
socket.on('gameEnded', command => {
closeRoom(command.roomId);
});
/* sinalização para troca de fluxo de audio entre jogadores */
socket.on("offer", (offer, to)=>{
socket.to(to).emit("offer", offer)
});
socket.on("answer", (answer, to) =>{
socket.to(to).emit("answer", answer);
})
socket.on("ice", (ice, to) =>{
socket.to(to).emit("ice", ice);
})
});
server.listen(port, () => {
console.log(`Listening at ${host}:${port}`);
});