ccpq/standalone_tui.py

137 lines
3.9 KiB
Python
Raw Normal View History

2021-05-23 16:04:09 +02:00
#!/usr/bin/python3
import pathlib
import argparse
2021-05-23 16:04:09 +02:00
import os
import random
from rich.console import Console
from rich.markdown import Markdown
from ccpq.lib_ccpq import Question, Database, Game
MSG = {
True: [
"Yes!",
"Good one!",
"Super!",
"Excellent job!"
],
False: [
"Sorry, that's wrong",
"No, that's not right",
"Damn it! That's not the right answer",
]
}
2021-05-23 16:04:09 +02:00
class Tui(object):
def __init__(self):
self._console = Console()
self._stats = []
def ask_question(self, question):
os.system("clear")
2021-05-23 16:04:09 +02:00
md = Markdown("# {}".format(question.get_question()))
self._console.print(md)
md = ""
for possibility in question.get_possibilities():
md += "1. {}\n".format(possibility)
md = Markdown(md)
self._console.print(md)
def prompt_for_answer(self):
#md = Markdown("What's your answer?")
#self._console.print(md)
2021-05-23 16:04:09 +02:00
answer = self._parse_input()
return answer
def _parse_input(self):
"""
TODO make it adapt to questions with multiple choices and fill the
blank
"""
answers = []
2021-05-24 16:44:18 +02:00
results = input("\n What's your answer? (only numbers, separated by a SPACE) ")
results = results.split()
for result in results:
2021-05-23 16:04:09 +02:00
if result.isdigit():
answers.append(result)
else:
md = Markdown("**only digits please**")
self._console.print(md)
return answers
2021-05-23 16:04:09 +02:00
def show_response(self, question):
answers = question.get_right_answers()
if len(answers) == 1:
answer = answers[0]
md = Markdown("### The right answer is: {}".format(answer))
else:
md = "### The right answers are:\n"
for answer in answers:
md += "* {}\n".format(answer)
md = Markdown(md)
self._console.print(md)
def show_success(self, success):
md = "# {}".format(random.choice(MSG[success]))
md = Markdown(md)
self._console.print(md)
2021-05-23 16:04:09 +02:00
def show_stats(self, stats):
md = "### you have {} out of {} right!".format(stats[0], stats[2])
md = Markdown(md)
self._console.print(md)
md = "### press **enter** to get a new question or **CTRL-C** to quit"
md = Markdown(md)
self._console.print(md)
input()
def goodbye(self):
md = Markdown("# Goodbye!")
self._console.print(md)
class Application(object):
def __init__(self, filepath, interface, number):
2021-05-23 16:04:09 +02:00
self._db = Database(filepath)
self._number = number
2021-05-23 16:04:09 +02:00
self._session = Game()
self._interface = interface
def start(self):
pass
2021-05-23 16:04:09 +02:00
def run(self):
while self._number > 0:
2021-05-23 16:04:09 +02:00
question = self._db.get_question()
self._interface.ask_question(question)
answer = self._interface.prompt_for_answer()
stat = question.verify(answer)
self._session.update_stats(stat)
self._interface.show_success(stat)
2021-05-23 16:04:09 +02:00
self._interface.show_response(question)
self._interface.show_stats(self._session.get_stats())
self._number -= 1
self.quit()
2021-05-23 16:04:09 +02:00
def quit(self):
self._interface.goodbye()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file", required=True, help="file to use as database", action="store")
parser.add_argument("-n", "--number", default=10, help="number of questions to ask", type=int, action="store")
args = parser.parse_args()
filepath = pathlib.Path(args.file)
if not filepath.exists():
print("no such file!")
exit(1)
2021-05-23 16:04:09 +02:00
interface = Tui()
app = Application(filepath, interface, args.number)
2021-05-23 16:04:09 +02:00
try:
app.run()
except KeyboardInterrupt:
app.quit()