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.

193 lines
5.2 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) => {
log('Probar el quiz indicado.', 'red');
rl.prompt();
};
/**
* 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 => {
log('Jugar.', 'red');
rl.prompt();
};
/**
* 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();
};