Translate names

This commit is contained in:
luca0N! 2021-08-16 22:12:55 -03:00
parent e93b425107
commit 18edf28ed8
Signed by: luca0N
GPG Key ID: 2E7B4655CF16D7D6
1 changed files with 212 additions and 204 deletions

414
index.js
View File

@ -1,6 +1,6 @@
/* /*
Força: um (livre) clone do jogo Forca 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 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 it under the terms of the GNU General Public License as published by
@ -19,20 +19,28 @@
*/ */
const WebSocket = require('ws'); const WebSocket = require('ws');
const https = require('https');
const fs = require('fs'); const fs = require('fs');
const Resposta = require('./resposta.js'); const Query = require('./query.js');
const Cliente = require('./cliente.js'); const Client = require('./client.js');
const Sala = require('./sala.js'); const Room = require('./room.js');
const Util = require('./util.js'); const Util = require('./util.js');
const Pontos = require('./pontuação.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"; 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 = [], var clientes = [],
salas = []; salas = [];
@ -43,31 +51,31 @@ var filtros = JSON.parse(fs.readFileSync('filtro.json', 'UTF8'));
var ids = {}; var ids = {};
ids.pings = setInterval(verificarPings, vars["misc.tempo.pings"]); ids.pings = setInterval(verificarPings, vars["misc.time.pings"]);
ids.checarInativos = setInterval(checarInativos, vars["misc.tempo.checarInatividade"]); ids.checarInativos = setInterval(checarInativos, vars["misc.time.checkAfk"]);
console.log('Disponível.'); console.log('Disponível.');
wss.on('connection', ws => { wss.on('connection', ws => {
//var end = ws._socket.remoteAddress; //var end = ws._socket.remoteAddress;
let cliente = new Cliente(ws._socket.remoteAddress, undefined, ws); let cliente = new Client(ws._socket.remoteAddress, undefined, ws);
cliente.opções = JSON.parse(JSON.stringify(vars["cliente.opções.padrão"])); // Definir opções padrão cliente.opções = JSON.parse(JSON.stringify(vars["client.options.default"])); // Definir opções padrão
console.log('Nova conexão! Fonte: ' + cliente.endereço); console.log('Nova conexão! Fonte: ' + cliente.address);
let aguardandoEntrada = true; let aguardandoEntrada = true;
ws.on('message', msg => { ws.on('message', msg => {
console.log(' <' + cliente.endereço + '> ' + msg); console.log(' <' + cliente.address + '> ' + msg);
try { try {
resposta = JSON.parse(msg); resposta = JSON.parse(msg);
} catch (e){ } catch (e){
// A resposta enviada não está no formato JSON válido. // 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; return;
} }
if (aguardandoEntrada){ if (aguardandoEntrada){
aguardandoEntrada = false; aguardandoEntrada = false;
cliente.apelido = resposta.fonte.split('.')[1]; cliente.apelido = resposta.source.split('.')[1];
// Problema #2: O apelido é válido? // Problema #2: O apelido é válido?
let apelidoRegex = /[^A-Za-z0-9_]/g; let apelidoRegex = /[^A-Za-z0-9_]/g;
if ( 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? || 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? || 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(); 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. // Interpretar a mensagem do cliente.
switch (resposta.pedido){ switch (resposta.request){
case "ENTRAR":{ case "JOIN":{
// Entrar em uma sala ou criar ela caso inexistente. // Entrar em uma sala ou criar ela caso inexistente.
// O parâmetro extra "sala" é necessário. Caso inexistente, retornar um erro ao cliente. // O parâmetro extra "sala" é necessário. Caso inexistente, retornar um erro ao cliente.
let sala = resposta.extra.sala, let room = resposta.extra.room,
salaNum, roomNo,
adicionarCliente = false; adicionarCliente = false;
if (sala === undefined){ if (room === 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; break;
} }
// Problema #2: O apelido é válido? // Problema #2: O apelido é válido?
let salaRegex = /[^a-z0-9]/g; let roomRegex = /[^a-z0-9]/g;
if ( if (
sala.length < 3 // O nome tem menos que três caracteres? room.length < 3 // O nome tem menos que três caracteres?
|| sala.length > 8 // O nome tem mais que 16 caracteres? || room.length > 8 // O nome tem mais que 16 caracteres?
|| salaRegex.exec(sala) !== null // O nome contém algum caractere que não seja permitido? || roomRegex.exec(room) !== null // O nome contém algum caractere que não seja permitido?
|| Util.filtrarMensagem(sala, filtros) != sala // O nome contém termos filtrados? || 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(); ws.terminate();
} }
// Agora que verificamos que os parâmetros necessários foram providenciados, vamos verificar a existência da sala. // Agora que verificamos que os parâmetros necessários foram providenciados, vamos verificar a existência da sala.
if (salaExiste(sala)){ if (salaExiste(room)){
salaObj = pesquisarSala(sala); roomObj = pesquisarSala(room);
// Encontrar a sala existente na lista de salas. // Encontrar a sala existente na lista de salas.
for (var x = 0; x < salas.length; x++){ for (var x = 0; x < salas.length; x++){
if (salas[x].sala === sala){ if (salas[x].sala === room){
//salas[x].clientes.push(cliente); //salas[x].clientes.push(cliente);
salaNum = x; roomNo = x;
adicionarCliente = true; adicionarCliente = true;
salaObj = salas[x]; roomObj = salas[x];
break; break;
} }
} }
// O IP do cliente está banido? // O IP do cliente está banido?
if (salaObj.banido(cliente.soquete.remoteAddress)){ if (roomObj.banido(cliente.socket.remoteAddress)){
ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "BANIDO"))); ws.send(JSON.stringify(new Query("FATAL", "SERVER", "BANNED")));
return; return;
} }
// A sala está em partida? // A sala está em partida?
if (salaObj.estado === "EM_PARTIDA"){ if (roomObj.estado === "IN_SESSION"){
ws.send(JSON.stringify(new Resposta("FATAL", "SERVIDOR", "SALA_EM_PARTIDA"))); ws.send(JSON.stringify(new Query("FATAL", "SERVER", "ROOM_IN_SESSION")));
return; return;
} }
// A sala está cheia? // A sala está cheia?
let limiteJogadores = vars["sala.clientes.limite"]; let limiteJogadores = vars["room.clients.max"];
if (salaObj.clientes.length >= limiteJogadores){ if (roomObj.clientes.length >= limiteJogadores){
// A sala está cheia. Retornar um código de erro ao jogador. // 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; return;
} }
// Gerar uma lista com os apelidos dos clientes conectados. // Gerar uma lista com os apelidos dos clientes conectados.
let jogadores = []; let jogadores = [];
for (let x = 0; x < salaObj.clientes.length; x++){ for (let x = 0; x < roomObj.clientes.length; x++){
let jogadorApelido = salaObj.clientes[x].apelido; let jogadorApelido = roomObj.clientes[x].apelido;
// Verificar se já existe um usuário com o mesmo apelido na sala. // Verificar se já existe um usuário com o mesmo apelido na sala.
if (jogadorApelido === cliente.apelido){ if (jogadorApelido === cliente.apelido){
// Alertar o cliente. // 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. // Fechar a conexão.
ws.terminate(); ws.terminate();
return; 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. // 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 { } else {
// A sala não existe. Vamos criar ela e adicionar o usuário nela. // 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. // 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); clientes.push(cliente);
if (salaObj !== undefined){ if (roomObj !== undefined){
salas[salaNum].clientes.push(cliente); salas[roomNo].clientes.push(cliente);
salaObj = salas[salaNum]; roomObj = salas[roomNo];
} else{ } else {
let salaNova = new Sala(sala, [cliente], undefined, undefined, JSON.parse(JSON.stringify(vars["sala.opções.padrão"]))); 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); 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. // Alertar todos os jogadores sobre a entrada do jogador.
alertarClientesEvento('EVENTO_JOGADOR_ENTROU', sala, { apelido:cliente.apelido }); alertarClientesEvento('EVENT_PLAYER_JOINED', room, { apelido:cliente.apelido });
if (salaObj !== undefined) if (roomObj !== undefined)
// A sala possui a quantidade suficiente de jogadores para iniciar? // A sala possui a quantidade suficiente de jogadores para iniciar?
verificarPossibilidadeDePartida(salaObj); verificarPossibilidadeDePartida(roomObj);
break; break;
} }
case "ENVIAR_MENSAGEM":{ case "ENVIAR_MENSAGEM":{
// Verificar se a mensagem desejada foi providenciada pelo cliente. // Verificar se a mensagem desejada foi providenciada pelo cliente.
if (resposta.extra.mensagem === undefined){ if (resposta.extra.mensagem === undefined){
// A mensagem não foi providenciada pelo cliente. Retornar uma resposta de erro para o cliente. // 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; return;
} }
// Verificar se a mensagem excede o limite de caracteres proposto pelo cliente. // Verificar se a mensagem excede o limite de caracteres proposto pelo cliente.
if (resposta.extra.mensagem.length > 128) { if (resposta.extra.mensagem.length > 128) {
// Cancelar este pedido e retornar uma mensagem de erro para o cliente. // 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; return;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
var mensagem = '<' + cliente.apelido + '> ' + resposta.extra.mensagem; var mensagem = '<' + cliente.apelido + '> ' + resposta.extra.mensagem;
// Enviar a mensagem para todos os clientes. // 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; break;
} }
case "INICIAR_PARTIDA":{ case "INICIAR_PARTIDA":{
// O cliente que está tentando iniciar a partida é do líder? // 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. // 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; break;
} }
// A sala já está em partida? // A sala já está em partida?
if (salaObj.estado === "EM_PARTIDA"){ if (roomObj.estado === "IN_SESSION"){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_EM_PARTIDA"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "IN_SESSION")));
break; break;
} }
cliente.uas = Date.now(); 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. // 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. // 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; break;
} }
case "ESCOLHER_PALAVRA":{ case "ESCOLHER_PALAVRA":{
// A sala está em partida? // A sala está em partida?
if (salaObj.estado !== "EM_PARTIDA"){ if (roomObj.estado !== "IN_SESSION"){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_ESTADO_NÃO_EM_PARTIDA"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SALA_ESTADO_NÃO_EM_PARTIDA")));
break; break;
} }
// Verificar se é realmente a vez do cliente que enviou este pedido. // 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! // 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; break;
} }
@ -250,126 +258,126 @@ wss.on('connection', ws => {
// A palavra enviada está vazia? // A palavra enviada está vazia?
if (resposta.extra.palavra.replace(/ /g, "") === ""){ 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; return;
} }
// Verificar tamanho da palavra. // Verificar tamanho da palavra.
if (resposta.extra.palavra.length < vars["palavra.tamanho.mín"] if (resposta.extra.palavra.length < vars["game.term.size.min"]
|| resposta.extra.palavra.length > vars["palavra.tamanho.máx"]){ || resposta.extra.palavra.length > vars["game.term.size.max"]){
ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "TERMO_INVÁLIDO", { erroDescrição: "PALAVRA_TAMANHO_INVÁLIDO" }))); ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "PALAVRA_TAMANHO_INVÁLIDO" })));
return; return;
} }
// Verificar tamanho do tema. // Verificar tamanho do tema.
if (resposta.extra.tema.length < vars["tema.tamanho.mín"] if (resposta.extra.tema.length < vars["game.theme.size.min"]
|| resposta.extra.tema.length > vars["tema.tamanho.máx"]){ || resposta.extra.tema.length > vars["game.theme.size.max"]){
ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "TEMA_TAMANHO_INVÁLIDO" }))); ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "PALAVRA_OU_TEMA_PROIBIDO", { erroDescrição: "TEMA_TAMANHO_INVÁLIDO" })));
return; return;
} }
// Verificar palavra via expressão regular. // Verificar palavra via expressão regular.
let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g'); let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g');
if (palavraRegexIlegal.test(resposta.extra.palavra)){ 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; return;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
salaObj.uas = Date.now(); roomObj.uas = Date.now();
// A sala está com o filtro de temas adultos habilitado? // 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. // Verificar se esta palavra está filtrada.
let palavraFiltrada = Util.filtrarMensagem(resposta.extra.palavra, filtros); let palavraFiltrada = Util.filtrarMensagem(resposta.extra.palavra, filtros);
let temaFiltrado = Util.filtrarMensagem(resposta.extra.tema, 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. // 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 if (palavraFiltrada !== resposta.extra.palavra
|| temaFiltrado !== resposta.extra.tema){ || 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; break;
} }
} }
// Redefinir tin (contagem de tentativas incorretas). // 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. // 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(); roomObj.palavra = resposta.extra.palavra.toUpperCase();
salaObj.definirPalavraLetrasQtd(); roomObj.definirPalavraLetrasQtd();
salaObj.termoVezDe = salaObj.próxItemJf === undefined ? salaObj.jf[0] : salaObj.próxItemJf(); roomObj.termoVezDe = roomObj.próxItemJf === undefined ? roomObj.jf[0] : roomObj.próxItemJf();
if (salaObj.termoVezDe === salaObj.vezDe) if (roomObj.termoVezDe === roomObj.vezDe)
salaObj.termoVezDe = salaObj.próxItemJf(); roomObj.termoVezDe = roomObj.próxItemJf();
salaObj.estadoTermo = "AGUARDANDO_LETRA"; roomObj.estadoTermo = "AGUARDANDO_LETRA";
// Vamos alertar todos os clientes sobre este evento. // 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; break;
} }
case "ENVIAR_TERMO":{ case "ENVIAR_TERMO":{
// A sala está em partida? // A sala está em partida?
if (salaObj.estado !== "EM_PARTIDA"){ if (roomObj.estado !== "IN_SESSION"){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_ESTADO_NÃO_EM_PARTIDA"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SALA_ESTADO_NÃO_EM_PARTIDA")));
break; break;
} }
// Verificar se é a vez do cliente que enviou este pedido. // Verificar se é a vez do cliente que enviou este pedido.
if (salaObj.termoVezDe !== cliente.apelido){ if (roomObj.termoVezDe !== cliente.apelido){
ws.send(JSON.stringify(new Resposta("PEDIDO_CANCELADO", "SERVIDOR", "AGUARDE_SUA_VEZ"))); ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "AGUARDE_SUA_VEZ")));
break; break;
} }
// Verificar termo via expressão regular. // Verificar termo via expressão regular.
let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g'); let palavraRegexIlegal = new RegExp(vars["palavra.regex.caracteresIlegais"], 'g');
if (palavraRegexIlegal.test(resposta.extra.termo)){ 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; break;
} }
// Verificar se o termo enviado possui termos filtrados CASO a sala tinha o filtro habilitado // 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){ if (roomObj.opções["game.filter.matureThemes.enabled"] && 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" }))); ws.send(JSON.stringify(new Query("PEDIDO_CANCELADO", "SERVER", "TERMO_INVÁLIDO", { erroDescrição: "TERMO_IMPRÓPRIO" })));
break; break;
} }
// Verificar o tipo do termo enviado. // Verificar o tipo do termo enviado.
let letra = resposta.extra.termo.length === 1; let letra = resposta.extra.termo.length === 1;
let salaClientes = salaObj.clientes; let salaClientes = roomObj.clientes;
let e = Util.receberClientePorApelido(salaObj, salaObj.vezDe); // escolhedor let e = Util.receberClientePorApelido(roomObj, roomObj.vezDe); // escolhedor
// O termo está vazio? // O termo está vazio?
if (resposta.extra.termo.replace(/ /g, "") === ""){ 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; return;
} }
// O jogador deseja pular? // O jogador deseja pular?
if (salaObj.estadoTermo === "AGUARDANDO_TERMO" && if (roomObj.estadoTermo === "AGUARDANDO_TERMO" &&
resposta.extra.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. // Escolher outro jogador.
escolherJogadorTermo(salaObj); escolherJogadorTermo(roomObj);
return; return;
} }
// A sala está aceitando apenas termos? // 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. // 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; break;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
salaObj.uas = Date.now(); roomObj.uas = Date.now();
resposta.extra.termo = resposta.extra.termo.toUpperCase(); 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 lp = resultadoTermo.letrasPreenchidas;
let r = resultadoTermo.resultado; let r = resultadoTermo.resultado;
@ -379,185 +387,185 @@ wss.on('connection', ws => {
dife = 0; // diferença da nova pontuação do jogador que enviou a palavra atual dife = 0; // diferença da nova pontuação do jogador que enviou a palavra atual
switch (r){ switch (r){
case "LETRA_JÁ_ESCOLHIDA":{ 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; tentarNovamente = true;
break; break;
} }
case "PALAVRA_JÁ_ESCOLHIDA":{ 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; tentarNovamente = true;
break; break;
} }
case "LETRAS_PREENCHIDAS":{ 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. // Também acrescentar pontuação ao jogador.
for (let x = 0; x < lp; x++){ for (let x = 0; x < lp; x++){
dif += cliente.acrescentarPontos(Pontos.EVENTO_JOGADOR_LETRA_ACERTADA); dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_LETRA_ACERTADA);
dife += e.acrescentarPontos(Pontos.EVENTO_JOGADOR_SALA_LETRA_ACERTADA); dife += e.acrescentarPontos(Pontos.EVENT_JOGADOR_SALA_LETRA_ACERTADA);
} }
// Alertar os clientes da nova pontuação deste jogador. // 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("EVENT_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: e.apelido, pontos: e.pontos, diferença: dife });
break; break;
} }
case "LETRA_INEXISTENTE":{ case "LETRA_INEXISTENTE":{
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 });
if (alterarTin(salaObj)) return; if (alterarTin(roomObj)) return;
break; break;
} }
case "PALAVRA_CORRETA":{ 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. // Acrescentar pontos ao jogador por acertar a palavra.
// Pontos pelos campos que antes estavam vazios e pontos 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++){ for (let x = 0; x < lp; x++){
dif += cliente.acrescentarPontos(extra ? Pontos.EVENTO_JOGADOR_LETRA_ACERTADA_CEDO : Pontos.EVENTO_JOGADOR_LETRA_ACERTADA); dif += cliente.acrescentarPontos(extra ? Pontos.EVENT_JOGADOR_LETRA_ACERTADA_CEDO : Pontos.EVENT_JOGADOR_LETRA_ACERTADA);
dife += e.acrescentarPontos(extra ? Pontos.EVENTO_JOGADOR_SALA_LETRA_ACERTADA_CEDO : Pontos.EVENTO_JOGADOR_SALA_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); dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_PALAVRA_ACERTADA);
dife += e.acrescentarPontos(Pontos.EVENTO_JOGADOR_SALA_PALAVRA_ACERTADA); dife += e.acrescentarPontos(Pontos.EVENT_JOGADOR_SALA_PALAVRA_ACERTADA);
// Alertar os clientes da nova pontuação deste jogador. // 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("EVENT_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: e.apelido, pontos: e.pontos, diferença: dife });
// Verificar se um jogador atingiu a meta de pontos. // Verificar se um jogador atingiu a meta de pontos.
let vencedor = salaObj.receberVencedor(); let vencedor = roomObj.receberVencedor();
if (vencedor !== null){ if (vencedor !== null){
// Há um vencedor; alertar os clientes na sala que houve um vencedor. // 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. // Encerrar esta partida.
verificarPossibilidadeDePartida(salaObj, true); verificarPossibilidadeDePartida(roomObj, true);
return; return;
} }
// Escolher outro jogador para escolher a palavra. // Escolher outro jogador para escolher a palavra.
salaObj.novaRodada(); roomObj.novaRodada();
// E vamos alertar todos os clientes sobre o jogador escolhido. // 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; return;
} }
case "PALAVRA_INCORRETA":{ case "PALAVRA_INCORRETA":{
alterarTin(salaObj); alterarTin(roomObj);
// Penalizar o jogador caso ele tenha errado a palavra cedo. // 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++) for (let x = 0; x < resposta.extra.termo.length; x++)
dif += cliente.acrescentarPontos(Pontos.EVENTO_JOGADOR_LETRA_ERRADA_CEDO); dif += cliente.acrescentarPontos(Pontos.EVENT_JOGADOR_LETRA_ERRADA_CEDO);
alertarClientesEvento("EVENTO_JOGADOR_PONTUAÇÃO_ALTERADA", cliente.sala, { jogador: cliente.apelido, pontos: cliente.pontos, diferença: dif }); 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; break;
} }
} }
escolherJogadorTermo(salaObj, tentarNovamente? cliente.apelido : undefined); escolherJogadorTermo(roomObj, tentarNovamente? cliente.apelido : undefined);
// Enviar um alerta para todos os clientes da sala. // 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. // 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; break;
} }
case "CHUTAR_CLIENTE":{ case "CHUTAR_CLIENTE":{
// Problema #60: O cliente que enviou este pedido é o líder da sala? // Problema #60: O cliente que enviou este pedido é o líder da sala?
if (salaObj.líder !== cliente.apelido){ if (roomObj.líder !== cliente.apelido){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO")));
return; return;
} }
let jogador = resposta.extra.jogador; let jogador = resposta.extra.jogador;
if (jogador === undefined){ 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; break;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
// Encerrar conexão com o cliente alvo. // Encerrar conexão com o cliente alvo.
let clienteAlvo = Util.receberClientePorApelido(salaObj, jogador); let clienteAlvo = Util.receberClientePorApelido(roomObj, jogador);
alertarClientesEvento("EVENTO_CLIENTE_CHUTADO", cliente.sala, { cliente: clienteAlvo.apelido }); alertarClientesEvento("EVENT_CLIENTE_CHUTADO", cliente.sala, { cliente: clienteAlvo.apelido });
// Remover o cliente da sala. // Remover o cliente da sala.
clienteAlvo.soquete.terminate(); clienteAlvo.socket.terminate();
break; break;
} }
case "BANIR_CLIENTE":{ case "BANIR_CLIENTE":{
// Problema #60: O cliente que enviou este pedido é o líder da sala? // Problema #60: O cliente que enviou este pedido é o líder da sala?
if (salaObj.líder !== cliente.apelido){ if (roomObj.líder !== cliente.apelido){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO")));
return; return;
} }
let jogador = resposta.extra.jogador; let jogador = resposta.extra.jogador;
if (jogador === undefined){ 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; break;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
// Encerrar conexão com o cliente alvo. // Encerrar conexão com o cliente alvo.
let clienteAlvo = Util.receberClientePorApelido(salaObj, jogador); let clienteAlvo = Util.receberClientePorApelido(roomObj, jogador);
alertarClientesEvento("EVENTO_CLIENTE_BANIDO", cliente.sala, { cliente: clienteAlvo.apelido }); alertarClientesEvento("EVENT_CLIENTE_BANIDO", cliente.sala, { cliente: clienteAlvo.apelido });
// Remover o cliente da sala. // Remover o cliente da sala.
clienteAlvo.soquete.terminate(); clienteAlvo.socket.terminate();
// Adicionar o cliente na lista de banidos da sala. // Adicionar o cliente na lista de banidos da sala.
salaObj.banidos.push(clienteAlvo.soquete.remoteAddress); roomObj.banidos.push(clienteAlvo.socket.remoteAddress);
break; break;
} }
case "ALTERAR_OPÇÃO":{ case "UPDATE_OPTION":{
let opção = resposta.extra.opção, let option = resposta.extra.option,
valor = resposta.extra.valor, value = resposta.extra.value,
alvo = resposta.extra.alvo; target = resposta.extra.target;
if (opção === undefined || valor === undefined || alvo === undefined){ if (option === undefined || value === undefined || target === 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; break;
} }
cliente.uas = Date.now(); cliente.uas = Date.now();
// Definir opção. // Definir opção.
if (resposta.extra.alvo === "CLIENTE"){ if (resposta.extra.target === "CLIENT"){
cliente.opções[opção] = valor; 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] }))); ws.send(JSON.stringify(new Query("SUCCESSFUL", "SERVER", "OPTION_UPDATED", { option: option, newValue: cliente.opções[option] })));
} else if (resposta.extra.alvo === "SALA") { } else if (resposta.extra.target === "ROOM") {
// O cliente que está enviando este pedido é o líder da sala? // O cliente que está enviando este pedido é o líder da sala?
if (salaObj.líder !== cliente.apelido){ if (roomObj.líder !== cliente.apelido){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SEM_PERMISSÃO"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "SEM_PERMISSÃO")));
break; break;
} }
// A sala já está em partida? // A sala já está em partida?
if (salaObj.estado === "EM_PARTIDA"){ if (roomObj.estado === "IN_SESSION"){
ws.send(JSON.stringify(new Resposta("ERRO", "SERVIDOR", "SALA_EM_PARTIDA"))); ws.send(JSON.stringify(new Query("ERRO", "SERVER", "ROOM_IN_SESSION")));
break; break;
} }
// Agora que verificamos que este cliente é o líder, vamos alterar a configuração da sala. // Agora que verificamos que este cliente é o líder, vamos alterar a configuração da sala.
salaObj.opções[opção] = valor; roomObj.opções[option] = value;
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] }))); 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. // 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; break;
} }
case "PING":{ case "PING":{
// Adicionar tempo para a lista de pings do cliente. // Adicionar tempo para a lista de pings do cliente.
cliente.pings.push(Date.now()); 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; break;
} }
} }
}); });
ws.on('error', erro => { 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. // Remover o cliente da lista de clientes.
removerCliente(cliente.endereço); removerCliente(cliente.address);
}); });
ws.on('close', function(){ 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. // Remover o cliente da lista de clientes.
removerCliente(cliente, 'MOTIVO_CONEXÃO_FECHADA'); removerCliente(cliente, 'MOTIVO_CONEXÃO_FECHADA');
}); });
let resposta = new Resposta("TESTE_CON", "SERVIDOR"); let resposta = new Query("TEST_CON", "SERVER");
ws.send(JSON.stringify(resposta)); ws.send(JSON.stringify(resposta));
}); });
@ -572,7 +580,7 @@ function removerCliente(cliente, motivo){
// Verifica se o cliente está em uma sala. // Verifica se o cliente está em uma sala.
if (sala === undefined){ 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; return -1;
} }
@ -588,18 +596,18 @@ function removerCliente(cliente, motivo){
let líder = sala.líder === cliente.apelido; let líder = sala.líder === cliente.apelido;
if (líder) // Caso o líder sair da sala, então apagar a sala. 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? // Este cliente está na sala?
//if (sala.clientes.indexOf(cliente.apelido) === -1) //if (sala.clientes.indexOf(cliente.apelido) === -1)
//return; //return;
// Alertar os clientes na sala sobre o jogador que está sendo removido caso um motivo tenha sido especificado. // 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. if(líder) // Remover todos os jogadores da sala.
for (let x = sala.clientes.length; x > 0; x--) 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. // Remover o cliente da lista de clientes da sala.
let índice = sala.clientes.indexOf(cliente); let índice = sala.clientes.indexOf(cliente);
@ -615,7 +623,7 @@ function removerCliente(cliente, motivo){
// Escolher outro jogador. // Escolher outro jogador.
sala.novaRodada(); sala.novaRodada();
// E vamos alertar todos os clientes sobre o jogador escolhido. // 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? // Este jogador estava escolhendo um termo?
else if (sala.clientes.length !== 1 && sala.termoVezDe === cliente.apelido){ 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. // Evitar problemas de formatação com colchetes.
e.mensagem = e.mensagem.replace(/\[/g, "\\[") e.mensagem = e.mensagem.replace(/\[/g, "\\[")
.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. if (msgFiltrada === null) // Evitar de filtrar a mensagem caso ela já tenha sido filtrada.
msgFiltrada = Util.filtrarMensagem(e.mensagem, filtros); msgFiltrada = Util.filtrarMensagem(e.mensagem, filtros);
e.mensagem = msgFiltrada; 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++){ for (let x = 0; x < sala.clientes.length; x++){
if (sala.clientes[x].apelido === cliente.apelido){ if (sala.clientes[x].apelido === cliente.apelido){
let mensagem = '<' + extra.apelido + '> ' + extra.mensagem; 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; 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. * @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). * @since 12 de outubro de 2020, 19:49 (UTC -03:00).
*/ */
function pesquisarSala(sala){ function pesquisarSala(sala){
@ -718,19 +726,19 @@ function pesquisarSala(sala){
/** /**
* Verifica se 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. * Verifica se 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. * @return boolean Verdadeiro caso exista a possibilidade, falso caso contrário.
* @since 14 de outubro de 2020. * @since 14 de outubro de 2020.
*/ */
function verificarPossibilidadeDePartida(sala, forçar){ 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; return true;
// Alterar o estado da sala. // Alterar o estado da sala.
sala.estado = sala.clientes.length === 1 ? "AGUARDANDO_JOGADORES" : "AGUARDANDO_LÍDER"; sala.estado = sala.clientes.length === 1 ? "AGUARDANDO_JOGADORES" : "AGUARDANDO_LÍDER";
// Alertar os clientes. // 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; return sala.clientes.length > 1;
} }
@ -746,15 +754,15 @@ function alterarTin(sala, valor){
sala.tin++; sala.tin++;
else else
sala.tin = valor; 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? // Tin máximo atingido?
if (sala.tin >= vars['sala.tin.limite']){ if (sala.tin >= vars['room.tin.max']){
alertarClientesEvento("EVENTO_TIN_MÁXIMO_ATINGIDO", sala.sala, { palavra: sala.palavra }); alertarClientesEvento("EVENT_TIN_MÁXIMO_ATINGIDO", sala.sala, { palavra: sala.palavra });
// Nova rodada. // Nova rodada.
// Escolher outro jogador para escolher a palavra. // Escolher outro jogador para escolher a palavra.
sala.novaRodada(); sala.novaRodada();
// E vamos alertar todos os clientes sobre o jogador escolhido. // 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; return true;
} }
} }
@ -780,7 +788,7 @@ function escolherJogadorTermo(sala, jogador){
if (possívelDescoberta) if (possívelDescoberta)
sala.estadoTermo = "AGUARDANDO_TERMO"; 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); pings.splice(0, 1);
let delta = Date.now() - pings[pings.length - 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){ if (delta >= máx){
console.log("[" + cliente.endereço + "] O cliente não enviou pings recentemente. Fechando conexão."); console.log("[" + cliente.address + "] O cliente não enviou pings recentemente. Fechando conexão.");
cliente.soquete.terminate(); cliente.socket.terminate();
} }
} }
} }
@ -813,24 +821,24 @@ function checarInativos(){
// Jogadores // // Jogadores //
/////////////// ///////////////
for (let x = 0; x < clientes.length; x++){ 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."); console.log("[" + clientes[x].endereço + "] O jogador parece estar inativo. Fechando conexão.");
// Alertar os clientes. // Alertar os clientes.
alertarClientesEvento("EVENTO_JOGADOR_CHUTADO_POR_INATIVIDADE", clientes[x].sala, { jogador: clientes[x].apelido }); alertarClientesEvento("EVENT_JOGADOR_CHUTADO_POR_INATIVIDADE", clientes[x].sala, { jogador: clientes[x].apelido });
clientes[x].soquete.terminate(); clientes[x].socket.terminate();
} }
} }
/////////// ///////////
// Salas // // Rooms //
/////////// ///////////
for (let x = 0; x < salas.length; x++) 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."); 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. // 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. // 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();
} }
} }