diff --git a/questionservice/data/tematicas.json b/questionservice/data/tematicas.json index 15aa1241..fc2b0003 100644 --- a/questionservice/data/tematicas.json +++ b/questionservice/data/tematicas.json @@ -1,129 +1,278 @@ { - "paises": { - "entity": "Q6256", - "props": ["P36", "P35", "P1344", "P37", "P47", "P2250", "P571", "P122", "P1451"], - "types": ["str", "str", "str", "str", "str", "num", "date", "str", "str"], - "preguntas": [ - { - "es": "¿Cuál es la capital de %?", - "en": "What is the capital of %?" - }, - { - "es": "¿Quién es el jefe de estado de % ?", - "en": "Who is the head of state of %?" - }, - { - "es": "¿En qué evento histórico participó % ?", - "en": "In what historical event did % participate?" - }, - { - "es": "¿Cuál es uno de los idiomas oficiales de % ?", - "en": "What is one of the official languages of %?" - }, - { - "es": "¿Con qué país comparte frontera % ?", - "en": "Which country shares a border with %?" - }, - { - "es": "¿Cuál es la esperanza de vida media de % ?", - "en": "What is the average life expectancy of %?" - }, - { - "es": "¿En qué fecha se fundó % ?", - "en": "On what date was % founded?" - }, - { - "es": "¿Cuál es la forma de gobierno de % ?", - "en": "What is the form of government of %?" - }, - { - "es": "¿Cuál es el lema de % ?", - "en": "What is the motto of %?" - } - ] - }, - "literatura": { - "entity": "Q7725634", - "props": ["P50", "P577", "P136", "P674"], - "types": ["str", "date", "str", "str"], - "preguntas": [ - { - "es": "¿Quién es el autor de la obra literaria % ?", - "en": "Who is the author of the literary work %?" - }, - { - "es": "¿Cuál fue la fecha de publicación de la obra literaria % ?", - "en": "What was the publication date of the literary work %?" - }, - { - "es": "¿Cuál es el género de la obra literaria % ?", - "en": "What is the genre of the literary work %?" - }, - { - "es": "¿Cuál es uno de los personajes de la obra literaria % ?", - "en": "Who is one of the characters in the literary work %?" - } - ] - }, - "cine": { - "entity": "Q11424", - "props": ["P577", "P57", "P2130"], - "types": ["date", "str", "num"], - "preguntas": [ - { - "es": "¿En qué fecha se estrenó el film % ?", - "en": "On what date was the film % released?" - }, - { - "es": "¿Quién es director de la película % ?", - "en": "Who is the director of the movie %?" - }, - { - "es": "¿Cuál fue el presupuesto (en USD) de la película % ?", - "en": "What was the budget (in USD) of the movie %?" - } - ] - }, - "arte": { - "entity": "Q3305213", - "props": ["P571", "P135", "P276"], - "types": ["date", "str", "str"], - "preguntas": [ - { - "es": "¿En qué año se pintó la obra % ?", - "en": "In what year was the artwork % painted?" - }, - { - "es": "¿A qué movimiento artístico pertenece la obra % ?", - "en": "To which artistic movement does the artwork % belong?" - }, - { - "es": "¿Dónde está exhibida la obra % ?", - "en": "Where is the artwork % exhibited?" - } - ] - }, - "programacion": { - "entity": "Q9143", - "props": ["P571", "P287", "P348", "P1195"], - "types": ["date", "str", "str", "str"], - "preguntas": [ - { - "es": "¿En qué fecha se creó el lenguaje de programación % ?", - "en": "On what date was the programming language % created?" - }, - { - "es": "¿Quién es el creador del lenguaje de programación % ?", - "en": "Who is the creator of the programming language %?" - }, - { - "es": "¿Cuál es la última versión del lenguaje de programación % ?", - "en": "What is the latest version of the programming language %?" - }, - { - "es": "¿Cuál es una de las extensiones usadas por el lenguaje de programación % ?", - "en": "What is one of the extensions used by the programming language %?" - } - ] - } + "paises": { + "entity": "wdt:P31 wd:Q6256", + "props": [ + "P36", + "P35", + "P1344", + "P37", + "P47", + "P2250", + "P571", + "P122", + "P1451" + ], + "types": ["str", "str", "str", "str", "str", "num", "date", "str", "str"], + "preguntas": [ + { + "es": "¿Cuál es la capital de %?", + "en": "What is the capital of %?" + }, + { + "es": "¿Quién es el jefe de estado de % ?", + "en": "Who is the head of state of %?" + }, + { + "es": "¿En qué evento histórico participó %?", + "en": "In what historical event did % participate?" + }, + { + "es": "¿Cuál es uno de los idiomas oficiales de %?", + "en": "What is one of the official languages of %?" + }, + { + "es": "¿Con qué país comparte frontera %?", + "en": "Which country shares a border with %?" + }, + { + "es": "¿Cuál es la esperanza de vida media de %?", + "en": "What is the average life expectancy of %?" + }, + { + "es": "¿En qué fecha se fundó %?", + "en": "On what date was % founded?" + }, + { + "es": "¿Cuál es la forma de gobierno de %?", + "en": "What is the form of government of %?" + }, + { + "es": "¿Cuál es el lema de %?", + "en": "What is the motto of %?" + } + ] + }, + "literatura": { + "entity": "wdt:P31 wd:Q7725634", + "props": ["P50", "P577", "P136", "P674"], + "types": ["str", "date", "str", "str"], + "preguntas": [ + { + "es": "¿Quién es el autor de la obra literaria %?", + "en": "Who is the author of the literary work %?" + }, + { + "es": "¿Cuál fue la fecha de publicación de la obra literaria %?", + "en": "What was the publication date of the literary work %?" + }, + { + "es": "¿Cuál es el género de la obra literaria %?", + "en": "What is the genre of the literary work %?" + }, + { + "es": "¿Cuál es uno de los personajes de la obra literaria %?", + "en": "Who is one of the characters in the literary work %?" + } + ] + }, + "cine": { + "entity": "wdt:P31 wd:Q11424", + "props": ["P577", "P57", "P2130"], + "types": ["date", "str", "num"], + "preguntas": [ + { + "es": "¿En qué fecha se estrenó el film %?", + "en": "On what date was the film % released?" + }, + { + "es": "¿Quién es director de la película %?", + "en": "Who is the director of the movie %?" + }, + { + "es": "¿Cuál fue el presupuesto (en USD) de la película %?", + "en": "What was the budget (in USD) of the movie %?" + } + ] + }, + "arte": { + "entity": "wdt:P31 wd:Q3305213", + "props": ["P571", "P135", "P276"], + "types": ["date", "str", "str"], + "preguntas": [ + { + "es": "¿En qué año se pintó la obra %?", + "en": "In what year was the artwork % painted?" + }, + { + "es": "¿A qué movimiento artístico pertenece la obra %?", + "en": "To which artistic movement does the artwork % belong?" + }, + { + "es": "¿Dónde está exhibida la obra %?", + "en": "Where is the artwork % exhibited?" + } + ] + }, + "programacion": { + "entity": "wdt:P31 wd:Q9143", + "props": ["P571", "P287", "P348", "P1195"], + "types": ["date", "str", "str", "str"], + "preguntas": [ + { + "es": "¿En qué fecha se creó el lenguaje de programación %?", + "en": "On what date was the programming language % created?" + }, + { + "es": "¿Quién es el creador del lenguaje de programación %?", + "en": "Who is the creator of the programming language %?" + }, + { + "es": "¿Cuál es la última versión del lenguaje de programación %?", + "en": "What is the latest version of the programming language %?" + }, + { + "es": "¿Cuál es una de las extensiones usadas por el lenguaje de programación %?", + "en": "What is one of the extensions used by the programming language %?" + } + ] + }, + "futbolistas": { + "entity": "wdt:P106 wd:Q937857", + "props": ["P569", "P413", "P1618", "P2048", "P103"], + "types": ["date", "str", "str", "str", "str"], + "preguntas": [ + { + "es": "¿En qué fecha nació el futbolista %?", + "en": "On what date was the footballer % born?" + }, + { + "es": "¿En posición juega el futbolista %?", + "en": "In what position does the footballer % play?" + }, + { + "es": "¿Qué número de camiseta usa el futbolista %?", + "en": "What shirt number does the footballer % wear?" + }, + { + "es": "¿Cuál es la altura del futbolista %?", + "en": "What is the height of the footballer %?" + }, + { + "es": "¿Cuál es la lengua materna del futbolista %?", + "en": "What is the mother tongue of the footballer %?" + } + ] + }, + "clubes": { + "entity": "wdt:P31 wd:Q476028", + "props": ["P571", "P159", "P17", "P112", "P115", "P286"], + "types": ["date", "str", "str", "str", "str"], + "preguntas": [ + { + "es": "¿En qué año se fundó el club de fútbol %?", + "en": "In what year was the club % founded?" + }, + { + "es": "¿En qué ciudad se encuentra la sede del club de fútbol %?", + "en": "In what city is the headquarters of the club %?" + }, + { + "es": "¿De qué país es originario el club de fútbol %?", + "en": "From which country is the club %?" + }, + { + "es": "¿Quién es el fundador el club de fútbol %?", + "en": "Who is the founder of the football club %?" + }, + { + "es": "¿Cuál es el estadio del club de fútbol %?", + "en": "What is the stadium of the football club %?" + }, + { + "es": "¿Cuál es el entrenador del club de fútbol %?", + "en": "Who is the coach of the football club %?" + } + ] + }, + "baloncestistas": { + "entity": "wdt:P106 wd:Q3665646", + "props": ["P413", "P2031", "P54", "P2048", "P1618"], + "types": ["str", "date", "str", "str", "str"], + "preguntas": [ + { + "es": "¿En qué posición juega el baloncestista %?", + "en": "In what position does the basketball player % play?" + }, + { + "es": "¿Cuál es la fecha de inicio de la carrera del baloncestista %?", + "en": "What is the start date of the basketball player % career?" + }, + { + "es": "¿Cuál es el equipo actual del baloncestista %?", + "en": "What is the current team of the basketball player %?" + }, + { + "es": "¿Cuál es la altura del baloncestista %?", + "en": "What is the height of the basketball player %?" + }, + { + "es": "¿Cuál es el número del baloncestista %?", + "en": "What is the number of the basketball player %?" + } + ] + }, + "politica": { + "entity": "wdt:P31 wd:Q6065085", + "props": ["P571", "P112", "P3975", "P1387", "P1142"], + "types": ["date", "str", "str", "str", "str"], + "preguntas": [ + { + "es": "¿En qué fecha se fundó el partido político %?", + "en": "On what date was the political party % founded?" + }, + { + "es": "¿Quién es el fundador del partido político %?", + "en": "Who is the founder of the political party %?" + }, + { + "es": "¿Quién es el secretario general del partido político %?", + "en": "Who is the general secretary of the political party %?" + }, + { + "es": "¿Cuál es la posición en el espectro político del partido %?", + "en": "What is the position on the political spectrum of the party %?" + }, + { + "es": "¿Cuál es una de las ideologías del partido político %?", + "en": "What is one of the ideologies of the political party %?" + } + ] + }, + "videojuegos": { + "entity": "wdt:P31 wd:Q7889", + "props": ["P136", "P123", "P495", "P577", "P57"], + "types": ["str", "str", "str", "date", "str"], + "preguntas": [ + { + "es": "¿Cuál es el género del videojuego %?", + "en": "What is the genre of the video game %?" + }, + { + "es": "¿Quién es el desarrollador del videojuego %?", + "en": "Who is the developer of the video game %?" + }, + { + "es": "¿En qué país se desarrolló el videojuego %?", + "en": "In which country was the video game % developed?" + }, + { + "es": "¿En qué fecha se lanzó el videojuego %?", + "en": "On what date was the video game % released?" + }, + { + "es": "¿Quién es el director del videojuego %?", + "en": "Who is the director of the video game %?" + } + ] + } } diff --git a/questionservice/question-service.js b/questionservice/question-service.js index 60998ab1..d14a3f65 100644 --- a/questionservice/question-service.js +++ b/questionservice/question-service.js @@ -69,7 +69,7 @@ app.post("/questions", async (req, res) => { const tematicasValidas = temas.length !== 0 ? temas - : ["paises", "literatura", "cine", "arte", "programacion"]; + : ["paises", "literatura", "cine", "arte", "programacion", "futbolistas", "clubes", "baloncestistas", "politica", "videojuegos"]; const cantidadPreguntas = parseInt(n, 10); const data = gen.getQuestionsPost(tematicasValidas, cantidadPreguntas, locale); res.json(data); diff --git a/questionservice/questionGen/GenericGenerator.js b/questionservice/questionGen/GenericGenerator.js index 1cf277f2..b92499c9 100644 --- a/questionservice/questionGen/GenericGenerator.js +++ b/questionservice/questionGen/GenericGenerator.js @@ -67,13 +67,13 @@ class GenericGenerator { this.props ).join(" ")} WHERE { - ?entity wdt:P31 wd:${this.entity}; + ?entity ${this.entity}; ${this.#generateProps(this.props)} . SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es" } } LIMIT 10000 `; - + const url = `https://query.wikidata.org/sparql?query=${encodeURIComponent( sparqlQuery )}&format=json`; @@ -102,19 +102,19 @@ class GenericGenerator { var respuestaCorrecta = ""; var propIndex = 0; - do{ + do { propIndex = Math.floor(Math.random() * propiedades.length); var propiedadPregunta = propiedades[propIndex]; // Obtener la respuesta correcta respuestaCorrecta = entidad[propiedadPregunta][entidad[propiedadPregunta].length - 1]; - }while(/^Q\d+/.test(respuestaCorrecta)); + } while (/^Q\d+/.test(respuestaCorrecta)); var questionObj = { pregunta: "", respuestas: [respuestaCorrecta], - correcta: respuestaCorrecta + correcta: respuestaCorrecta, }; // Obtener respuestas incorrectas @@ -130,7 +130,6 @@ class GenericGenerator { !entidad[propiedadPregunta].includes(prop) && !/^Q\d+/.test(prop) && entidadLabel != prop - ) { questionObj.respuestas.push(prop); } @@ -139,21 +138,26 @@ class GenericGenerator { // Barajar las opciones de respuesta questionObj.respuestas.sort(() => Math.random() - 0.5); - switch(this.types[propIndex]){ + switch (this.types[propIndex]) { case "date": - questionObj.respuestas = questionObj.respuestas.map(x => this.#dateFormatter(x)); + questionObj.respuestas = questionObj.respuestas.map((x) => + this.#dateFormatter(x) + ); questionObj.correcta = this.#dateFormatter(questionObj.correcta); break; case "num": - questionObj.respuestas = questionObj.respuestas.map(x => parseFloat(x).toFixed(2)); + questionObj.respuestas = questionObj.respuestas.map((x) => + parseFloat(x).toFixed(2) + ); questionObj.correcta = parseFloat(questionObj.correcta).toFixed(2); break; default: break; } - questionObj.pregunta = - this.preguntasMap.get(propiedadPregunta)[locale].replace('%', entidadLabel); - + questionObj.pregunta = this.preguntasMap + .get(propiedadPregunta) + [locale].replace("%", entidadLabel); + return questionObj; } @@ -170,18 +174,20 @@ class GenericGenerator { #dateFormatter(fecha) { var isAC = false; - if(fecha.startsWith('-')){ - isAC = true; - fecha = fecha.substring(1); + if (fecha.startsWith("-")) { + isAC = true; + fecha = fecha.substring(1); } - const [año, mes, dia] = fecha.split('T')[0].split('-').map(n => Number.parseInt(n).toFixed()); + const [año, mes, dia] = fecha + .split("T")[0] + .split("-") + .map((n) => Number.parseInt(n).toFixed()); - const fechaFormateada = `${dia}/${mes}/${año}${isAC ? ' a.C.' : ''}`; - - return fechaFormateada; -} + const fechaFormateada = `${dia}/${mes}/${año}${isAC ? " a.C." : ""}`; + return fechaFormateada; + } } module.exports = GenericGenerator; diff --git a/users/userservice/user-service.js b/users/userservice/user-service.js index eae3ca76..6823d844 100644 --- a/users/userservice/user-service.js +++ b/users/userservice/user-service.js @@ -272,7 +272,7 @@ app.post("/saveGameList", async (req, res) => { } const gameDataWithGamemode = { ...gameData, gamemode, questions }; - if(gamemode!=="classic" && gamemode!=="bateria" && gamemode!=="calculadora"){ + if(gamemode!=="clasico" && gamemode!=="bateria" && gamemode!=="calculadora"){ return res.status(422).json({ error: "Invalid gamemode" }); } diff --git a/users/userservice/user-service.test.js b/users/userservice/user-service.test.js index 9b993b09..87cb723e 100644 --- a/users/userservice/user-service.test.js +++ b/users/userservice/user-service.test.js @@ -94,7 +94,7 @@ describe("User Service", () => { // Datos de la partida a guardar const gameData = { username: "testuser", - gameMode: "classic", + gameMode: "clasico", gameData: { points: 100, correctAnswers: 8, @@ -115,7 +115,7 @@ describe("User Service", () => { // Datos de la partida a guardar const gameData = { username: "testuseraaa", - gameMode: "classic", + gameMode: "clasico", gameData: { points: 100, correctAnswers: 8, diff --git a/webapp/src/index.js b/webapp/src/index.js index 9e56989d..405d7f6d 100644 --- a/webapp/src/index.js +++ b/webapp/src/index.js @@ -13,7 +13,7 @@ const root = ReactDOM.createRoot(r); localStorage.setItem( "selectedThemes", - JSON.stringify(["paises", "literatura", "cine", "arte", "programacion"]) + JSON.stringify(["paises", "literatura", "cine", "arte", "programacion", "futbolistas", "clubes", "baloncestistas", "politica", "videojuegos"]) ); localStorage.setItem("clasicoTime", 10); localStorage.setItem("clasicoPreguntas", 10); diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index f609cabe..0cf88c18 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -98,6 +98,11 @@ "cinema": "Cinema", "art": "Art", "programming": "Programming", + "futbolistas": "Football players", + "clubes": "Footbal clubs", + "baloncestistas": "Basketball players", + "politica": "Politics", + "videojuegos": "Videogames", "save": "Apply Changes", "timeBetweenClassic": "Time Between Questions (Classic)", "questionCountClassic": "Number of Questions (Classic)", diff --git a/webapp/src/locales/es.json b/webapp/src/locales/es.json index 77ef1f57..df2ec035 100644 --- a/webapp/src/locales/es.json +++ b/webapp/src/locales/es.json @@ -98,6 +98,11 @@ "cinema": "Cine", "art": "Arte", "programming": "Programación", + "futbolistas": "Futbolistas", + "clubes": "Clubes de fútbol", + "baloncestistas": "Jugadores de baloncesto", + "politica": "Política", + "videojuegos": "Videojuegos", "save": "Aplicar cambios", "timeBetweenClassic": "Tiempo entre preguntas (Clásico)", "questionCountClassic": "Número de preguntas (Clásico)", diff --git a/webapp/src/pages/Config/Config.js b/webapp/src/pages/Config/Config.js index f8197f00..c1437f24 100644 --- a/webapp/src/pages/Config/Config.js +++ b/webapp/src/pages/Config/Config.js @@ -19,7 +19,7 @@ import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; const Config = () => { - const { t, i18n} = useTranslation(); + const { t, i18n } = useTranslation(); useEffect(() => { // Obtener el estado de los checkboxes desde el localStorage @@ -86,45 +86,62 @@ const Config = () => { <>