package com.rzg.zombieland.server.sesion; import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import com.rzg.zombieland.comunes.comunicacion.pojo.POJORegistro; import com.rzg.zombieland.comunes.comunicacion.pojo.POJOResultadoRonda; import com.rzg.zombieland.comunes.misc.Avatar; import com.rzg.zombieland.comunes.misc.Log; import com.rzg.zombieland.comunes.misc.ParametrosNoValidosException; import com.rzg.zombieland.comunes.misc.ZombielandException; import com.rzg.zombieland.server.comunicacion.peticion.PeticionActualizacionLobby; import com.rzg.zombieland.server.comunicacion.peticion.PeticionRecibirMensajeChat; import com.rzg.zombieland.server.comunicacion.peticion.PeticionRecibirPuntajePartida; import com.rzg.zombieland.server.meta.ResultadoJugador; import com.rzg.zombieland.server.persistencia.JugadorDao; /** * Modela al usuario del cliente de Zombieland. * * @author nicolas * */ @Entity public class Jugador { /** * Verifica nombre y clave del jugador, y devuelve un objeto jugador si * logr� iniciar sesi�n. * * @param nombre * @param clave * @return el jugador, o null si los par�metros de inicio de sesi�n no son * v�lidos. */ public static Jugador iniciarSesion(String nombre, String clave) { JugadorDao dao = new JugadorDao(); Jugador jugador = dao.getJugadorPorNombre(nombre); dao.cerrarSesion(); if (jugador == null) return null; if (jugador.getClave().equals(clave)) return jugador; return null; } // ID �nico de jugador. @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; // Nombre de usuario. @Column(unique = true) private String nombre; // Clave de acceso al sistema. @Column private String clave; // Pregunta de seguridad que se env�a al usuario en caso de errores al // iniciar sesi�n. @Column private String preguntaSecreta; // Respuesta a la pregunta secreta de inicio de sesi�n. @Column private String respuestaSecreta; // Indica el ranking del jugador en la tabla general. @Column private int ranking; // La imagen que representa el personaje del jugador en la partida. @Column private Avatar avatar; // Resultados de partidas hist�ricos. @OneToMany private List<ResultadoJugador> historicoPartidas; /** * Constructor vac�o para Hibernate. */ public Jugador() { } /** * Crea un nuevo jugador. TODO verificar tama�os m�ximos de DB. * * @param nombre * @param clave * @param validacionClave * @param preguntaSecreta * @param respuestaSecreta * @throws ParametrosNoValidosException * si alg�n par�metro no es v�lido. */ public Jugador(String nombre, String clave, String validacionClave, String preguntaSecreta, String respuestaSecreta) throws ParametrosNoValidosException { List<String> errores = new ArrayList<String>(); if (nombre == null || nombre.equals("")) errores.add("El nombre no puede estar vac�o"); this.nombre = nombre; if (clave == null || clave.equals("")) errores.add("La clave no puede estar vac�a"); if (!clave.equals(validacionClave)) errores.add("La clave y la validaci�n no coinciden"); this.clave = clave; if (preguntaSecreta == null || preguntaSecreta.equals("")) errores.add("La pregunta secreta no puede estar vac�a"); this.preguntaSecreta = preguntaSecreta; if (respuestaSecreta == null || respuestaSecreta.equals("")) errores.add("La pregunta secreta no puede estar vac�a"); this.respuestaSecreta = respuestaSecreta; List<Avatar> avatares = new ArrayList<>(); for (Avatar avatar : Avatar.values()) { if (avatar.esPersonaje()) avatares.add(avatar); } this.avatar = avatares.get(new Random().nextInt(avatares.size())); this.historicoPartidas = new ArrayList<ResultadoJugador>(); if (errores.size() > 0) throw new ParametrosNoValidosException("Jugador", errores); } /** * Crea un jugador a trav�s del POJO que lo representa, validando todos sus * atributos. * * @param registro * @throws ParametrosNoValidosException */ public Jugador(POJORegistro registro) throws ParametrosNoValidosException { this(registro.getNombre(), registro.getClave(), registro.getClave(), registro.getPreguntaSecreta(), registro.getRespuestaSecreta()); if(registro.getAvatarJugador() != null) this.avatar = registro.getAvatarJugador(); } /** * Clona al jugador. Deber�amos refactorizar para no repetir c�digo. * * @param jugador */ public Jugador(Jugador jugador) { this.nombre = jugador.nombre; this.clave = jugador.clave; this.preguntaSecreta = jugador.preguntaSecreta; this.respuestaSecreta = jugador.respuestaSecreta; this.avatar = jugador.avatar; this.ranking = jugador.ranking; this.historicoPartidas = jugador.historicoPartidas; this.id = jugador.id; } /** * @return las partidas que lleva jugadas hist�ricamente. */ public int getPartidasJugadas() { // TODO implementar. return 0; } /** * @return las partidas que lleva ganadas hist�ricamente. */ public int getPartidasGanadas() { // TODO implementar. return 0; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public final boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Jugador)) return false; Jugador other = (Jugador) obj; if (avatar != other.avatar) return false; if (clave == null) { if (other.clave != null) return false; } else if (!clave.equals(other.clave)) return false; if (id != other.id) return false; if (nombre == null) { if (other.nombre != null) return false; } else if (!nombre.equals(other.nombre)) return false; if (preguntaSecreta == null) { if (other.preguntaSecreta != null) return false; } else if (!preguntaSecreta.equals(other.preguntaSecreta)) return false; if (ranking != other.ranking) return false; if (respuestaSecreta == null) { if (other.respuestaSecreta != null) return false; } else if (!respuestaSecreta.equals(other.respuestaSecreta)) return false; return true; } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((avatar == null) ? 0 : avatar.hashCode()); result = prime * result + ((clave == null) ? 0 : clave.hashCode()); result = prime * result + id; result = prime * result + ((nombre == null) ? 0 : nombre.hashCode()); result = prime * result + ((preguntaSecreta == null) ? 0 : preguntaSecreta.hashCode()); result = prime * result + ranking; result = prime * result + ((respuestaSecreta == null) ? 0 : respuestaSecreta.hashCode()); return result; } /** * @return el nombre del jugador. */ public String getNombre() { return nombre; } /** * @return la pregunta de seguridad que el jugador eligi� al registrarse. */ public String getPreguntaSecreta() { return preguntaSecreta; } /** * @return la respuesta de seguridad que el jugador eligi� al registrarse. */ public String getRespuestaSecreta() { return respuestaSecreta; } /** * @return la clave en texto plano del jugador. */ public String getClave() { return clave; } /** * Establece el nombre del jugador * * @param nombre */ public void setNombre(String nombre) { this.nombre = nombre; } /** * Establece la clave del jugador. * * @param clave */ public void setClave(String clave) { this.clave = clave; } /** * Establece la pregunta secreta del jugador * * @param preguntaSecreta */ public void setPreguntaSecreta(String preguntaSecreta) { this.preguntaSecreta = preguntaSecreta; } /** * Establece la respuesta secreta del jugador * * @param respuestaSecreta */ public void setRespuestaSecreta(String respuestaSecreta) { this.respuestaSecreta = respuestaSecreta; } /** * Establece el avatar del jugador * * @param avatar */ public void setAvatar (Avatar avatar) { this.avatar = avatar; } /** * Notifica al jugador del cambio de partida para que pueda tomar las acciones requeridas. */ public void notificarCambioPartida() { Sesion sesion = ServicioSesion.getInstancia().getSesion(this); try { sesion.enviarPeticion( new PeticionActualizacionLobby(sesion.getPartida().getPOJO(this))); } catch (ZombielandException e) { Log.error("No se pudo enviar la notificaci�n de cambio de partida al cliente"); e.printStackTrace(); } } /** * @return el avatar del jugador. */ public Avatar getAvatar() { return avatar; } public POJORegistro getPOJO() { POJORegistro registro; try { registro = new POJORegistro(this.nombre, this.clave, this.preguntaSecreta, this.respuestaSecreta, this.avatar); return registro; } catch (ParametrosNoValidosException e) { Log.error("El POJO devolvio una excepcion" + e.getMensaje()); throw new InvalidParameterException(); } } public Integer getId() { return id; } /** * Establece manualmente el ID del jugador. * (Para test). * @param id */ public void setId(int id) { this.id = id; } /** * Env�a un mensaje de chat al jugador. * @param mensaje */ public void enviarMensajeChat(String mensaje) { Sesion sesion = ServicioSesion.getInstancia().getSesion(this); try { sesion.enviarPeticion( new PeticionRecibirMensajeChat(mensaje)); } catch (ZombielandException e) { Log.error("No se pudo enviar el mensaje de chat al cliente"); e.printStackTrace(); } } /** * Env�a un mensaje con el puntaje parcial de la partida. * @param resultado */ public void notificarPuntajePartida(POJOResultadoRonda resultado) { Sesion sesion = ServicioSesion.getInstancia().getSesion(this); try { sesion.enviarPeticion( new PeticionRecibirPuntajePartida(resultado)); } catch (ZombielandException e) { Log.error("No se pudo enviar el puntajde de partida al cliente"); e.printStackTrace(); } } }