From b472174d5e39ddabfd3f55636e09bbfe3fa7287b Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 6 Feb 2024 20:33:09 +0100 Subject: [PATCH 01/24] =?UTF-8?q?Varios=20generadores=20a=C3=B1adidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/questionGen/countries/capitalQuestions.js | 45 ++++++++++++ .../countries/foundationQuestion.js | 47 +++++++++++++ .../countries/languageQuestions.js | 69 +++++++++++++++++++ package-lock.json | 57 +++++++++++++++ package.json | 2 + 5 files changed, 220 insertions(+) create mode 100644 api/questionGen/countries/capitalQuestions.js create mode 100644 api/questionGen/countries/foundationQuestion.js create mode 100644 api/questionGen/countries/languageQuestions.js diff --git a/api/questionGen/countries/capitalQuestions.js b/api/questionGen/countries/capitalQuestions.js new file mode 100644 index 00000000..99c7bf30 --- /dev/null +++ b/api/questionGen/countries/capitalQuestions.js @@ -0,0 +1,45 @@ +const { fetch } = require('cross-fetch'); + +async function consultaSPARQL() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?capitalLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P36 ?capital. # Obtiene la capital de cada país + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + country: binding.countryLabel.value, + capital: binding.capitalLabel.value + })); +} + +async function obtenerPregunta() { + const sparqlResult = await consultaSPARQL(); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedCountry = sparqlResult[randomIndex]; + + const pregunta = `¿Cuál es el idioma oficial de ${selectedCountry.country}?`; + const respuestas = sparqlResult.map(result => result.capital); + const respuestaCorrecta = selectedCountry.capital; + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/foundationQuestion.js b/api/questionGen/countries/foundationQuestion.js new file mode 100644 index 00000000..ed795896 --- /dev/null +++ b/api/questionGen/countries/foundationQuestion.js @@ -0,0 +1,47 @@ +const { fetch } = require('cross-fetch'); +const { format } = require('date-fns'); +const { es } = require('date-fns/locale'); + +async function consultaSPARQL() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?foundationLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P571 ?foundation. # Obtiene la fecha de fundación de cada país + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + country: binding.countryLabel.value, + foundation: binding.foundationLabel.value + })); +} + +async function obtenerPregunta() { + const sparqlResult = await consultaSPARQL(); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedCountry = sparqlResult[randomIndex]; + + const pregunta = `¿Cuál fue la fecha de fundación de ${selectedCountry.country}?`; + const respuestas = sparqlResult.map(result => result.foundation).map(f => format(new Date(f), "dd 'de' MMMM 'de' yyyy", { locale: es })); + const respuestaCorrecta = format(new Date(selectedCountry.foundation), "dd 'de' MMMM 'de' yyyy", { locale: es }); + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/languageQuestions.js b/api/questionGen/countries/languageQuestions.js new file mode 100644 index 00000000..646aea28 --- /dev/null +++ b/api/questionGen/countries/languageQuestions.js @@ -0,0 +1,69 @@ +const { fetch } = require('cross-fetch'); + +async function consultarIdiomaOficialAleatorio() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?idiomaLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P37 ?idioma. # Obtiene el idioma oficial de cada país + ?idioma wdt:P31 wd:Q34770. # Selecciona entidades que son idiomas + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 1 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + if (data.results.bindings.length === 0) { + return "No se pudo encontrar información sobre el idioma oficial de un país en Wikidata."; + } + + const country = data.results.bindings[0].countryLabel.value; + const idiomaOficial = data.results.bindings[0].idiomaLabel.value; + + // Generar otras tres opciones de idioma + const opcionesIdioma = await generarOpcionesIdioma(idiomaOficial); + + const formato = { + pregunta: `¿Cuál es el idioma oficial de ${country}?`, + respuestas: opcionesIdioma, + respuestaCorrecta: idiomaOficial + }; + + return formato; +} + +async function generarOpcionesIdioma(respuestaCorrecta) { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?idiomaLabel WHERE { + ?idioma wdt:P31 wd:Q34770. # Selecciona entidades que son idiomas + FILTER(?idioma != wd:${respuestaCorrecta.replace(/\s/g, '_')}) + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 3 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + const opciones = data.results.bindings.map(binding => binding.idiomaLabel.value); + opciones.push(respuestaCorrecta); // Agregar la respuesta correcta al final + + return opciones; +} + +consultarIdiomaOficialAleatorio() + .then(formato => console.log(formato)) + .catch(error => console.error("Error:", error)); diff --git a/package-lock.json b/package-lock.json index 1c5472ed..0add4cee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,8 @@ "packages": { "": { "dependencies": { + "cross-fetch": "^4.0.0", + "date-fns": "^3.3.1", "react-auth-kit": "^3.0.2-alpha.19" } }, @@ -205,6 +207,23 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "peer": true }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/date-fns": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -301,6 +320,25 @@ } } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -432,10 +470,29 @@ } } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } } diff --git a/package.json b/package.json index 2d4da84c..eed5c7aa 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,7 @@ { "dependencies": { + "cross-fetch": "^4.0.0", + "date-fns": "^3.3.1", "react-auth-kit": "^3.0.2-alpha.19" } } From 2522a45bd78064578ced67d8f058e34d8a065a07 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 6 Feb 2024 21:16:16 +0100 Subject: [PATCH 02/24] =?UTF-8?q?M=C3=A1s=20generadores=20de=20preguntas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../countries/HeadOfStateQuestions.js | 46 +++++++++++++++++ .../countries/HistoricEventQuestions.js | 49 +++++++++++++++++++ .../countries/LifeExpectancyQuestions.js | 47 ++++++++++++++++++ api/questionGen/countries/capitalQuestions.js | 1 + .../countries/foundationQuestion.js | 1 + 5 files changed, 144 insertions(+) create mode 100644 api/questionGen/countries/HeadOfStateQuestions.js create mode 100644 api/questionGen/countries/HistoricEventQuestions.js create mode 100644 api/questionGen/countries/LifeExpectancyQuestions.js diff --git a/api/questionGen/countries/HeadOfStateQuestions.js b/api/questionGen/countries/HeadOfStateQuestions.js new file mode 100644 index 00000000..d86bafaa --- /dev/null +++ b/api/questionGen/countries/HeadOfStateQuestions.js @@ -0,0 +1,46 @@ +const { fetch } = require('cross-fetch'); + +async function consultaSPARQL() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?headLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P35 ?head. # Obtiene la forma de gobierno de cada país + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + country: binding.countryLabel.value, + head: binding.headLabel.value + })); +} + +async function obtenerPregunta() { + const sparqlResult = await consultaSPARQL(); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedCountry = sparqlResult[randomIndex]; + + const pregunta = `¿Quién es el jefe de estado de ${selectedCountry.country}?`; + const respuestas = sparqlResult.map(result => result.head); + const respuestaCorrecta = selectedCountry.head; + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/HistoricEventQuestions.js b/api/questionGen/countries/HistoricEventQuestions.js new file mode 100644 index 00000000..0f38bbfb --- /dev/null +++ b/api/questionGen/countries/HistoricEventQuestions.js @@ -0,0 +1,49 @@ +const { fetch } = require('cross-fetch'); +const { format } = require('date-fns'); +const { es } = require('date-fns/locale'); + +//TODO: Hay algunos eventos que salen como entidad (ej. Q3293979) en vez de su nombre). Hay que solucionarlo +async function consultaSPARQL() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?eventLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P1344 ?event. # Obtiene la fecha de un evento histórico en el que participó de cada país + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + country: binding.countryLabel.value, + event: binding.eventLabel.value + })); +} + +async function obtenerPregunta() { + const sparqlResult = await consultaSPARQL(); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedCountry = sparqlResult[randomIndex]; + + const pregunta = `¿En qué evento histórico participó ${selectedCountry.country}?`; + const respuestas = sparqlResult.map(result => result.event); + const respuestaCorrecta = selectedCountry.event; + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/LifeExpectancyQuestions.js b/api/questionGen/countries/LifeExpectancyQuestions.js new file mode 100644 index 00000000..3bc61269 --- /dev/null +++ b/api/questionGen/countries/LifeExpectancyQuestions.js @@ -0,0 +1,47 @@ +const { fetch } = require('cross-fetch'); +const { format } = require('date-fns'); +const { es } = require('date-fns/locale'); + +async function consultaSPARQL() { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?countryLabel ?lifeLabel WHERE { + ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países + wdt:P2250 ?life. # Obtiene la esperanza de vida media del país + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + country: binding.countryLabel.value, + lifeExpectancy: binding.lifeLabel.value + })); +} + +async function obtenerPregunta() { + const sparqlResult = await consultaSPARQL(); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedCountry = sparqlResult[randomIndex]; + const pregunta = `¿Cuál es la esperanza de vida media de ${selectedCountry.country}?`; + const respuestas = sparqlResult.map(result => result.lifeExpectancy).map(x => Math.floor(x)); + const respuestaCorrecta = Math.floor(selectedCountry.lifeExpectancy); + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/capitalQuestions.js b/api/questionGen/countries/capitalQuestions.js index 99c7bf30..f36b583e 100644 --- a/api/questionGen/countries/capitalQuestions.js +++ b/api/questionGen/countries/capitalQuestions.js @@ -9,6 +9,7 @@ async function consultaSPARQL() { wdt:P36 ?capital. # Obtiene la capital de cada país SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } } + ORDER BY UUID() LIMIT 4 `; diff --git a/api/questionGen/countries/foundationQuestion.js b/api/questionGen/countries/foundationQuestion.js index ed795896..d283b5ae 100644 --- a/api/questionGen/countries/foundationQuestion.js +++ b/api/questionGen/countries/foundationQuestion.js @@ -11,6 +11,7 @@ async function consultaSPARQL() { wdt:P571 ?foundation. # Obtiene la fecha de fundación de cada país SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } } + ORDER BY UUID() LIMIT 4 `; From 76624796ca5d87599f20209b49b8a8ff077477b6 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 6 Feb 2024 21:31:37 +0100 Subject: [PATCH 03/24] =?UTF-8?q?A=C3=B1adido=20automatizador=20de=20gener?= =?UTF-8?q?aci=C3=B3n=20de=20preguntas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../countries/QuestionAutomatizer.js | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 api/questionGen/countries/QuestionAutomatizer.js diff --git a/api/questionGen/countries/QuestionAutomatizer.js b/api/questionGen/countries/QuestionAutomatizer.js new file mode 100644 index 00000000..e0ffae70 --- /dev/null +++ b/api/questionGen/countries/QuestionAutomatizer.js @@ -0,0 +1,47 @@ +const { fetch } = require('cross-fetch'); + +// q es la entidad, p la propiedad +async function consultaSPARQL(q, p) { + const endpointUrl = 'https://query.wikidata.org/sparql'; + + const query = ` + SELECT DISTINCT ?entityLabel ?propertyLabel WHERE { + ?entity wdt:P31 wd:${q}; # Selecciona entidades que son países + wdt:${p} ?property. # Obtiene la propiedad deseada + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + ORDER BY UUID() + LIMIT 4 + `; + + const encodedQuery = encodeURIComponent(query); + const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; + + const response = await fetch(sparqlUrl); + const data = await response.json(); + + return data.results.bindings.map(binding => ({ + entity: binding.entityLabel.value, + property: binding.propertyLabel.value + })); +} + +async function obtenerPregunta(q, p, question, formatter = x => x) { + const sparqlResult = await consultaSPARQL(q, p); + const randomIndex = Math.floor(Math.random() * sparqlResult.length); + const selectedEntity = sparqlResult[randomIndex]; + + const pregunta = `${question} ${selectedEntity.entity}?`; + const respuestas = sparqlResult.map(result => result.property).map(x => formatter(x)); + const respuestaCorrecta = formatter(selectedEntity.property); + + const formato = { + pregunta: pregunta, + respuestas: respuestas, + respuestaCorrecta: respuestaCorrecta + }; + + return formato; +} + +obtenerPregunta("Q6256", "P36", "¿Cuál es la capital de ").then(pregunta => console.log(pregunta)); From 6a53c8d306bbd29f12fef36e8f52342ea93fe41f Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 6 Feb 2024 21:33:00 +0100 Subject: [PATCH 04/24] =?UTF-8?q?Nombres=20m=C3=A1s=20intuitivos=20en=20lo?= =?UTF-8?q?s=20par=C3=A1metros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/questionGen/countries/QuestionAutomatizer.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/questionGen/countries/QuestionAutomatizer.js b/api/questionGen/countries/QuestionAutomatizer.js index e0ffae70..417b1703 100644 --- a/api/questionGen/countries/QuestionAutomatizer.js +++ b/api/questionGen/countries/QuestionAutomatizer.js @@ -1,13 +1,13 @@ const { fetch } = require('cross-fetch'); // q es la entidad, p la propiedad -async function consultaSPARQL(q, p) { +async function consultaSPARQL(entity, property) { const endpointUrl = 'https://query.wikidata.org/sparql'; const query = ` SELECT DISTINCT ?entityLabel ?propertyLabel WHERE { - ?entity wdt:P31 wd:${q}; # Selecciona entidades que son países - wdt:${p} ?property. # Obtiene la propiedad deseada + ?entity wdt:P31 wd:${entity}; # Selecciona entidades que son países + wdt:${property} ?property. # Obtiene la propiedad deseada SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } } ORDER BY UUID() @@ -26,8 +26,8 @@ async function consultaSPARQL(q, p) { })); } -async function obtenerPregunta(q, p, question, formatter = x => x) { - const sparqlResult = await consultaSPARQL(q, p); +async function obtenerPregunta(entity, property, question, formatter = x => x) { + const sparqlResult = await consultaSPARQL(entity, property); const randomIndex = Math.floor(Math.random() * sparqlResult.length); const selectedEntity = sparqlResult[randomIndex]; From 68f144140fca8438ee8c5fe9f8734b7afd66726e Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Sat, 10 Feb 2024 11:57:09 +0100 Subject: [PATCH 05/24] =?UTF-8?q?Se=20ha=20optimizado=20el=20sistema=20de?= =?UTF-8?q?=20generaci=C3=B3n=20de=20preguntas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../countries/HeadOfStateQuestions.js | 46 ------------- .../countries/HistoricEventQuestions.js | 49 ------------- .../countries/LifeExpectancyQuestions.js | 47 ------------- .../countries/QuestionAutomatizer.js | 50 ++++++++++++-- api/questionGen/countries/capitalQuestions.js | 46 ------------- .../countries/foundationQuestion.js | 48 ------------- .../countries/languageQuestions.js | 69 ------------------- webapp/src/pages/Home/Home.js | 4 +- 8 files changed, 49 insertions(+), 310 deletions(-) delete mode 100644 api/questionGen/countries/HeadOfStateQuestions.js delete mode 100644 api/questionGen/countries/HistoricEventQuestions.js delete mode 100644 api/questionGen/countries/LifeExpectancyQuestions.js delete mode 100644 api/questionGen/countries/capitalQuestions.js delete mode 100644 api/questionGen/countries/foundationQuestion.js delete mode 100644 api/questionGen/countries/languageQuestions.js diff --git a/api/questionGen/countries/HeadOfStateQuestions.js b/api/questionGen/countries/HeadOfStateQuestions.js deleted file mode 100644 index d86bafaa..00000000 --- a/api/questionGen/countries/HeadOfStateQuestions.js +++ /dev/null @@ -1,46 +0,0 @@ -const { fetch } = require('cross-fetch'); - -async function consultaSPARQL() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?headLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P35 ?head. # Obtiene la forma de gobierno de cada país - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 4 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - return data.results.bindings.map(binding => ({ - country: binding.countryLabel.value, - head: binding.headLabel.value - })); -} - -async function obtenerPregunta() { - const sparqlResult = await consultaSPARQL(); - const randomIndex = Math.floor(Math.random() * sparqlResult.length); - const selectedCountry = sparqlResult[randomIndex]; - - const pregunta = `¿Quién es el jefe de estado de ${selectedCountry.country}?`; - const respuestas = sparqlResult.map(result => result.head); - const respuestaCorrecta = selectedCountry.head; - - const formato = { - pregunta: pregunta, - respuestas: respuestas, - respuestaCorrecta: respuestaCorrecta - }; - - return formato; -} - -obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/HistoricEventQuestions.js b/api/questionGen/countries/HistoricEventQuestions.js deleted file mode 100644 index 0f38bbfb..00000000 --- a/api/questionGen/countries/HistoricEventQuestions.js +++ /dev/null @@ -1,49 +0,0 @@ -const { fetch } = require('cross-fetch'); -const { format } = require('date-fns'); -const { es } = require('date-fns/locale'); - -//TODO: Hay algunos eventos que salen como entidad (ej. Q3293979) en vez de su nombre). Hay que solucionarlo -async function consultaSPARQL() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?eventLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P1344 ?event. # Obtiene la fecha de un evento histórico en el que participó de cada país - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 4 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - return data.results.bindings.map(binding => ({ - country: binding.countryLabel.value, - event: binding.eventLabel.value - })); -} - -async function obtenerPregunta() { - const sparqlResult = await consultaSPARQL(); - const randomIndex = Math.floor(Math.random() * sparqlResult.length); - const selectedCountry = sparqlResult[randomIndex]; - - const pregunta = `¿En qué evento histórico participó ${selectedCountry.country}?`; - const respuestas = sparqlResult.map(result => result.event); - const respuestaCorrecta = selectedCountry.event; - - const formato = { - pregunta: pregunta, - respuestas: respuestas, - respuestaCorrecta: respuestaCorrecta - }; - - return formato; -} - -obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/LifeExpectancyQuestions.js b/api/questionGen/countries/LifeExpectancyQuestions.js deleted file mode 100644 index 3bc61269..00000000 --- a/api/questionGen/countries/LifeExpectancyQuestions.js +++ /dev/null @@ -1,47 +0,0 @@ -const { fetch } = require('cross-fetch'); -const { format } = require('date-fns'); -const { es } = require('date-fns/locale'); - -async function consultaSPARQL() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?lifeLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P2250 ?life. # Obtiene la esperanza de vida media del país - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 4 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - return data.results.bindings.map(binding => ({ - country: binding.countryLabel.value, - lifeExpectancy: binding.lifeLabel.value - })); -} - -async function obtenerPregunta() { - const sparqlResult = await consultaSPARQL(); - const randomIndex = Math.floor(Math.random() * sparqlResult.length); - const selectedCountry = sparqlResult[randomIndex]; - const pregunta = `¿Cuál es la esperanza de vida media de ${selectedCountry.country}?`; - const respuestas = sparqlResult.map(result => result.lifeExpectancy).map(x => Math.floor(x)); - const respuestaCorrecta = Math.floor(selectedCountry.lifeExpectancy); - - const formato = { - pregunta: pregunta, - respuestas: respuestas, - respuestaCorrecta: respuestaCorrecta - }; - - return formato; -} - -obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/QuestionAutomatizer.js b/api/questionGen/countries/QuestionAutomatizer.js index 417b1703..00b53c07 100644 --- a/api/questionGen/countries/QuestionAutomatizer.js +++ b/api/questionGen/countries/QuestionAutomatizer.js @@ -1,4 +1,6 @@ const { fetch } = require('cross-fetch'); +const { format } = require('date-fns'); +const { es } = require('date-fns/locale'); // q es la entidad, p la propiedad async function consultaSPARQL(entity, property) { @@ -26,12 +28,15 @@ async function consultaSPARQL(entity, property) { })); } -async function obtenerPregunta(entity, property, question, formatter = x => x) { - const sparqlResult = await consultaSPARQL(entity, property); +async function obtenerPregunta(questionType, formatter = x => x) { + if(questionType.formatter){ + formatter = questionType.formatter + } + const sparqlResult = await consultaSPARQL(questionType.entity, questionType.property); const randomIndex = Math.floor(Math.random() * sparqlResult.length); const selectedEntity = sparqlResult[randomIndex]; - const pregunta = `${question} ${selectedEntity.entity}?`; + const pregunta = `${questionType.question} ${selectedEntity.entity}?`; const respuestas = sparqlResult.map(result => result.property).map(x => formatter(x)); const respuestaCorrecta = formatter(selectedEntity.property); @@ -44,4 +49,41 @@ async function obtenerPregunta(entity, property, question, formatter = x => x) { return formato; } -obtenerPregunta("Q6256", "P36", "¿Cuál es la capital de ").then(pregunta => console.log(pregunta)); +var questionTypes = [ + { + "question": "¿Cuál es la capital de", + "entity": "Q6256", + "property": "P36" + }, + { + "question": "¿Cuál fue la fecha de fundación de", + "entity": "Q6256", + "property": "P571", + "formatter": f => format(new Date(f), "dd 'de' MMMM 'de' yyyy", { locale: es }) + }, + { //A veces se repiten los nombres + "question": "¿Quién es el jefe de estado de", + "entity": "Q6256", + "property": "P35" + }, + { //A veces se muestra el nombre de la entidad (Q...) en vez del nombre del evento + "question": "¿En qué evento histórico participó", + "entity": "Q6256", + "property": "P1344" + }, + { //Más de una puede ser correcta + "question": "¿Cuál es uno de los idiomas oficiales de", + "entity": "Q6256", + "property": "P37" + }, + { + "question": "¿Cuál es la esperanza de vida media de", + "entity": "Q6256", + "property": "P2250", + "formatter": x => Math.floor(x) + } +] + +var randomType = questionTypes[Math.floor(Math.random() * questionTypes.length)]; + +obtenerPregunta(randomType).then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/capitalQuestions.js b/api/questionGen/countries/capitalQuestions.js deleted file mode 100644 index f36b583e..00000000 --- a/api/questionGen/countries/capitalQuestions.js +++ /dev/null @@ -1,46 +0,0 @@ -const { fetch } = require('cross-fetch'); - -async function consultaSPARQL() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?capitalLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P36 ?capital. # Obtiene la capital de cada país - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 4 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - return data.results.bindings.map(binding => ({ - country: binding.countryLabel.value, - capital: binding.capitalLabel.value - })); -} - -async function obtenerPregunta() { - const sparqlResult = await consultaSPARQL(); - const randomIndex = Math.floor(Math.random() * sparqlResult.length); - const selectedCountry = sparqlResult[randomIndex]; - - const pregunta = `¿Cuál es el idioma oficial de ${selectedCountry.country}?`; - const respuestas = sparqlResult.map(result => result.capital); - const respuestaCorrecta = selectedCountry.capital; - - const formato = { - pregunta: pregunta, - respuestas: respuestas, - respuestaCorrecta: respuestaCorrecta - }; - - return formato; -} - -obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/foundationQuestion.js b/api/questionGen/countries/foundationQuestion.js deleted file mode 100644 index d283b5ae..00000000 --- a/api/questionGen/countries/foundationQuestion.js +++ /dev/null @@ -1,48 +0,0 @@ -const { fetch } = require('cross-fetch'); -const { format } = require('date-fns'); -const { es } = require('date-fns/locale'); - -async function consultaSPARQL() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?foundationLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P571 ?foundation. # Obtiene la fecha de fundación de cada país - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 4 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - return data.results.bindings.map(binding => ({ - country: binding.countryLabel.value, - foundation: binding.foundationLabel.value - })); -} - -async function obtenerPregunta() { - const sparqlResult = await consultaSPARQL(); - const randomIndex = Math.floor(Math.random() * sparqlResult.length); - const selectedCountry = sparqlResult[randomIndex]; - - const pregunta = `¿Cuál fue la fecha de fundación de ${selectedCountry.country}?`; - const respuestas = sparqlResult.map(result => result.foundation).map(f => format(new Date(f), "dd 'de' MMMM 'de' yyyy", { locale: es })); - const respuestaCorrecta = format(new Date(selectedCountry.foundation), "dd 'de' MMMM 'de' yyyy", { locale: es }); - - const formato = { - pregunta: pregunta, - respuestas: respuestas, - respuestaCorrecta: respuestaCorrecta - }; - - return formato; -} - -obtenerPregunta().then(pregunta => console.log(pregunta)); diff --git a/api/questionGen/countries/languageQuestions.js b/api/questionGen/countries/languageQuestions.js deleted file mode 100644 index 646aea28..00000000 --- a/api/questionGen/countries/languageQuestions.js +++ /dev/null @@ -1,69 +0,0 @@ -const { fetch } = require('cross-fetch'); - -async function consultarIdiomaOficialAleatorio() { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?countryLabel ?idiomaLabel WHERE { - ?country wdt:P31 wd:Q6256; # Selecciona entidades que son países - wdt:P37 ?idioma. # Obtiene el idioma oficial de cada país - ?idioma wdt:P31 wd:Q34770. # Selecciona entidades que son idiomas - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 1 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - if (data.results.bindings.length === 0) { - return "No se pudo encontrar información sobre el idioma oficial de un país en Wikidata."; - } - - const country = data.results.bindings[0].countryLabel.value; - const idiomaOficial = data.results.bindings[0].idiomaLabel.value; - - // Generar otras tres opciones de idioma - const opcionesIdioma = await generarOpcionesIdioma(idiomaOficial); - - const formato = { - pregunta: `¿Cuál es el idioma oficial de ${country}?`, - respuestas: opcionesIdioma, - respuestaCorrecta: idiomaOficial - }; - - return formato; -} - -async function generarOpcionesIdioma(respuestaCorrecta) { - const endpointUrl = 'https://query.wikidata.org/sparql'; - - const query = ` - SELECT DISTINCT ?idiomaLabel WHERE { - ?idioma wdt:P31 wd:Q34770. # Selecciona entidades que son idiomas - FILTER(?idioma != wd:${respuestaCorrecta.replace(/\s/g, '_')}) - SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } - } - ORDER BY UUID() - LIMIT 3 - `; - - const encodedQuery = encodeURIComponent(query); - const sparqlUrl = `${endpointUrl}?query=${encodedQuery}&format=json`; - - const response = await fetch(sparqlUrl); - const data = await response.json(); - - const opciones = data.results.bindings.map(binding => binding.idiomaLabel.value); - opciones.push(respuestaCorrecta); // Agregar la respuesta correcta al final - - return opciones; -} - -consultarIdiomaOficialAleatorio() - .then(formato => console.log(formato)) - .catch(error => console.error("Error:", error)); diff --git a/webapp/src/pages/Home/Home.js b/webapp/src/pages/Home/Home.js index e5d08fda..679d192e 100644 --- a/webapp/src/pages/Home/Home.js +++ b/webapp/src/pages/Home/Home.js @@ -3,14 +3,16 @@ import "./Home.css"; import Nav from '../../components/Nav/Nav.js'; import Footer from '../../components/Footer/Footer.js'; import { Link } from "react-router-dom"; +import useAuthUser from 'react-auth-kit/hooks/useAuthUser'; const Home = () => { + const auth = useAuthUser() return ( <>