diff --git a/index.js b/index.js index 731d7f5..a2cb162 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ /* Força: um (livre) clone do jogo Forca - Copyright (C) 2020 luca0N! + Copyright (C) 2020-2021 luca0N! This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,20 +19,28 @@ */ const WebSocket = require('ws'); +const https = require('https'); const fs = require('fs'); -const Resposta = require('./resposta.js'); -const Cliente = require('./cliente.js'); -const Sala = require('./sala.js'); +const Query = require('./query.js'); +const Client = require('./client.js'); +const Room = require('./room.js'); const Util = require('./util.js'); const Pontos = require('./pontuação.js'); -var vars = JSON.parse(fs.readFileSync('config.json', 'UTF8')).variáveis; +var vars = JSON.parse(fs.readFileSync('config.json', 'UTF8')).vars; var versão = "v1.1"; -const wss = new WebSocket.Server({ port: vars["servidor.porta"] }); +const server = https.createServer({ + cert: fs.readFileSync('/etc/letsencrypt/live/luca0n.com/fullchain.pem'), + key: fs.readFileSync('/etc/letsencrypt/live/luca0n.com/privkey.pem') +}); + +const wss = new WebSocket.Server({ server }); + +server.listen(vars["server.port"]); var clientes = [], salas = []; @@ -43,31 +51,31 @@ var filtros = JSON.parse(fs.readFileSync('filtro.json', 'UTF8')); var ids = {}; -ids.pings = setInterval(verificarPings, vars["misc.tempo.pings"]); -ids.checarInativos = setInterval(checarInativos, vars["misc.tempo.checarInatividade"]); +ids.pings = setInterval(verificarPings, vars["misc.time.pings"]); +ids.checarInativos = setInterval(checarInativos, vars["misc.time.checkAfk"]); console.log('Disponível.'); wss.on('connection', ws => { //var end = ws._socket.remoteAddress; - let cliente = new Cliente(ws._socket.remoteAddress, undefined, ws); - cliente.opções = JSON.parse(JSON.stringify(vars["cliente.opções.padrão"])); // Definir opções padrão - console.log('Nova conexão! Fonte: ' + cliente.endereço); + let cliente = new Client(ws._socket.remoteAddress, undefined, ws); + cliente.opções = JSON.parse(JSON.stringify(vars["client.options.default"])); // Definir opções padrão + console.log('Nova conexão! Fonte: ' + cliente.address); let aguardandoEntrada = true; ws.on('message', msg => { - console.log(' <' + cliente.endereço + '> ' + msg); + console.log(' <' + cliente.address + '> ' + msg); try { resposta = JSON.parse(msg); } catch (e){ // A resposta enviada não está no formato JSON válido. - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "RESPOSTA_CORROMPIDA" ))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "RESPOSTA_CORROMPIDA" ))); return; } if (aguardandoEntrada){ aguardandoEntrada = false; - cliente.apelido = resposta.fonte.split('.')[1]; + cliente.apelido = resposta.source.split('.')[1]; // Problema #2: O apelido é válido? let apelidoRegex = /[^A-Za-z0-9_]/g; if ( @@ -76,79 +84,79 @@ wss.on('connection', ws => { || apelidoRegex.exec(cliente.apelido) !== null // O apelido contém algum caractere que não seja permitido? || Util.filtrarMensagem(cliente.apelido, filtros) != cliente.apelido // O apelido contém termos filtrados? ){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "NOME_ILEGAL" ))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "NOME_ILEGAL" ))); ws.terminate(); } } - let salaObj = cliente.sala !== undefined ? pesquisarSala(cliente.sala) : undefined; + let roomObj = cliente.sala !== undefined ? pesquisarSala(cliente.sala) : undefined; // Interpretar a mensagem do cliente. - switch (resposta.pedido){ - case "ENTRAR":{ + switch (resposta.request){ + case "JOIN":{ // Entrar em uma sala ou criar ela caso inexistente. // O parâmetro extra "sala" é necessário. Caso inexistente, retornar um erro ao cliente. - let sala = resposta.extra.sala, - salaNum, + let room = resposta.extra.room, + roomNo, adicionarCliente = false; - if (sala === undefined){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); + if (room === undefined){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); break; } // Problema #2: O apelido é válido? - let salaRegex = /[^a-z0-9]/g; + let roomRegex = /[^a-z0-9]/g; if ( - sala.length < 3 // O nome tem menos que três caracteres? - || sala.length > 8 // O nome tem mais que 16 caracteres? - || salaRegex.exec(sala) !== null // O nome contém algum caractere que não seja permitido? - || Util.filtrarMensagem(sala, filtros) != sala // O nome contém termos filtrados? + room.length < 3 // O nome tem menos que três caracteres? + || room.length > 8 // O nome tem mais que 16 caracteres? + || roomRegex.exec(room) !== null // O nome contém algum caractere que não seja permitido? + || Util.filtrarMensagem(room, filtros) != room // O nome contém termos filtrados? ){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "NOME_ILEGAL" ))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "NOME_ILEGAL" ))); ws.terminate(); } // Agora que verificamos que os parâmetros necessários foram providenciados, vamos verificar a existência da sala. - if (salaExiste(sala)){ - salaObj = pesquisarSala(sala); + if (salaExiste(room)){ + roomObj = pesquisarSala(room); // Encontrar a sala existente na lista de salas. for (var x = 0; x < salas.length; x++){ - if (salas[x].sala === sala){ + if (salas[x].sala === room){ //salas[x].clientes.push(cliente); - salaNum = x; + roomNo = x; adicionarCliente = true; - salaObj = salas[x]; + roomObj = salas[x]; break; } } // O IP do cliente está banido? - if (salaObj.banido(cliente.soquete.remoteAddress)){ - ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "BANIDO"))); + if (roomObj.banido(cliente.socket.remoteAddress)){ + ws.send(JSON.stringify(new Query("FATAL", "SERVER", "BANNED"))); return; } // A sala está em partida? - if (salaObj.estado === "EM_PARTIDA"){ - ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "SALA_EM_PARTIDA"))); + if (roomObj.estado === "IN_SESSION"){ + ws.send(JSON.stringify(new Query("FATAL", "SERVER", "ROOM_IN_SESSION"))); return; } // A sala está cheia? - let limiteJogadores = vars["sala.clientes.limite"]; - if (salaObj.clientes.length >= limiteJogadores){ + let limiteJogadores = vars["room.clients.max"]; + if (roomObj.clientes.length >= limiteJogadores){ // A sala está cheia. Retornar um código de erro ao jogador. - ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "SALA_CHEIA"))); + ws.send(JSON.stringify(new Query("FATAL", "SERVER", "ROOM_FULL"))); return; } // Gerar uma lista com os apelidos dos clientes conectados. let jogadores = []; - for (let x = 0; x < salaObj.clientes.length; x++){ - let jogadorApelido = salaObj.clientes[x].apelido; + for (let x = 0; x < roomObj.clientes.length; x++){ + let jogadorApelido = roomObj.clientes[x].apelido; // Verificar se já existe um usuário com o mesmo apelido na sala. if (jogadorApelido === cliente.apelido){ // Alertar o cliente. - ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "APELIDO_EXISTENTE"))); + ws.send(JSON.stringify(new Query("FATAL", "SERVER", "NICKNAME_IN_USE"))); // Fechar a conexão. ws.terminate(); return; @@ -158,91 +166,91 @@ wss.on('connection', ws => { } // Retornar um código de sucesso ao cliente, incluindo a lista de jogadores conectados, estado e o líder da sala. - ws.send(JSON.stringify(new Resposta("SUCESSO", "SERVIDOR", "SALA_EXISTENTE", { opções: salaObj.opções, líder: salaObj.líder, estado: salaObj.estado, jogadores: jogadores }))); + ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "ROOM_EXISTS", { opções: roomObj.opções, líder: roomObj.líder, estado: roomObj.estado, jogadores: jogadores }))); } else { // A sala não existe. Vamos criar ela e adicionar o usuário nela. - // salas.push(new Sala(sala, [cliente])); + // salas.push(new Room(sala, [cliente])); // Retornar um código de sucesso ao cliente. - ws.send(JSON.stringify(new Resposta("SUCESSO", "SERVIDOR", "SALA_CRIADA"))); + ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "ROOM_CREATED"))); } - cliente.sala = sala; + cliente.sala = room; clientes.push(cliente); - if (salaObj !== undefined){ - salas[salaNum].clientes.push(cliente); - salaObj = salas[salaNum]; - } else{ - let salaNova = new Sala(sala, [cliente], undefined, undefined, JSON.parse(JSON.stringify(vars["sala.opções.padrão"]))); + if (roomObj !== undefined){ + salas[roomNo].clientes.push(cliente); + roomObj = salas[roomNo]; + } else { + let salaNova = new Room(room, [cliente], undefined, undefined, JSON.parse(JSON.stringify(vars["room.options.default"]))); - salaNova.pontuaçãoMeta = vars['sala.pontos.pontuaçãoMeta']; + salaNova.pontuaçãoMeta = vars['room.score.target']; salas.push(salaNova); - salaObj = salaNova; + roomObj = salaNova; } - console.log(' [' + cliente.endereço + '] Conexão estabelecida.'); + console.log(' [' + cliente.address + '] Conexão estabelecida.'); // Alertar todos os jogadores sobre a entrada do jogador. - alertarClientesEvento('EVENTO_JOGADOR_ENTROU', sala, { apelido:cliente.apelido }); - if (salaObj !== undefined) + alertarClientesEvento('EVENT_PLAYER_JOINED', room, { apelido:cliente.apelido }); + if (roomObj !== undefined) // A sala possui a quantidade suficiente de jogadores para iniciar? - verificarPossibilidadeDePartida(salaObj); + verificarPossibilidadeDePartida(roomObj); break; } case "ENVIAR_MENSAGEM":{ // Verificar se a mensagem desejada foi providenciada pelo cliente. if (resposta.extra.mensagem === undefined){ // A mensagem não foi providenciada pelo cliente. Retornar uma resposta de erro para o cliente. - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "PARAMETRO_FALTANDO"))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "PARAMETRO_FALTANDO"))); return; } // Verificar se a mensagem excede o limite de caracteres proposto pelo cliente. if (resposta.extra.mensagem.length > 128) { // Cancelar este pedido e retornar uma mensagem de erro para o cliente. - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "MENSAGEM_MUITO_LONGA"))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "MENSAGEM_MUITO_LONGA"))); return; } cliente.uas = Date.now(); var mensagem = '<' + cliente.apelido + '> ' + resposta.extra.mensagem; // Enviar a mensagem para todos os clientes. - alertarClientesEvento('EVENTO_JOGADOR_MENSAGEM', cliente.sala, { apelido: cliente.apelido, mensagem: mensagem }); + alertarClientesEvento('EVENT_PLAYER_MESSAGE', cliente.sala, { apelido: cliente.apelido, mensagem: mensagem }); break; } case "INICIAR_PARTIDA":{ // O cliente que está tentando iniciar a partida é do líder? - if (salaObj.líder !== cliente.apelido){ + if (roomObj.líder !== cliente.apelido){ // Este cliente não é do líder da sala. Retornar um erro ao cliente e cancelar a tarefa. - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO"))); break; } // A sala já está em partida? - if (salaObj.estado === "EM_PARTIDA"){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_EM_PARTIDA"))); + if (roomObj.estado === "IN_SESSION"){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "IN_SESSION"))); break; } cliente.uas = Date.now(); - salaObj.uas = Date.now(); + roomObj.uas = Date.now(); // Agora que verificamos que o cliente é do líder da sala, vamos enviar a todos os usuários um evento alertando sobre o início da partida. - salaObj.novaPartida(); + roomObj.novaPartida(); - alertarClientesEvento("EVENTO_SALA_ESTADO_ATUALIZADO", cliente.sala, { estado: salaObj.estado }); + alertarClientesEvento("EVENT_ROOM_STATUS_CHANGED", cliente.sala, { estado: roomObj.estado }); // E vamos alertar todos os clientes sobre o jogador escolhido. - alertarClientesEvento("EVENTO_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: salaObj.vezDe }); + alertarClientesEvento("EVENT_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: roomObj.vezDe }); break; } case "ESCOLHER_PALAVRA":{ // A sala está em partida? - if (salaObj.estado !== "EM_PARTIDA"){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_ESTADO_NÃO_EM_PARTIDA"))); + if (roomObj.estado !== "IN_SESSION"){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SALA_ESTADO_NÃO_EM_PARTIDA"))); break; } // Verificar se é realmente a vez do cliente que enviou este pedido. - if (salaObj.vezDe !== cliente.apelido){ + if (roomObj.vezDe !== cliente.apelido){ // Não é a vez deste cliente! - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO"))); break; } @@ -250,126 +258,126 @@ wss.on('connection', ws => { // A palavra enviada está vazia? if (resposta.extra.palavra.replace(/ /g, "") === ""){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "PALAVRA_OU_TEMA_PROIBIDO"))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "PALAVRA_OU_TEMA_PROIBIDO"))); return; } // Verificar tamanho da palavra. - if (resposta.extra.palavra.length < vars["palavra.tamanho.mín"] - || resposta.extra.palavra.length > vars["palavra.tamanho.máx"]){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO", { erroDescrição: "PALAVRA_TAMANHO_INVÁLIDO" }))); + if (resposta.extra.palavra.length < vars["game.term.size.min"] + || resposta.extra.palavra.length > vars["game.term.size.max"]){ + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "PALAVRA_TAMANHO_INVÁLIDO" }))); return; } // Verificar tamanho do tema. - if (resposta.extra.tema.length < vars["tema.tamanho.mín"] - || resposta.extra.tema.length > vars["tema.tamanho.máx"]){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "TEMA_TAMANHO_INVÁLIDO" }))); + if (resposta.extra.tema.length < vars["game.theme.size.min"] + || resposta.extra.tema.length > vars["game.theme.size.max"]){ + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "TEMA_TAMANHO_INVÁLIDO" }))); return; } // Verificar palavra via expressão regular. let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g'); if (palavraRegexIlegal.test(resposta.extra.palavra)){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "PALAVRA_CARACTERES_ILEGAIS" }))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "PALAVRA_CARACTERES_ILEGAIS" }))); return; } cliente.uas = Date.now(); - salaObj.uas = Date.now(); + roomObj.uas = Date.now(); // A sala está com o filtro de temas adultos habilitado? - if (salaObj.opções["filtro.temasAdultos.habilitado"]){ + if (roomObj.opções["game.filter.matureThemes.enabled"]){ // Verificar se esta palavra está filtrada. let palavraFiltrada = Util.filtrarMensagem(resposta.extra.palavra, filtros); let temaFiltrado = Util.filtrarMensagem(resposta.extra.tema, filtros); // Caso há variação da palavra/tema, então a palavra/tema escolhido contém um ou mais termos impróprios. if (palavraFiltrada !== resposta.extra.palavra || temaFiltrado !== resposta.extra.tema){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "PALAVRA_OU_TEMA_PROIBIDO"))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "PALAVRA_OU_TEMA_PROIBIDO"))); break; } } // Redefinir tin (contagem de tentativas incorretas). - alterarTin(salaObj, 0); + alterarTin(roomObj, 0); - salaObj.jpa = cliente.apelido; + roomObj.jpa = cliente.apelido; // Escolher um jogador aleatório para escolher a primeira letra. - var clienteEscolhido = salaObj.gerarJogadorAleatório(); + var clienteEscolhido = roomObj.gerarJogadorAleatório(); - salaObj.palavra = resposta.extra.palavra.toUpperCase(); - salaObj.definirPalavraLetrasQtd(); - salaObj.termoVezDe = salaObj.próxItemJf === undefined ? salaObj.jf[0] : salaObj.próxItemJf(); + roomObj.palavra = resposta.extra.palavra.toUpperCase(); + roomObj.definirPalavraLetrasQtd(); + roomObj.termoVezDe = roomObj.próxItemJf === undefined ? roomObj.jf[0] : roomObj.próxItemJf(); - if (salaObj.termoVezDe === salaObj.vezDe) - salaObj.termoVezDe = salaObj.próxItemJf(); + if (roomObj.termoVezDe === roomObj.vezDe) + roomObj.termoVezDe = roomObj.próxItemJf(); - salaObj.estadoTermo = "AGUARDANDO_LETRA"; + roomObj.estadoTermo = "AGUARDANDO_LETRA"; // Vamos alertar todos os clientes sobre este evento. - alertarClientesEvento("EVENTO_PALAVRA_ESCOLHIDA", cliente.sala, { palavra: { tamanho: resposta.extra.palavra.length, espaços: salaObj.procurar(' '), hífens: salaObj.procurar('-') }, tema: resposta.extra.tema, termoVezDe: salaObj.termoVezDe }); + alertarClientesEvento("EVENT_PALAVRA_ESCOLHIDA", cliente.sala, { palavra: { tamanho: resposta.extra.palavra.length, espaços: roomObj.procurar(' '), hífens: roomObj.procurar('-') }, tema: resposta.extra.tema, termoVezDe: roomObj.termoVezDe }); break; } case "ENVIAR_TERMO":{ // A sala está em partida? - if (salaObj.estado !== "EM_PARTIDA"){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_ESTADO_NÃO_EM_PARTIDA"))); + if (roomObj.estado !== "IN_SESSION"){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SALA_ESTADO_NÃO_EM_PARTIDA"))); break; } // Verificar se é a vez do cliente que enviou este pedido. - if (salaObj.termoVezDe !== cliente.apelido){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "AGUARDE_SUA_VEZ"))); + if (roomObj.termoVezDe !== cliente.apelido){ + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "AGUARDE_SUA_VEZ"))); break; } // Verificar termo via expressão regular. let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g'); if (palavraRegexIlegal.test(resposta.extra.termo)){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_CARACTERES_ILEGAIS" }))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_CARACTERES_ILEGAIS" }))); break; } // Verificar se o termo enviado possui termos filtrados CASO a sala tinha o filtro habilitado - if (salaObj.opções["filtro.temasAdultos.habilitado"] && Util.filtrarMensagem(resposta.extra.termo, filtros) !== resposta.extra.termo){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_IMPRÓPRIO" }))); + if (roomObj.opções["game.filter.matureThemes.enabled"] && Util.filtrarMensagem(resposta.extra.termo, filtros) !== resposta.extra.termo){ + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_IMPRÓPRIO" }))); break; } // Verificar o tipo do termo enviado. let letra = resposta.extra.termo.length === 1; - let salaClientes = salaObj.clientes; - let e = Util.receberClientePorApelido(salaObj, salaObj.vezDe); // escolhedor + let salaClientes = roomObj.clientes; + let e = Util.receberClientePorApelido(roomObj, roomObj.vezDe); // escolhedor // O termo está vazio? if (resposta.extra.termo.replace(/ /g, "") === ""){ - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_VAZIO" }))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_VAZIO" }))); return; } // O jogador deseja pular? - if (salaObj.estadoTermo === "AGUARDANDO_TERMO" && + if (roomObj.estadoTermo === "AGUARDANDO_TERMO" && resposta.extra.termo === '?'){ - alertarClientesEvento("EVENTO_JOGADOR_PULOU_TERMO", cliente.sala, { jogador: cliente.apelido }); + alertarClientesEvento("EVENT_JOGADOR_PULOU_TERMO", cliente.sala, { jogador: cliente.apelido }); // Escolher outro jogador. - escolherJogadorTermo(salaObj); + escolherJogadorTermo(roomObj); return; } // A sala está aceitando apenas termos? - if (salaObj.estadoTermo !== "AGUARDANDO_LETRA" && letra){ + if (roomObj.estadoTermo !== "AGUARDANDO_LETRA" && letra){ // A sala não está esperando letras. - ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO_LETRA_INESPERADA"))); + ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO_LETRA_INESPERADA"))); break; } cliente.uas = Date.now(); - salaObj.uas = Date.now(); + roomObj.uas = Date.now(); resposta.extra.termo = resposta.extra.termo.toUpperCase(); - let resultadoTermo = salaObj.processarTermo(resposta.extra.termo); + let resultadoTermo = roomObj.processarTermo(resposta.extra.termo); let lp = resultadoTermo.letrasPreenchidas; let r = resultadoTermo.resultado; @@ -379,186 +387,186 @@ wss.on('connection', ws => { dife = 0; // diferença da nova pontuação do jogador que enviou a palavra atual switch (r){ case "LETRA_JÁ_ESCOLHIDA":{ - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); tentarNovamente = true; break; } case "PALAVRA_JÁ_ESCOLHIDA":{ - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); tentarNovamente = true; break; } case "LETRAS_PREENCHIDAS":{ - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r, ldc: salaObj.ldc }); + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r, ldc: roomObj.ldc }); // Também acrescentar pontuação ao jogador. for (let x = 0; x < lp; x++){ - dif += cliente.acrescentarPontos(Pontos.EVENTO_JOGADOR_LETRA_ACERTADA); - dife += e.acrescentarPontos(Pontos.EVENTO_JOGADOR_SALA_LETRA_ACERTADA); + dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_LETRA_ACERTADA); + dife += e.acrescentarPontos(Pontos.EVENT_JOGADOR_SALA_LETRA_ACERTADA); } // Alertar os clientes da nova pontuação deste jogador. - alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); - alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: e.apelido, pontos: e.pontos, diferença: dife }); + alertarClientesEvento("EVENT_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); + alertarClientesEvento("EVENT_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: e.apelido, pontos: e.pontos, diferença: dife }); break; } case "LETRA_INEXISTENTE":{ - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); - if (alterarTin(salaObj)) return; + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r }); + if (alterarTin(roomObj)) return; break; } case "PALAVRA_CORRETA":{ - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { acertou: true, palavra: salaObj.palavra, resultado: r }); + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { acertou: true, palavra: roomObj.palavra, resultado: r }); // Acrescentar pontos ao jogador por acertar a palavra. // Pontos pelos campos que antes estavam vazios e pontos por acertar a palavra. - let extra = salaObj.estadoTermo === 'AGUARDANDO_LETRA'; // caso verdadeiro, dar pontos extras por acertar a palavra cedo + let extra = roomObj.estadoTermo === 'AGUARDANDO_LETRA'; // caso verdadeiro, dar pontos extras por acertar a palavra cedo for (let x = 0; x < lp; x++){ - dif += cliente.acrescentarPontos(extra ? Pontos.EVENTO_JOGADOR_LETRA_ACERTADA_CEDO : Pontos.EVENTO_JOGADOR_LETRA_ACERTADA); - dife += e.acrescentarPontos(extra ? Pontos.EVENTO_JOGADOR_SALA_LETRA_ACERTADA_CEDO : Pontos.EVENTO_JOGADOR_SALA_LETRA_ACERTADA); + dif += cliente.acrescentarPontos(extra ? Pontos.EVENT_JOGADOR_LETRA_ACERTADA_CEDO : Pontos.EVENT_JOGADOR_LETRA_ACERTADA); + dife += e.acrescentarPontos(extra ? Pontos.EVENT_JOGADOR_SALA_LETRA_ACERTADA_CEDO : Pontos.EVENT_JOGADOR_SALA_LETRA_ACERTADA); } - dif += cliente.acrescentarPontos(Pontos.EVENTO_JOGADOR_PALAVRA_ACERTADA); - dife += e.acrescentarPontos(Pontos.EVENTO_JOGADOR_SALA_PALAVRA_ACERTADA); + dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_PALAVRA_ACERTADA); + dife += e.acrescentarPontos(Pontos.EVENT_JOGADOR_SALA_PALAVRA_ACERTADA); // Alertar os clientes da nova pontuação deste jogador. - alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); - alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: e.apelido, pontos: e.pontos, diferença: dife }); + alertarClientesEvento("EVENT_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); + alertarClientesEvento("EVENT_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: e.apelido, pontos: e.pontos, diferença: dife }); // Verificar se um jogador atingiu a meta de pontos. - let vencedor = salaObj.receberVencedor(); + let vencedor = roomObj.receberVencedor(); if (vencedor !== null){ // Há um vencedor; alertar os clientes na sala que houve um vencedor. - alertarClientesEvento("EVENTO_JOGADOR_VITÓRIA", cliente.sala, { jogador: vencedor.apelido }); + alertarClientesEvento("EVENT_JOGADOR_VITÓRIA", cliente.sala, { jogador: vencedor.apelido }); // Encerrar esta partida. - verificarPossibilidadeDePartida(salaObj, true); + verificarPossibilidadeDePartida(roomObj, true); return; } // Escolher outro jogador para escolher a palavra. - salaObj.novaRodada(); + roomObj.novaRodada(); // E vamos alertar todos os clientes sobre o jogador escolhido. - alertarClientesEvento("EVENTO_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: salaObj.vezDe }); + alertarClientesEvento("EVENT_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: roomObj.vezDe }); return; } case "PALAVRA_INCORRETA":{ - alterarTin(salaObj); + alterarTin(roomObj); // Penalizar o jogador caso ele tenha errado a palavra cedo. - if (salaObj.estadoTermo === 'AGUARDANDO_LETRA') + if (roomObj.estadoTermo === 'AGUARDANDO_LETRA') for (let x = 0; x < resposta.extra.termo.length; x++) - dif += cliente.acrescentarPontos(Pontos.EVENTO_JOGADOR_LETRA_ERRADA_CEDO); - alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); + dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_LETRA_ERRADA_CEDO); + alertarClientesEvento("EVENT_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); - alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { acertou: false, palavra: resposta.extra.termo, resultado: r }); + alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { acertou: false, palavra: resposta.extra.termo, resultado: r }); break; } } - escolherJogadorTermo(salaObj, tentarNovamente? cliente.apelido : undefined); + escolherJogadorTermo(roomObj, tentarNovamente? cliente.apelido : undefined); // Enviar um alerta para todos os clientes da sala. // Não é necessário especificar o apelido do jogador. Os clientes já vão estar esperando uma resposta do cliente em questão. - /*alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo });*/ + /*alertarClientesEvento("EVENT_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo });*/ break; } case "CHUTAR_CLIENTE":{ // Problema #60: O cliente que enviou este pedido é o líder da sala? - if (salaObj.líder !== cliente.apelido){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); + if (roomObj.líder !== cliente.apelido){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO"))); return; } let jogador = resposta.extra.jogador; if (jogador === undefined){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); break; } cliente.uas = Date.now(); // Encerrar conexão com o cliente alvo. - let clienteAlvo = Util.receberClientePorApelido(salaObj, jogador); - alertarClientesEvento("EVENTO_CLIENTE_CHUTADO", cliente.sala, { cliente: clienteAlvo.apelido }); + let clienteAlvo = Util.receberClientePorApelido(roomObj, jogador); + alertarClientesEvento("EVENT_CLIENTE_CHUTADO", cliente.sala, { cliente: clienteAlvo.apelido }); // Remover o cliente da sala. - clienteAlvo.soquete.terminate(); + clienteAlvo.socket.terminate(); break; } case "BANIR_CLIENTE":{ // Problema #60: O cliente que enviou este pedido é o líder da sala? - if (salaObj.líder !== cliente.apelido){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); + if (roomObj.líder !== cliente.apelido){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO"))); return; } let jogador = resposta.extra.jogador; if (jogador === undefined){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", undefined, { motivo: "PARÂMETRO_FALTANDO" }))); + ws.send(JSON.stringify(new Query("ERRO", "SERVER", undefined, { motivo: "PARÂMETRO_FALTANDO" }))); break; } cliente.uas = Date.now(); // Encerrar conexão com o cliente alvo. - let clienteAlvo = Util.receberClientePorApelido(salaObj, jogador); - alertarClientesEvento("EVENTO_CLIENTE_BANIDO", cliente.sala, { cliente: clienteAlvo.apelido }); + let clienteAlvo = Util.receberClientePorApelido(roomObj, jogador); + alertarClientesEvento("EVENT_CLIENTE_BANIDO", cliente.sala, { cliente: clienteAlvo.apelido }); // Remover o cliente da sala. - clienteAlvo.soquete.terminate(); + clienteAlvo.socket.terminate(); // Adicionar o cliente na lista de banidos da sala. - salaObj.banidos.push(clienteAlvo.soquete.remoteAddress); + roomObj.banidos.push(clienteAlvo.socket.remoteAddress); break; } - case "ALTERAR_OPÇÃO":{ - let opção = resposta.extra.opção, - valor = resposta.extra.valor, - alvo = resposta.extra.alvo; - if (opção === undefined || valor === undefined || alvo === undefined){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); + case "UPDATE_OPTION":{ + let option = resposta.extra.option, + value = resposta.extra.value, + target = resposta.extra.target; + if (option === undefined || value === undefined || target === undefined){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", undefined, { motivo: "PARÂMETRO_FALTANDO"}))); break; } cliente.uas = Date.now(); // Definir opção. - if (resposta.extra.alvo === "CLIENTE"){ - cliente.opções[opção] = valor; + if (resposta.extra.target === "CLIENT"){ + cliente.opções[option] = value; - ws.send(JSON.stringify(new Resposta("SUCESSO", "SERVIDOR", "OPÇÃO_ALTERADA", { opção: opção, novoValor: cliente.opções[opção] }))); - } else if (resposta.extra.alvo === "SALA") { + ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "OPTION_UPDATED", { option: option, newValue: cliente.opções[option] }))); + } else if (resposta.extra.target === "ROOM") { // O cliente que está enviando este pedido é o líder da sala? - if (salaObj.líder !== cliente.apelido){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); + if (roomObj.líder !== cliente.apelido){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO"))); break; } // A sala já está em partida? - if (salaObj.estado === "EM_PARTIDA"){ - ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_EM_PARTIDA"))); + if (roomObj.estado === "IN_SESSION"){ + ws.send(JSON.stringify(new Query("ERRO", "SERVER", "ROOM_IN_SESSION"))); break; } // Agora que verificamos que este cliente é o líder, vamos alterar a configuração da sala. - salaObj.opções[opção] = valor; - ws.send(JSON.stringify(new Resposta("SUCESSO", "SERVIDOR", "OPÇÃO_ALTERADA", { alvo: resposta.extra.alvo, opção: opção, novoValor: salaObj.opções[opção] }))); + roomObj.opções[option] = value; + ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "OPTION_UPDATED", { target: resposta.extra.target, option: option, newValue: roomObj.opções[option] }))); // Vamos alertar os clientes a opção alterada. - alertarClientesEvento("EVENTO_SALA_OPÇÃO_ALTERADA", cliente.sala, { opção: opção, valor: valor}); + alertarClientesEvento("EVENT_ROOM_OPTION_CHANGED", cliente.sala, { option: option, value: value}); } break; } case "PING":{ // Adicionar tempo para a lista de pings do cliente. cliente.pings.push(Date.now()); - ws.send(JSON.stringify(new Resposta("SUCESSO", "SERVIDOR", "PONG", { tempo: resposta.extra.tempo }))); + ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "PONG", { tempo: resposta.extra.tempo }))); break; } } }); ws.on('error', erro => { - console.log(' [' + cliente.endereço + '] Conexão fechada devido a erro.'); + console.log(' [' + cliente.address + '] Conexão fechada devido a erro.'); // Remover o cliente da lista de clientes. - removerCliente(cliente.endereço); + removerCliente(cliente.address); }); ws.on('close', function(){ - console.log(' [' + cliente.endereço + '] Conexão fechada.'); + console.log(' [' + cliente.address + '] Conexão fechada.'); // Remover o cliente da lista de clientes. removerCliente(cliente, 'MOTIVO_CONEXÃO_FECHADA'); }); - let resposta = new Resposta("TESTE_CON", "SERVIDOR"); - ws.send(JSON.stringify(resposta)); + let resposta = new Query("TEST_CON", "SERVER"); + ws.send(JSON.stringify(resposta)); }); /** @@ -572,7 +580,7 @@ function removerCliente(cliente, motivo){ // Verifica se o cliente está em uma sala. if (sala === undefined){ - //cliente.soquete.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_SALA"))); + //cliente.socket.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_SALA"))); return -1; } @@ -588,18 +596,18 @@ function removerCliente(cliente, motivo){ let líder = sala.líder === cliente.apelido; if (líder) // Caso o líder sair da sala, então apagar a sala. - alertarClientesEvento('EVENTO_LÍDER_SAIU', sala.sala, {}); + alertarClientesEvento('EVENT_LÍDER_SAIU', sala.sala, {}); // Este cliente está na sala? //if (sala.clientes.indexOf(cliente.apelido) === -1) //return; // Alertar os clientes na sala sobre o jogador que está sendo removido caso um motivo tenha sido especificado. - alertarClientesEvento('EVENTO_JOGADOR_SAIU', cliente.sala, { apelido: cliente.apelido, motivo: motivo }); + alertarClientesEvento('EVENT_JOGADOR_SAIU', cliente.sala, { apelido: cliente.apelido, motivo: motivo }); if(líder) // Remover todos os jogadores da sala. for (let x = sala.clientes.length; x > 0; x--) - sala.clientes[x-1].soquete.terminate(); + sala.clientes[x-1].socket.terminate(); // Remover o cliente da lista de clientes da sala. let índice = sala.clientes.indexOf(cliente); @@ -615,7 +623,7 @@ function removerCliente(cliente, motivo){ // Escolher outro jogador. sala.novaRodada(); // E vamos alertar todos os clientes sobre o jogador escolhido. - alertarClientesEvento("EVENTO_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: sala.vezDe }); + alertarClientesEvento("EVENT_JOGADOR_ESCOLHIDO", cliente.sala, { jogador: sala.vezDe }); } // Este jogador estava escolhendo um termo? else if (sala.clientes.length !== 1 && sala.termoVezDe === cliente.apelido){ @@ -677,14 +685,14 @@ function alertarClientesEvento(evento, salaNome, extra){ // Evitar problemas de formatação com colchetes. e.mensagem = e.mensagem.replace(/\[/g, "\\[") .replace(/\]/g, "\\]"); - if (sala.clientes[x].opções["bate-papo.filtro.habilitado"]){ + if (sala.clientes[x].opções["chat.filter.enabled"]){ if (msgFiltrada === null) // Evitar de filtrar a mensagem caso ela já tenha sido filtrada. msgFiltrada = Util.filtrarMensagem(e.mensagem, filtros); e.mensagem = msgFiltrada; } } - sala.clientes[x].soquete.send(JSON.stringify(new Resposta("EVENTO", "SERVIDOR", evento.substring(7), e))); + sala.clientes[x].socket.send(JSON.stringify(new Query("EVENT", "SERVER", evento.substring(6), e))); } } @@ -698,16 +706,16 @@ function alertarClienteEvento(evento, salaNome, extra, cliente){ for (let x = 0; x < sala.clientes.length; x++){ if (sala.clientes[x].apelido === cliente.apelido){ let mensagem = '<' + extra.apelido + '> ' + extra.mensagem; - sala.clientes[x].soquete.send(JSON.stringify(new Resposta("EVENTO", "SERVIDOR", evento.substring(7), extra))); + sala.clientes[x].socket.send(JSON.stringify(new Query("EVENT", "SERVER", evento.substring(7), extra))); break; } } } /** - * Pesquisa por uma sala com o nome desejado e retorna um objeto Sala correspondente. + * Pesquisa por uma sala com o nome desejado e retorna um objeto Room correspondente. * @param string sala O nome da sala. - * @returns Sala O objeto da sala. + * @returns Room O objeto da sala. * @since 12 de outubro de 2020, 19:49 (UTC -03:00). */ function pesquisarSala(sala){ @@ -718,19 +726,19 @@ function pesquisarSala(sala){ /** * Verifica se há a possibilidade de iniciar uma nova partida baseado na quantidade de clientes conectados à sala especificada. Caso exista essa possibilidade, então alterar o estado da sala e alertar todos os jogadores (incluindo o líder) sobre isso. - * @param Sala sala O objeto da sala. + * @param Room sala O objeto da sala. * @return boolean Verdadeiro caso exista a possibilidade, falso caso contrário. * @since 14 de outubro de 2020. */ function verificarPossibilidadeDePartida(sala, forçar){ - if (sala.estado === "EM_PARTIDA" && sala.clientes.length > 1 && !forçar) + if (sala.estado === "IN_SESSION" && sala.clientes.length > 1 && !forçar) return true; // Alterar o estado da sala. sala.estado = sala.clientes.length === 1 ? "AGUARDANDO_JOGADORES" : "AGUARDANDO_LÍDER"; // Alertar os clientes. - alertarClientesEvento("EVENTO_SALA_ESTADO_ATUALIZADO", sala.sala, { estado: sala.estado }); + alertarClientesEvento("EVENT_ROOM_STATUS_CHANGED", sala.sala, { estado: sala.estado }); return sala.clientes.length > 1; } @@ -746,15 +754,15 @@ function alterarTin(sala, valor){ sala.tin++; else sala.tin = valor; - alertarClientesEvento("EVENTO_TIN_ATUALIZADO", sala.sala, { tin: sala.tin }); + alertarClientesEvento("EVENT_TIN_ATUALIZADO", sala.sala, { tin: sala.tin }); // Tin máximo atingido? - if (sala.tin >= vars['sala.tin.limite']){ - alertarClientesEvento("EVENTO_TIN_MÁXIMO_ATINGIDO", sala.sala, { palavra: sala.palavra }); + if (sala.tin >= vars['room.tin.max']){ + alertarClientesEvento("EVENT_TIN_MÁXIMO_ATINGIDO", sala.sala, { palavra: sala.palavra }); // Nova rodada. // Escolher outro jogador para escolher a palavra. sala.novaRodada(); // E vamos alertar todos os clientes sobre o jogador escolhido. - alertarClientesEvento("EVENTO_JOGADOR_ESCOLHIDO", sala.sala, { jogador: sala.vezDe }); + alertarClientesEvento("EVENT_JOGADOR_ESCOLHIDO", sala.sala, { jogador: sala.vezDe }); return true; } } @@ -780,7 +788,7 @@ function escolherJogadorTermo(sala, jogador){ if (possívelDescoberta) sala.estadoTermo = "AGUARDANDO_TERMO"; - alertarClientesEvento("EVENTO_JOGADOR_ESCOLHIDO_TERMO", sala.sala, { jogador: ja, tipo: sala.possívelDescoberta() ? "TERMO" : "LETRA" }); + alertarClientesEvento("EVENT_JOGADOR_ESCOLHIDO_TERMO", sala.sala, { jogador: ja, tipo: sala.possívelDescoberta() ? "TERMO" : "LETRA" }); } /** @@ -795,11 +803,11 @@ function verificarPings(){ pings.splice(0, 1); let delta = Date.now() - pings[pings.length - 1], - máx = vars["cliente.ping.tempoMáximo"]; + máx = vars["client.ping.time.max"]; if (delta >= máx){ - console.log("[" + cliente.endereço + "] O cliente não enviou pings recentemente. Fechando conexão."); - cliente.soquete.terminate(); + console.log("[" + cliente.address + "] O cliente não enviou pings recentemente. Fechando conexão."); + cliente.socket.terminate(); } } } @@ -813,24 +821,24 @@ function checarInativos(){ // Jogadores // /////////////// for (let x = 0; x < clientes.length; x++){ - if (Date.now() - clientes[x].uas >= vars["cliente.uas.limite"]){ + if (Date.now() - clientes[x].uas >= vars["client.uas.max"]){ console.log("[" + clientes[x].endereço + "] O jogador parece estar inativo. Fechando conexão."); // Alertar os clientes. - alertarClientesEvento("EVENTO_JOGADOR_CHUTADO_POR_INATIVIDADE", clientes[x].sala, { jogador: clientes[x].apelido }); - clientes[x].soquete.terminate(); + alertarClientesEvento("EVENT_JOGADOR_CHUTADO_POR_INATIVIDADE", clientes[x].sala, { jogador: clientes[x].apelido }); + clientes[x].socket.terminate(); } } /////////// - // Salas // + // Rooms // /////////// for (let x = 0; x < salas.length; x++) - if (Date.now() - salas[x].uas >= vars["sala.uas.limite"]){ + if (Date.now() - salas[x].uas >= vars["room.uas.max"]){ console.log(salas[x].sala + ": esta sala parece estar inativa. Removendo ela."); // Esta sala está inativa. Alertar aos clientes de que eles serão desconectados desta sala por inatividade. - alertarClientesEvento("EVENTO_SALA_INATIVA", salas[x].sala); + alertarClientesEvento("EVENT_SALA_INATIVA", salas[x].sala); // Terminar conexão com o líder, que automaticamente irá desconectar todos da sala. - Util.receberClientePorApelido(salas[x], salas[x].líder).soquete.terminate(); + Util.receberClientePorApelido(salas[x], salas[x].líder).socket.terminate(); } }