-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcmds.js
192 lines (161 loc) · 5.16 KB
/
cmds.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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();
};