|
| 1 | +var socketio = require('socket.io'), |
| 2 | + chatRPG = require('./chat_rpg'), |
| 3 | + chatUNO = require('./chat_uno'), |
| 4 | + io, |
| 5 | + numVisitante = 1, |
| 6 | + nomes = {}, |
| 7 | + nomesUsados = [], |
| 8 | + salaAtual = {}; |
| 9 | + |
| 10 | + |
| 11 | +// Conecta o Sockets.IO ao servidor HTTP e exporta a função. |
| 12 | +exports.conectar = function(servidor){ |
| 13 | + chatUNO.escolherCarta(7); |
| 14 | + // Registra a conexão. |
| 15 | + io = socketio.listen(servidor); |
| 16 | + //io.set('log level', 1); |
| 17 | + |
| 18 | + // Define como cada conexão irá ser gerenciada. |
| 19 | + io.sockets.on('connect', function(socket) { |
| 20 | + console.log("Usuário entrou"); |
| 21 | + // Quando alguém entrar, um nome será dado. Vide função. |
| 22 | + numVisitante = nomearVisitante(socket, numVisitante, nomes, nomesUsados); |
| 23 | + //Faz com que o novo convidado entre na sala principal. |
| 24 | + entrarNaSala(socket, 'Principal'); |
| 25 | + |
| 26 | + // Nomes explicativos. |
| 27 | + lidarComMensagens(socket, nomes); |
| 28 | + lidarComTentativasDeMudancaDeNome(socket, nomes, nomesUsados); |
| 29 | + lidarEntradaDeSala(socket); |
| 30 | + chatRPG.jogarDados(socket,salaAtual, nomes); |
| 31 | + |
| 32 | + // Lista salas caso o usuário peça. |
| 33 | + socket.on('rooms', function(){ |
| 34 | + socket.emit('salas', io.sockets.manager.rooms); |
| 35 | + }); |
| 36 | + |
| 37 | + // Nome explicativo. |
| 38 | + lidarComVisitanteDesconectado(socket, nomes, nomesUsados); |
| 39 | + }); |
| 40 | +}; |
| 41 | + |
| 42 | +// Nome explicativo. |
| 43 | +function nomearVisitante( socket, numVisitante, nomes, nomesUsados) { |
| 44 | + // Dá ao novo convidado um nome. |
| 45 | + var nome = 'Convidado' + numVisitante; |
| 46 | + // Registra o nome no vetor. |
| 47 | + nomes[socket.id] = nome; |
| 48 | + // Avisa ao usuário o seu nome. |
| 49 | + socket.emit('nomeResultante', { |
| 50 | + sucesso : true, |
| 51 | + nome : nome |
| 52 | + }); |
| 53 | + // Registra o nome no vetor de nomes usados. |
| 54 | + nomesUsados.push(nome); |
| 55 | + // Incrementa o número de visitas. |
| 56 | + return numVisitante + 1; |
| 57 | +}; |
| 58 | + |
| 59 | +// Nome explicativo |
| 60 | +function entrarNaSala(socket, sala) { |
| 61 | + // Faz com que o usuário entre na sala em questão. |
| 62 | + socket.join(sala); |
| 63 | + // Recebe que o usuário em questão está em tal sala. |
| 64 | + salaAtual[socket.id] = sala; |
| 65 | + // Avisa ao usuário em questão que ele está em tal sala. |
| 66 | + socket.emit('resultadoEntrada', {sala : sala}); |
| 67 | + // Avisa aos outros usuários que tal usuário entrou. |
| 68 | + socket.broadcast.to(sala).emit('mensagem', { |
| 69 | + texto: nomes[socket.id] + ' entrou na sala ' + sala + '.' |
| 70 | + }); |
| 71 | + console.log(nomes[socket.id] + ' entrou na sala ' + sala + '.'); |
| 72 | + |
| 73 | + /* Determina quais outros usuários estão na mesma sala. |
| 74 | + * que o usuário. |
| 75 | + */ |
| 76 | + /* |
| 77 | + var usuariosNaSala = nomes; |
| 78 | + console.log(usuariosNaSala); |
| 79 | + // Se outros usuários existem, sumarize quem são. |
| 80 | + if ( usuariosNaSala.length > 1 ) { |
| 81 | + // console.log(nomesUsados[0].id); |
| 82 | + var usuariosNaSalaSumario = 'Usuários conectados na sala: '; |
| 83 | + for ( var indice; indice > usuariosNaSala; indice++ ) { |
| 84 | + var idSocketUsuario = nomesUsados[indice].id; |
| 85 | + |
| 86 | + if ( idSocketUsuario != socket.id ) { |
| 87 | + if (indice > 0 ) { |
| 88 | + usuariosNaSalaSumario += ', '; |
| 89 | + }; |
| 90 | + usuariosNaSalaSumario += nomes[idSocketUsuario]; |
| 91 | + }; |
| 92 | + }; |
| 93 | + usuariosNaSalaSumario += "."; |
| 94 | + console.log(usuariosNaSalaSumario); |
| 95 | + // Envia o sumário de usuários totais na sala para o usuário. |
| 96 | + socket.emit('mensagem', {texto: usuariosNaSalaSumario}); |
| 97 | + };*/ |
| 98 | +}; |
| 99 | + |
| 100 | + |
| 101 | +// Nome explicativo. |
| 102 | +function lidarComTentativasDeMudancaDeNome(socket, nomes, nomesUsados){ |
| 103 | + // Adiciona um listener para tentativas de mudança de nome. |
| 104 | + socket.on('tentativaNome', function(nome) { |
| 105 | + // Proíbe nomes que começam com "Convidado". |
| 106 | + |
| 107 | + if ( nome.indexOf('Convidado') == 0) { |
| 108 | + socket.emit('nomeResultante', { |
| 109 | + sucesso: false, |
| 110 | + mensagem: 'Nomes não podem começar com "Convidado."' |
| 111 | + }); |
| 112 | + } else { |
| 113 | + // Se o nome não existe, ele passará a exitir. |
| 114 | + if ( nomesUsados.indexOf(nome) == -1 ){ |
| 115 | + var nomeAnterior = nomes[socket.id]; |
| 116 | + var indiceNomeAnterior = nomesUsados.indexOf(nomeAnterior); |
| 117 | + nomesUsados.push(nome); |
| 118 | + nomes[socket.id] = nome; |
| 119 | + // Deleta o nome antigo da lista de nomes. |
| 120 | + delete nomesUsados[indiceNomeAnterior]; |
| 121 | + socket.emit('nomeResultante', { |
| 122 | + sucesso: true, |
| 123 | + nome: nome |
| 124 | + }); |
| 125 | + socket.broadcast.to(salaAtual[socket.id]).emit('mensagem', { |
| 126 | + texto: nomeAnterior + ' agora é ' + nome + '.' |
| 127 | + }); |
| 128 | + } else { |
| 129 | + // Se o nome já estiver sendo usado, avisará ao usuário. |
| 130 | + socket.emit('nomeResultante', { |
| 131 | + sucesso : false, |
| 132 | + mensagem: 'Esse nome já está em uso!' |
| 133 | + }); |
| 134 | + }; |
| 135 | + }; |
| 136 | + }); |
| 137 | +}; |
| 138 | + |
| 139 | +// Nome explicativo |
| 140 | +function lidarComMensagens(socket){ |
| 141 | + // Ao receber uma mensagem, a mesma será enviada para toda a sala. |
| 142 | + socket.on('mensagem', function(mensagem){ |
| 143 | + socket.broadcast.to(mensagem.sala).emit('mensagem', { |
| 144 | + autor: nomes[socket.id], |
| 145 | + texto: mensagem.texto |
| 146 | + }); |
| 147 | + console.log(nomes[socket.id] + ': ' + mensagem.texto + |
| 148 | + " na sala " + mensagem.sala + "."); |
| 149 | + }); |
| 150 | +}; |
| 151 | + |
| 152 | +// Nome explicativo |
| 153 | +function lidarEntradaDeSala(socket){ |
| 154 | + socket.on('entrar', function(sala) { |
| 155 | + var nomeSala = sala.novaSala.split(' '); |
| 156 | + var nomeSalaNovo = nomeSala[0].substring(0,3).toLowerCase(); |
| 157 | + if (nomeSalaNovo == "rpg"){ |
| 158 | + socket.broadcast.to(salaAtual[socket.id]).emit('mensagem', { |
| 159 | + texto: nomes[socket.id] + ' foi para a sala "' + sala.novaSala + '" jogar RPG.' |
| 160 | + }); |
| 161 | + socket.emit('mensagem', { |
| 162 | + texto: "Bem vindo(a) a uma sala de RPG! Você pode rolar um dado ao clicar no botão lá embaixo" |
| 163 | + }); |
| 164 | + }; |
| 165 | + socket.leave(salaAtual[socket.id]); |
| 166 | + entrarNaSala(socket, sala.novaSala); |
| 167 | + }); |
| 168 | +}; |
| 169 | + |
| 170 | +// Nome explicativo |
| 171 | +function lidarComVisitanteDesconectado(socket) { |
| 172 | + socket.on('disconnect', function() { |
| 173 | + socket.broadcast.to(salaAtual[socket.id]).emit('mensagem', { |
| 174 | + texto: nomes[socket.id] + " desconectou." |
| 175 | + }); |
| 176 | + socket.emit('mensagem', { |
| 177 | + texto: "Você foi desconectado." |
| 178 | + }); |
| 179 | + var nomeIndice = nomesUsados.indexOf(nomes[socket.id]); |
| 180 | + // Remove o nome da lista de nomes usados |
| 181 | + delete nomesUsados[nomeIndice]; |
| 182 | + // Remove o nome do usuário da lista de usuários |
| 183 | + delete nomes[socket.id]; |
| 184 | + }); |
| 185 | +}; |
| 186 | + |
| 187 | +//function lidarComUno(socket) |
| 188 | + |
0 commit comments