fix: promisify getCached that did not work as intended
This commit is contained in:
parent
150da0f844
commit
9d2822709e
@ -41,7 +41,19 @@ async function question(req, res) {
|
|||||||
async function quizz(req, res) {
|
async function quizz(req, res) {
|
||||||
const { region } = req.query;
|
const { region } = req.query;
|
||||||
req.session.region = region;
|
req.session.region = region;
|
||||||
const { locale } = req.i18n.locale;
|
if (region == undefined) {
|
||||||
|
res.status(400).json({
|
||||||
|
error: 'No region specified',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const locale = req.i18n.locale;
|
||||||
|
if (locale == undefined) {
|
||||||
|
res.status(400).json(
|
||||||
|
{
|
||||||
|
error: 'No locale specified'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
quizzController.generateQuizz(region, locale, 10)
|
quizzController.generateQuizz(region, locale, 10)
|
||||||
.then(({ questions, answers, propositions }) => {
|
.then(({ questions, answers, propositions }) => {
|
||||||
res.json({questions, answers, propositions }).send();
|
res.json({questions, answers, propositions }).send();
|
||||||
@ -81,28 +93,10 @@ function check(req, res) {
|
|||||||
res.json(result);
|
res.json(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function birdSpeciesCompletion(req, res) {
|
|
||||||
const { q } = req.query;
|
|
||||||
const locale = req.i18n.locale;
|
|
||||||
const region = req.session.region;
|
|
||||||
if (region === undefined) {
|
|
||||||
res.status(400).json({error: "Your session is not associated with any region yet"});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (q === undefined) {
|
|
||||||
res.status(400).json({error: "No query provided"});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let speciesCompletion = await quizzController.getSpeciesCompletion(region, locale, q);
|
|
||||||
res.json(speciesCompletion);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const game = {
|
const game = {
|
||||||
check,
|
check,
|
||||||
question,
|
question,
|
||||||
quizz,
|
quizz,
|
||||||
birdSpeciesCompletion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
const { json } = require('express');
|
|
||||||
const { redisClient } = require('../redis');
|
const { redisClient } = require('../redis');
|
||||||
const debug = require('debug')('soundbirder:cache');
|
const debug = require('debug')('soundbirder:cache');
|
||||||
|
|
||||||
@ -9,9 +8,9 @@ function cacheResponse(request, response) {
|
|||||||
|
|
||||||
|
|
||||||
async function getCached(request) {
|
async function getCached(request) {
|
||||||
const cached = await redisClient.get(request);
|
let cached = await redisClient.pget(request);
|
||||||
if (cached) {
|
if (cached) {
|
||||||
debug("Got cached response", request);
|
debug("Cached", request);
|
||||||
return JSON.parse(cached);
|
return JSON.parse(cached);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -14,7 +14,7 @@ async function getQuestionCached(region, locale, size) {
|
|||||||
let key = questionKey(region, locale, size);
|
let key = questionKey(region, locale, size);
|
||||||
let quizz = await cache.pop(key);
|
let quizz = await cache.pop(key);
|
||||||
if (!quizz) {
|
if (!quizz) {
|
||||||
quizz = generateQuestion(region, locale, size);
|
quizz = await generateQuestion(region, locale, size);
|
||||||
cache.push(key, quizz);
|
cache.push(key, quizz);
|
||||||
}
|
}
|
||||||
return quizz;
|
return quizz;
|
||||||
@ -64,12 +64,11 @@ async function generateQuestion(region, locale, nb_propositions) {
|
|||||||
async function generateQuizz(region, locale, nb_questions) {
|
async function generateQuizz(region, locale, nb_questions) {
|
||||||
let questions = [];
|
let questions = [];
|
||||||
let answers = [];
|
let answers = [];
|
||||||
const species_in_region = await getSpeciesList(region);
|
let start = Date.now();
|
||||||
const species_in_region_localized = await getLocalizedNames(species_in_region, locale);
|
let species_in_region_localized = await getSpeciesNamesInRegion(region, locale);
|
||||||
console.error(species_in_region_localized);
|
|
||||||
for (let i=0; i < nb_questions; i++) {
|
for (let i=0; i < nb_questions; i++) {
|
||||||
try {
|
try {
|
||||||
let question_species = choice(species_in_region_localize);
|
let question_species = choice(species_in_region_localized);
|
||||||
let question_audio = await getAudio(question_species.sciName);
|
let question_audio = await getAudio(question_species.sciName);
|
||||||
questions.push(question_audio);
|
questions.push(question_audio);
|
||||||
answers.push(question_species);
|
answers.push(question_species);
|
||||||
@ -77,9 +76,24 @@ async function generateQuizz(region, locale, nb_questions) {
|
|||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const millis = Date.now() - start;
|
||||||
|
console.log(`seconds elapsed = ${Math.floor(millis / 1000)}`);
|
||||||
return {questions: questions, answers: answers, propositions: species_in_region_localized};
|
return {questions: questions, answers: answers, propositions: species_in_region_localized};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getSpeciesNamesInRegion(region, locale) {
|
||||||
|
const cacheKey = `region-sppnames-${locale}-${region}`;
|
||||||
|
let cached = await cache.getCached(cacheKey);
|
||||||
|
if (cached && cached != []) {
|
||||||
|
return cached;
|
||||||
|
} else {
|
||||||
|
const species_in_region = await getSpeciesList(region);
|
||||||
|
const species_in_region_localized = await getLocalizedNames(species_in_region, locale);
|
||||||
|
cache.cacheResponse(cacheKey, species_in_region_localized);
|
||||||
|
return species_in_region_localized;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function getSpeciesSelection(region, number) {
|
async function getSpeciesSelection(region, number) {
|
||||||
const regionCode = region;
|
const regionCode = region;
|
||||||
const speciesList = await getSpeciesList(regionCode);
|
const speciesList = await getSpeciesList(regionCode);
|
||||||
@ -98,21 +112,28 @@ async function getLocalizedNames(speciesCodes, locale) {
|
|||||||
return localizedNames;
|
return localizedNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLocalizedName(speciesCode, locale) {
|
async function getLocalizedName(speciesCode, locale) {
|
||||||
return eBird.ref.taxonomy.ebird({
|
const cacheKey = `sppnames-${locale}-${speciesCode}`;
|
||||||
fmt: 'json',
|
const cached = await cache.getCached(cacheKey);
|
||||||
locale: locale,
|
if (cached) {
|
||||||
species: speciesCode
|
return cached;
|
||||||
}).then(
|
} else {
|
||||||
response => {
|
return eBird.ref.taxonomy.ebird({
|
||||||
const names = response[0];
|
fmt: 'json',
|
||||||
debug("Got localized species names");
|
locale: locale,
|
||||||
debugResponses(names);
|
species: speciesCode
|
||||||
return names;
|
}).then(
|
||||||
}
|
response => {
|
||||||
).catch(error => {
|
const names = response[0];
|
||||||
throw error;
|
cache.cacheResponse(cacheKey, names);
|
||||||
});
|
debug("Got localized species names");
|
||||||
|
debugResponses(names);
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
).catch(error => {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getSpeciesList(regionCode) {
|
async function getSpeciesList(regionCode) {
|
||||||
@ -141,32 +162,24 @@ function getAudio(speciesScientificName) {
|
|||||||
quality: 'A'
|
quality: 'A'
|
||||||
}).then(response => {
|
}).then(response => {
|
||||||
const { recordings } = response;
|
const { recordings } = response;
|
||||||
const randomRecord = choice(recordings);
|
let randomRecord;
|
||||||
const audio = randomRecord.file;
|
let audio;
|
||||||
|
for (let i=0; i < 3; i++) {
|
||||||
|
randomRecord = choice(recordings);
|
||||||
|
if ('file' in randomRecord) {
|
||||||
|
audio = randomRecord.file;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return audio;
|
return audio;
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function getSpeciesCompletion(region, locale, term) {
|
|
||||||
let speciesList = await getSpeciesList(region);
|
|
||||||
let localizedSpeciesList = await getLocalizedNames(speciesList, locale);
|
|
||||||
let termLower = term.toLowerCase();
|
|
||||||
let speciesCompletion = localizedSpeciesList.filter(speciesNames => {
|
|
||||||
let { comName, sciName } = speciesNames;
|
|
||||||
let name = comName.toLowerCase();
|
|
||||||
let sci = sciName.toLowerCase();
|
|
||||||
return name.includes(termLower) || sci.includes(termLower);
|
|
||||||
});
|
|
||||||
return speciesCompletion;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
generateQuestion,
|
generateQuestion,
|
||||||
getQuestionCached,
|
getQuestionCached,
|
||||||
getSpeciesCompletion,
|
|
||||||
cacheQuestion,
|
cacheQuestion,
|
||||||
generateQuizz
|
generateQuizz
|
||||||
}
|
}
|
@ -18,5 +18,9 @@
|
|||||||
"Play the quizz": "Play the quizz",
|
"Play the quizz": "Play the quizz",
|
||||||
"About this game": "About this game",
|
"About this game": "About this game",
|
||||||
"Launch a quizz": "Launch a quizz",
|
"Launch a quizz": "Launch a quizz",
|
||||||
"The project is made with ♥ by Samuel Ortion.": "The project is made with ♥ by Samuel Ortion."
|
"The project is made with ♥ by Samuel Ortion.": "The project is made with ♥ by Samuel Ortion.",
|
||||||
|
"Run a question": "Run a question",
|
||||||
|
"Play a quizz": "Play a quizz",
|
||||||
|
"Quizz": "Quizz",
|
||||||
|
"Enter species name": "Enter species name"
|
||||||
}
|
}
|
@ -20,5 +20,8 @@
|
|||||||
"About this game": "À propos de ce jeu",
|
"About this game": "À propos de ce jeu",
|
||||||
"Set language": "Modifier la langue",
|
"Set language": "Modifier la langue",
|
||||||
"Launch a quizz": "Launch a quizz",
|
"Launch a quizz": "Launch a quizz",
|
||||||
"Enter species name": "Enter species name"
|
"Enter species name": "Enter species name",
|
||||||
|
"Run a question": "Run a question",
|
||||||
|
"Play a quizz": "Play a quizz",
|
||||||
|
"Quizz": "Quizz"
|
||||||
}
|
}
|
294
package-lock.json
generated
294
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "soundbirder",
|
"name": "soundbirder",
|
||||||
"version": "0.0.0",
|
"version": "0.1.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "soundbirder",
|
"name": "soundbirder",
|
||||||
"version": "0.0.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@unclesamulus/ebird-api": "^0.0.0",
|
"@unclesamulus/ebird-api": "^0.0.0",
|
||||||
"@unclesamulus/xeno-canto-api": "^0.0.0",
|
"@unclesamulus/xeno-canto-api": "^0.0.0",
|
||||||
@ -31,8 +31,9 @@
|
|||||||
"postcss": "^8.4.33",
|
"postcss": "^8.4.33",
|
||||||
"postcss-cli": "^11.0.0",
|
"postcss-cli": "^11.0.0",
|
||||||
"pug": "^3.0.2",
|
"pug": "^3.0.2",
|
||||||
"redis": "^4.3.0",
|
"redis": "^4.6.13",
|
||||||
"tailwindcss": "^3.1.8"
|
"tailwindcss": "^3.1.8",
|
||||||
|
"util": "^0.12.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@alloc/quick-lru": {
|
"node_modules/@alloc/quick-lru": {
|
||||||
@ -175,9 +176,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@redis/client": {
|
"node_modules/@redis/client": {
|
||||||
"version": "1.5.8",
|
"version": "1.5.14",
|
||||||
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz",
|
||||||
"integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==",
|
"integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cluster-key-slot": "1.1.2",
|
"cluster-key-slot": "1.1.2",
|
||||||
"generic-pool": "3.9.0",
|
"generic-pool": "3.9.0",
|
||||||
@ -188,33 +189,33 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@redis/graph": {
|
"node_modules/@redis/graph": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz",
|
||||||
"integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
|
"integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@redis/client": "^1.0.0"
|
"@redis/client": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@redis/json": {
|
"node_modules/@redis/json": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz",
|
||||||
"integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
|
"integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@redis/client": "^1.0.0"
|
"@redis/client": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@redis/search": {
|
"node_modules/@redis/search": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz",
|
||||||
"integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
|
"integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@redis/client": "^1.0.0"
|
"@redis/client": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@redis/time-series": {
|
"node_modules/@redis/time-series": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz",
|
||||||
"integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
|
"integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@redis/client": "^1.0.0"
|
"@redis/client": "^1.0.0"
|
||||||
}
|
}
|
||||||
@ -370,6 +371,17 @@
|
|||||||
"postcss": "^8.1.0"
|
"postcss": "^8.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/available-typed-arrays": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz",
|
||||||
|
"integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "0.27.2",
|
"version": "0.27.2",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
|
||||||
@ -577,12 +589,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/call-bind": {
|
"node_modules/call-bind": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"es-define-property": "^1.0.0",
|
||||||
"get-intrinsic": "^1.0.2"
|
"es-errors": "^1.3.0",
|
||||||
|
"function-bind": "^1.1.2",
|
||||||
|
"get-intrinsic": "^1.2.4",
|
||||||
|
"set-function-length": "^1.2.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@ -933,6 +951,22 @@
|
|||||||
"ms": "2.0.0"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/define-data-property": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||||
|
"dependencies": {
|
||||||
|
"es-define-property": "^1.0.0",
|
||||||
|
"es-errors": "^1.3.0",
|
||||||
|
"gopd": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/delayed-stream": {
|
"node_modules/delayed-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
@ -1015,6 +1049,25 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/es-define-property": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"get-intrinsic": "^1.2.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/es-errors": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/escalade": {
|
"node_modules/escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||||
@ -1348,6 +1401,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/for-each": {
|
||||||
|
"version": "0.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
|
||||||
|
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
|
||||||
|
"dependencies": {
|
||||||
|
"is-callable": "^1.1.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/form-data": {
|
"node_modules/form-data": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||||
@ -1432,9 +1493,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/function-bind": {
|
"node_modules/function-bind": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/generic-pool": {
|
"node_modules/generic-pool": {
|
||||||
"version": "3.9.0",
|
"version": "3.9.0",
|
||||||
@ -1461,14 +1525,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/get-intrinsic": {
|
"node_modules/get-intrinsic": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||||
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
|
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"es-errors": "^1.3.0",
|
||||||
"has": "^1.0.3",
|
"function-bind": "^1.1.2",
|
||||||
"has-proto": "^1.0.1",
|
"has-proto": "^1.0.1",
|
||||||
"has-symbols": "^1.0.3"
|
"has-symbols": "^1.0.3",
|
||||||
|
"hasown": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@ -1534,6 +1602,17 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/gopd": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||||
|
"dependencies": {
|
||||||
|
"get-intrinsic": "^1.1.3"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/graceful-fs": {
|
"node_modules/graceful-fs": {
|
||||||
"version": "4.2.11",
|
"version": "4.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||||
@ -1550,6 +1629,17 @@
|
|||||||
"node": ">= 0.4.0"
|
"node": ">= 0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/has-property-descriptors": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||||
|
"dependencies": {
|
||||||
|
"es-define-property": "^1.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has-proto": {
|
"node_modules/has-proto": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
||||||
@ -1573,11 +1663,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/has-tostringtag": {
|
"node_modules/has-tostringtag": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||||
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
|
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has-symbols": "^1.0.2"
|
"has-symbols": "^1.0.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
@ -1586,6 +1676,17 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/hasown": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
|
||||||
|
"dependencies": {
|
||||||
|
"function-bind": "^1.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/http-errors": {
|
"node_modules/http-errors": {
|
||||||
"version": "1.6.3",
|
"version": "1.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||||
@ -1666,6 +1767,21 @@
|
|||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-arguments": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
|
||||||
|
"dependencies": {
|
||||||
|
"call-bind": "^1.0.2",
|
||||||
|
"has-tostringtag": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-binary-path": {
|
"node_modules/is-binary-path": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||||
@ -1677,6 +1793,17 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-callable": {
|
||||||
|
"version": "1.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
|
||||||
|
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.12.1",
|
"version": "2.12.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
|
||||||
@ -1713,6 +1840,20 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-generator-function": {
|
||||||
|
"version": "1.0.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
|
||||||
|
"integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
|
||||||
|
"dependencies": {
|
||||||
|
"has-tostringtag": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-glob": {
|
"node_modules/is-glob": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||||
@ -1752,6 +1893,20 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-typed-array": {
|
||||||
|
"version": "1.1.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
|
||||||
|
"integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
|
||||||
|
"dependencies": {
|
||||||
|
"which-typed-array": "^1.1.14"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/jiti": {
|
"node_modules/jiti": {
|
||||||
"version": "1.21.0",
|
"version": "1.21.0",
|
||||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
|
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
|
||||||
@ -2680,16 +2835,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/redis": {
|
"node_modules/redis": {
|
||||||
"version": "4.6.7",
|
"version": "4.6.13",
|
||||||
"resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz",
|
"resolved": "https://registry.npmjs.org/redis/-/redis-4.6.13.tgz",
|
||||||
"integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==",
|
"integrity": "sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==",
|
||||||
|
"workspaces": [
|
||||||
|
"./packages/*"
|
||||||
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@redis/bloom": "1.2.0",
|
"@redis/bloom": "1.2.0",
|
||||||
"@redis/client": "1.5.8",
|
"@redis/client": "1.5.14",
|
||||||
"@redis/graph": "1.1.0",
|
"@redis/graph": "1.1.1",
|
||||||
"@redis/json": "1.0.4",
|
"@redis/json": "1.0.6",
|
||||||
"@redis/search": "1.1.3",
|
"@redis/search": "1.1.6",
|
||||||
"@redis/time-series": "1.0.4"
|
"@redis/time-series": "1.0.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/require-directory": {
|
"node_modules/require-directory": {
|
||||||
@ -2864,6 +3022,22 @@
|
|||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/set-function-length": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
|
||||||
|
"dependencies": {
|
||||||
|
"define-data-property": "^1.1.2",
|
||||||
|
"es-errors": "^1.3.0",
|
||||||
|
"function-bind": "^1.1.2",
|
||||||
|
"get-intrinsic": "^1.2.3",
|
||||||
|
"gopd": "^1.0.1",
|
||||||
|
"has-property-descriptors": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/setprototypeof": {
|
"node_modules/setprototypeof": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
|
||||||
@ -3171,6 +3345,18 @@
|
|||||||
"browserslist": ">= 4.21.0"
|
"browserslist": ">= 4.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/util": {
|
||||||
|
"version": "0.12.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
|
||||||
|
"integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
|
||||||
|
"dependencies": {
|
||||||
|
"inherits": "^2.0.3",
|
||||||
|
"is-arguments": "^1.0.4",
|
||||||
|
"is-generator-function": "^1.0.7",
|
||||||
|
"is-typed-array": "^1.1.3",
|
||||||
|
"which-typed-array": "^1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/util-deprecate": {
|
"node_modules/util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
@ -3208,6 +3394,24 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/which-typed-array": {
|
||||||
|
"version": "1.1.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
|
||||||
|
"integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
|
||||||
|
"dependencies": {
|
||||||
|
"available-typed-arrays": "^1.0.6",
|
||||||
|
"call-bind": "^1.0.5",
|
||||||
|
"for-each": "^0.3.3",
|
||||||
|
"gopd": "^1.0.1",
|
||||||
|
"has-tostringtag": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/with": {
|
"node_modules/with": {
|
||||||
"version": "7.0.2",
|
"version": "7.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
|
||||||
|
@ -30,7 +30,8 @@
|
|||||||
"postcss": "^8.4.33",
|
"postcss": "^8.4.33",
|
||||||
"postcss-cli": "^11.0.0",
|
"postcss-cli": "^11.0.0",
|
||||||
"pug": "^3.0.2",
|
"pug": "^3.0.2",
|
||||||
"redis": "^4.3.0",
|
"redis": "^4.6.13",
|
||||||
"tailwindcss": "^3.1.8"
|
"tailwindcss": "^3.1.8",
|
||||||
|
"util": "^0.12.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
redis.js
3
redis.js
@ -1,4 +1,5 @@
|
|||||||
const redis = require('redis');
|
const redis = require('redis');
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
const redisHost = process.env.REDIS_HOST ? process.env.REDIS_HOST : 'localhost';
|
const redisHost = process.env.REDIS_HOST ? process.env.REDIS_HOST : 'localhost';
|
||||||
const redisPort = process.env.REDIS_PORT ? process.env.REDIS_PORT : 6379;
|
const redisPort = process.env.REDIS_PORT ? process.env.REDIS_PORT : 6379;
|
||||||
@ -9,6 +10,8 @@ const redisClient = redis.createClient({
|
|||||||
legacyMode: true
|
legacyMode: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
redisClient.pget = util.promisify(redisClient.get);
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
redisClient.connect().catch(console.error)
|
redisClient.connect().catch(console.error)
|
||||||
})();
|
})();
|
||||||
|
@ -11,9 +11,6 @@ router.route('/game/quizz')
|
|||||||
|
|
||||||
router.route('/game/check')
|
router.route('/game/check')
|
||||||
.get(apiController.game.check);
|
.get(apiController.game.check);
|
||||||
|
|
||||||
router.route('/species/completion')
|
|
||||||
.get(apiController.game.birdSpeciesCompletion);
|
|
||||||
|
|
||||||
router.route('/region')
|
router.route('/region')
|
||||||
.get(apiController.region);
|
.get(apiController.region);
|
||||||
|
@ -14,7 +14,9 @@ html(lang=locale)
|
|||||||
nav(role="navigation").flex.flex-row
|
nav(role="navigation").flex.flex-row
|
||||||
- var i18n_prefix = locale ? '/' + locale : ''
|
- var i18n_prefix = locale ? '/' + locale : ''
|
||||||
span.nav-item
|
span.nav-item
|
||||||
a(href=`${i18n_prefix}/` title=__('Play the quizz')) #{ __('Game') }
|
a(href=`${i18n_prefix}/` title=__('Run a question')) #{ __('Game') }
|
||||||
|
span.nav-item
|
||||||
|
a(href=`${i18n_prefix}/quizz`, title=__('Play a quizz')) #{ __('Quizz') }
|
||||||
span.nav-item
|
span.nav-item
|
||||||
a(href=`${i18n_prefix}/about` title=__('About this game')) #{ __('About') }
|
a(href=`${i18n_prefix}/about` title=__('About this game')) #{ __('About') }
|
||||||
include lang.pug
|
include lang.pug
|
||||||
|
Loading…
Reference in New Issue
Block a user