You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
6.7 KiB
JavaScript
249 lines
6.7 KiB
JavaScript
|
|
|
|
const {log, biglog, errorlog, colorize} = require("./out");
|
|
|
|
const model = require('./model');
|
|
|
|
|
|
/**
|
|
* Muestra la ayuda.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.helpCmd = rl => {
|
|
log("Commandos:");
|
|
log(" h|help - Muestra esta ayuda.");
|
|
log(" list - Listar los quizzes existentes.");
|
|
log(" show <id> - Muestra la pregunta y la respuesta el quiz indicado.");
|
|
log(" add - Añadir un nuevo quiz interactivamente.");
|
|
log(" delete <id> - Borrar el quiz indicado.");
|
|
log(" edit <id> - Editar el quiz indicado.");
|
|
log(" test <id> - Probar el quiz indicado.");
|
|
log(" p|play - Jugar a preguntar aleatoriamente todos los quizzes.");
|
|
log(" credits - Créditos.");
|
|
log(" q|quit - Salir del programa.");
|
|
rl.prompt();
|
|
};
|
|
|
|
|
|
/**
|
|
* Lista todos los quizzes existentes en el modelo.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.listCmd = rl => {
|
|
model.getAll().forEach((quiz, id) => {
|
|
log(` [${colorize(id, 'magenta')}]: ${quiz.question}`);
|
|
});
|
|
rl.prompt();
|
|
};
|
|
|
|
|
|
/**
|
|
* Muestra el quiz indicado en el parámetro: la pregunta y la respuesta.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
* @param id Clave del quiz a mostrar.
|
|
*/
|
|
exports.showCmd = (rl, id) => {
|
|
if (typeof id === "undefined") {
|
|
errorlog(`Falta el parámetro id.`);
|
|
} else {
|
|
try {
|
|
const quiz = model.getByIndex(id);
|
|
log(` [${colorize(id, 'magenta')}]: ${quiz.question} ${colorize('=>', 'magenta')} ${quiz.answer}`);
|
|
} catch(error) {
|
|
errorlog(error.message);
|
|
}
|
|
}
|
|
rl.prompt();
|
|
};
|
|
|
|
|
|
/**
|
|
* Añade un nuevo quiz al módelo.
|
|
* Pregunta interactivamente por la pregunta y por la respuesta.
|
|
*
|
|
* Hay que recordar que el funcionamiento de la funcion rl.question es asíncrono.
|
|
* El prompt hay que sacarlo cuando ya se ha terminado la interacción con el usuario,
|
|
* es decir, la llamada a rl.prompt() se debe hacer en la callback de la segunda
|
|
* llamada a rl.question.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.addCmd = rl => {
|
|
|
|
rl.question(colorize(' Introduzca una pregunta: ', 'red'), question => {
|
|
|
|
rl.question(colorize(' Introduzca la respuesta ', 'red'), answer => {
|
|
|
|
model.add(question, answer);
|
|
log(` ${colorize('Se ha añadido', 'magenta')}: ${question} ${colorize('=>', 'magenta')} ${answer}`);
|
|
rl.prompt();
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
/**
|
|
* Borra un quiz del modelo.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
* @param id Clave del quiz a borrar en el modelo.
|
|
*/
|
|
exports.deleteCmd = (rl, id) => {
|
|
if (typeof id === "undefined") {
|
|
errorlog(`Falta el parámetro id.`);
|
|
} else {
|
|
try {
|
|
model.deleteByIndex(id);
|
|
} catch(error) {
|
|
errorlog(error.message);
|
|
}
|
|
}
|
|
rl.prompt();
|
|
};
|
|
|
|
|
|
/**
|
|
* Edita un quiz del modelo.
|
|
*
|
|
* Hay que recordar que el funcionamiento de la funcion rl.question es asíncrono.
|
|
* El prompt hay que sacarlo cuando ya se ha terminado la interacción con el usuario,
|
|
* es decir, la llamada a rl.prompt() se debe hacer en la callback de la segunda
|
|
* llamada a rl.question.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
* @param id Clave del quiz a editar en el modelo.
|
|
*/
|
|
exports.editCmd = (rl, id) => {
|
|
if (typeof id === "undefined") {
|
|
errorlog(`Falta el parámetro id.`);
|
|
rl.prompt();
|
|
} else {
|
|
try {
|
|
const quiz = model.getByIndex(id);
|
|
|
|
process.stdout.isTTY && setTimeout(() => {rl.write(quiz.question)},0);
|
|
|
|
rl.question(colorize(' Introduzca una pregunta: ', 'red'), question => {
|
|
|
|
process.stdout.isTTY && setTimeout(() => {rl.write(quiz.answer)},0);
|
|
|
|
rl.question(colorize(' Introduzca la respuesta ', 'red'), answer => {
|
|
model.update(id, question, answer);
|
|
log(` Se ha cambiado el quiz ${colorize(id, 'magenta')} por: ${question} ${colorize('=>', 'magenta')} ${answer}`);
|
|
rl.prompt();
|
|
});
|
|
});
|
|
} catch (error) {
|
|
errorlog(error.message);
|
|
rl.prompt();
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Prueba un quiz, es decir, hace una pregunta del modelo a la que debemos contestar.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
* @param id Clave del quiz a probar.
|
|
*/
|
|
exports.testCmd = (rl, id) => {
|
|
if (typeof id === "undefined") {
|
|
errorlog(`Falta el parámetro id.`);
|
|
rl.prompt();
|
|
} else {
|
|
try {
|
|
const quiz = model.getByIndex(id);
|
|
|
|
rl.question(colorize(quiz.question + " ", 'red'), answer => {
|
|
if ( quiz.answer == answer ) {
|
|
biglog("correct", "green");
|
|
} else {
|
|
biglog("incorrect", "red");
|
|
}
|
|
rl.prompt();
|
|
});
|
|
} catch (error) {
|
|
errorlog(error.message);
|
|
rl.prompt();
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Shuffles array in place. ES6 version
|
|
* @param {Array} a items An array containing the items.
|
|
*/
|
|
function shuffle(a) {
|
|
for (let i = a.length - 1; i > 0; i--) {
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[a[i], a[j]] = [a[j], a[i]];
|
|
}
|
|
return a;
|
|
}
|
|
|
|
|
|
/**
|
|
* Pregunta todos los quizzes existentes en el modelo en orden aleatorio.
|
|
* Se gana si se contesta a todos satisfactoriamente.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.playCmd = rl => {
|
|
let aciertos = 0;
|
|
let questions = shuffle(model.getAll());
|
|
|
|
const keepAsking = () => {
|
|
if (questions.length<1){
|
|
log(`Fin del juego - Aciertos: ${aciertos}`, "red");
|
|
rl.prompt();
|
|
return
|
|
}
|
|
try {
|
|
let quiz = questions.pop();
|
|
|
|
rl.question(colorize(quiz.question + " ", 'red'), answer => {
|
|
if ( quiz.answer == answer ) {
|
|
aciertos += 1;
|
|
log(`CORRECTO - lleva ${aciertos} aciertos`, "green");
|
|
} else {
|
|
log("INCORRECTO", "red");
|
|
questions = [];
|
|
}
|
|
keepAsking()
|
|
});
|
|
} catch (error) {
|
|
errorlog(error.message);
|
|
rl.prompt();
|
|
}
|
|
}
|
|
keepAsking();
|
|
};
|
|
|
|
|
|
/**
|
|
* Muestra los nombres de los autores de la práctica.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.creditsCmd = rl => {
|
|
log('Autores de la práctica:');
|
|
log('Nombre 1', 'green');
|
|
log('Nombre 2', 'green');
|
|
rl.prompt();
|
|
};
|
|
|
|
|
|
/**
|
|
* Terminar el programa.
|
|
*
|
|
* @param rl Objeto readline usado para implementar el CLI.
|
|
*/
|
|
exports.quitCmd = rl => {
|
|
rl.close();
|
|
};
|
|
|