package controllers; import java.net.UnknownHostException; import java.util.Arrays; import java.util.List; import logica.Trivial; import models.Pregunta; import models.PreguntaGame; import models.Respuesta; import persistence.DBFactory; import play.mvc.Controller; import play.mvc.Result; import views.html.mensajes; import views.html.resultados; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.util.JSON; import models.Usuario; public class TrivialAPI extends Controller { private static Trivial trivial = new Trivial(obtenerListaPreguntas()); private static Usuario usuarioEnSesion; private static List<Pregunta> obtenerListaPreguntas() { return DBFactory.createRemoteDB().cargarPreguntas(); } public static Result obtenerPreguntas() { String resultJSON = "{\"preguntas\":["; DBCursor cursor = ejecutarConsulta(null, "preguntas"); resultJSON = createJSONArray(resultJSON, cursor); resultJSON = ocultarRespuestaCorrecta(resultJSON); return ok(resultados.render(resultJSON)); } public static Result obtenerPreguntasPorCategoria(String categoria) { categoria = checkCategoria(categoria); String resultJSON = "{\"preguntas\":["; BasicDBObject consulta = new BasicDBObject(); consulta.put("categoria", categoria); String coleccion = "preguntas"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); resultJSON = createJSONArray(resultJSON, cursor); resultJSON = ocultarRespuestaCorrecta(resultJSON); return ok(resultados.render(resultJSON)); } public static Result obtenerPreguntaAleatoria(String categoria) { String resultJSON = ""; categoria = checkCategoria(categoria); BasicDBObject consulta = new BasicDBObject(); consulta.put("categoria", categoria); String coleccion = "preguntas"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); int maxIndex = cursor.count() - 1; int posRandom = (int) (Math.random() * ((maxIndex - 0) + 1) + 0); int i = 0; while (cursor.hasNext()) { DBObject preguntaJSON = cursor.next(); if (i == posRandom) { resultJSON = preguntaJSON.toString(); break; } i++; } cursor.close(); resultJSON = ocultarRespuestaCorrecta(resultJSON); return ok(resultados.render(resultJSON)); } private static String ocultarRespuestaCorrecta(String resultJSON) { resultJSON = resultJSON.replace(" , \"isCorrecta\" : ", ""); resultJSON = resultJSON.replace("true", ""); resultJSON = resultJSON.replace("false", ""); return resultJSON; } public static Result comprobarRespuesta(Integer idPregunta, Integer nRespuesta) { BasicDBObject consulta = new BasicDBObject(); consulta.put("_id", idPregunta); String coleccion = "preguntas"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); int respuestaCorrecta = -1; BasicDBObject respuestaElegida = null; if (cursor.hasNext()) { DBObject preguntaJSON = cursor.next(); BasicDBList respuestas = (BasicDBList) preguntaJSON .get("respuestas"); for(int i = 0; i < respuestas.size(); i++) if(((BasicDBObject)respuestas.get(i)).getBoolean("isCorrecta")) respuestaCorrecta = i; respuestaElegida = (BasicDBObject) respuestas.get(nRespuesta); } cursor.close(); String result = "{\"isCorrecta\":" + respuestaElegida.get("isCorrecta").toString() + "," + "\"nCorrecta\":" + respuestaCorrecta + "}"; return ok(resultados.render(result)); } private static String checkCategoria(String categoria) { categoria = categoria.replace("%20", " "); if (categoria.equalsIgnoreCase("historia")) categoria = "Historia"; else if (categoria.equalsIgnoreCase("espectáculos") || categoria.equalsIgnoreCase("espectaculos")) categoria = "Espectáculos"; else if (categoria.equalsIgnoreCase("ciencias y naturaleza")) categoria = "Ciencias y Naturaleza"; else if (categoria.equalsIgnoreCase("geografía") || categoria.equalsIgnoreCase("geografia")) categoria = "Geografía"; return categoria; } public static Result obtenerUsuarios() { String resultJSON = "{\"usuarios\":["; DBCursor cursor = ejecutarConsulta(null, "usuarios"); resultJSON = createJSONArray(resultJSON, cursor); return ok(resultados.render(resultJSON)); } public static Result obtenerUsuario(String usuario) { String resultJSON = "{\"usuarios\":["; BasicDBObject consulta = new BasicDBObject(); consulta.put("usuario", usuario); String coleccion = "usuarios"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); if (cursor.hasNext()) { DBObject preguntaJSON = cursor.next(); resultJSON += preguntaJSON.toString(); } resultJSON += "]}"; return ok(resultados.render(resultJSON)); } public static Result guardarUsuario(String usuario, String password) { String resultJSON = "{\"resultado\":true}"; try{ BasicDBObject consulta = new BasicDBObject(); consulta.put("usuario", usuario); String coleccion = "usuarios"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); if (cursor.hasNext()) { resultJSON = resultJSON.replace("true", "false"); } else{ DB db = conectar(); DBCollection colUsuarios = db.getCollection("usuarios"); String usuarioJSON = "{\"usuario\":\""+usuario+"\","+"\"pass\":\""+password+"\"}"; DBObject jsonObject = (DBObject) JSON.parse(usuarioJSON); colUsuarios.insert(jsonObject); } } catch (Exception e){ resultJSON = resultJSON.replace("true", "false"); } return ok(resultados.render(resultJSON)); } public static Result getUserSesion(){ if (usuarioEnSesion != null) { String resultJSON = "{" + "\"username\":\"" + usuarioEnSesion.getUsuario() + "\"," + "\"pass\":\"" + usuarioEnSesion.getContrasenia() + "\"," + "\"icono\":\"" + usuarioEnSesion.getIcono() + "\"" +"}"; return ok(resultados.render(resultJSON)); } else { String resultJSON = "{\"error\":\"No existe ningun usuario en sesion\"}"; return ok(resultados.render(resultJSON)); } } public static Result validateUser(String usuario, String password){ String resultJSON = "{\"validacion\":"; BasicDBObject consulta = new BasicDBObject(); consulta.put("usuario", usuario); String coleccion = "usuarios"; DBCursor cursor = ejecutarConsulta(consulta, coleccion); if (cursor.hasNext()) { DBObject usuarioJSON = cursor.next(); String pass = (String) usuarioJSON.get("pass"); if(pass.equals(password)) { resultJSON += "true"; usuarioEnSesion = new Usuario(usuario, password); } else resultJSON += "false"; } else{ resultJSON += "false"; } resultJSON += "}"; return ok(resultados.render(resultJSON)); } public static Result addQuesito(String categoria){ categoria = checkCategoria(categoria); usuarioEnSesion.addQuesito(categoria); usuarioEnSesion.actualizarIconoQuesitos(); String resultJSON = "{\"icono\":\""+usuarioEnSesion.getIcono()+"\"}"; return ok(resultados.render(resultJSON)); } public static Result getQuesitos(){ String resultJSON = "{\"todosLosQuesitos\":"+usuarioEnSesion.todosLosQuesitos()+"}"; return ok(resultados.render(resultJSON)); } public static Result calcularDestinos(Integer actual, Integer tirada) { trivial = new Trivial(obtenerListaPreguntas()); List<Integer> destinos = trivial.obtenerDestinos(actual, tirada); String result = "{\"posiciones\":["; for (Integer destino : destinos) result += "{\"posicion\":" + destino + "},"; result = result.substring(0, result.length() - 1); result += "]}"; return ok(resultados.render(result)); } public static Result usarCasilla(Integer nCasilla){ trivial.usarCasilla(nCasilla); PreguntaGame pregunta = trivial.getPreguntaActual(); boolean isCasillaFinal = trivial.isCasillaFinal(); boolean isVuelveATirar = trivial.isVuelveATirar(); String result = "{"; String respuestasJSON = ""; if(pregunta != null){ result += "\"_id\":\""+pregunta.getId()+"\","; result += "\"isQuesito\":"+pregunta.isEsQuesito()+","; result += "\"enunciado\":\""+pregunta.getEnunciado()+"\","; result += "\"categoria\":\""+pregunta.getCategoria()+"\","; List<Respuesta> respuestas = pregunta.getRespuestas(); respuestasJSON = "\"respuestas\":["; for (Respuesta respuesta : respuestas) { respuestasJSON += "{"; respuestasJSON += "\"respuesta\":\""+respuesta.getRespuesta()+"\""; respuestasJSON += "},"; } respuestasJSON = respuestasJSON.substring(0,respuestasJSON.length()-1)+"]"+","; } result += respuestasJSON; result += "\"isCasillaFinal\":"+isCasillaFinal+","; result += "\"isVuelveATirar\":"+isVuelveATirar+""; result += "}"; return ok(resultados.render(result)); } public static Result tirarDado(){ return ok(resultados.render("{\"numero\":"+String.valueOf(trivial.lanzarDado())+"}")); } private static DB conectar() { MongoClient mongoClient = null; MongoCredential mongoCredential = MongoCredential .createMongoCRCredential("trivialuser", "trivial", "4btrivialmongouser".toCharArray()); try { mongoClient = new MongoClient(new ServerAddress( "ds062797.mongolab.com", 62797), Arrays.asList(mongoCredential)); } catch (UnknownHostException e) { e.printStackTrace(); } DB db = mongoClient.getDB("trivial"); System.out.println("Conexion creada con la base de datos"); return db; } private static DBCursor ejecutarConsulta(BasicDBObject consulta, String coleccion) { DB db = conectar(); DBCollection colPreguntas = db.getCollection(coleccion); DBCursor cursor = null; if (consulta != null) cursor = colPreguntas.find(consulta); else cursor = colPreguntas.find(); return cursor; } private static String createJSONArray(String resultJSON, DBCursor cursor) { while (cursor.hasNext()) { DBObject preguntaJSON = cursor.next(); resultJSON += preguntaJSON.toString() + ","; } cursor.close(); resultJSON = resultJSON.substring(0, resultJSON.length() - 1) + "]}"; return resultJSON; } }