From 4311dc7be8270630404fee33c9b994c1720c8774 Mon Sep 17 00:00:00 2001 From: Adrian Heine Date: Tue, 9 Apr 2024 15:45:18 +0200 Subject: [PATCH] Update --- main.py | 144 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/main.py b/main.py index b3da3e2..f459970 100644 --- a/main.py +++ b/main.py @@ -11,7 +11,7 @@ import re import sys import readline -DATA_DIR = os.environ['XDG_DATA_HOME'] + '/klette' +DATA_DIR = os.environ.get('XDG_DATA_HOME', os.environ['HOME'] + '/.local/share') + '/klette' VOKABELN_FILE = DATA_DIR + '/vokabeln.json' STATUS_FILE = DATA_DIR + '/status.json' AUDIO_BASE = DATA_DIR + '/audio/' @@ -96,12 +96,19 @@ assert vergleiche("hacer algo", "hacer (irr.) algo") == 0 assert vergleiche("padres", "padres (pl.)") == 0 class Resultado: + CORRECTO = 0 BIEN = 1 - MAL = 2 - ADIOS = 3 + NO_BIEN = 2 + MAL = 3 + ADIOS = 4 def einzelne_abfrage(palabra, status): - status_text = f"({status})" if status > 0 else f"{bcolors.OKGREEN}neu{bcolors.ENDC}" + if status == None: + status_text = f"{bcolors.OKCYAN}neu{bcolors.ENDC}" + status = 0 + else: + status_text = f"({status})" + try: respuesta = input(f"{status_text} {bcolors.BOLD}{palabra['de']}{bcolors.ENDC} {bcolors.OKCYAN}") except EOFError: @@ -111,26 +118,88 @@ def einzelne_abfrage(palabra, status): print(bcolors.ENDC, end="") print('\033[{}C\033[1A'.format(4 + len(palabra['de']) + 1 + len(respuesta)), end="") resultado = vergleiche(respuesta, palabra['es']) - match status: - case 0: bien = resultado < 4 - case 1: bien = resultado < 3 - case 2: bien = resultado < 3 - case 3: bien = resultado < 2 - case 4: bien = resultado < 1 + if resultado == 0: + bien = Resultado.CORRECTO + else: + match status: + case 0: bien = Resultado.BIEN if resultado < 4 else Resultado.NO_BIEN + case 1: bien = Resultado.BIEN if resultado < 2 else (RESULTADO.NO_BIEN if resultado < 4 else Resultado.MAL) + case 2: bien = Resultado.BIEN if resultado < 2 else (RESULTADO.NO_BIEN if resultado < 3 else Resultado.MAL) + case 3: bien = resultado < 2 + case 4: bien = resultado < 1 + bien = Resultado.BIEN if bien else Resultado.MAL print(f" {bcolors.LINK_START}file://{AUDIO_BASE}{palabra['audio']}.aac{bcolors.LINK_MIDDLE}",end="") - if bien and resultado == 0: + if bien == Resultado.CORRECTO: print(f"{bcolors.OKGREEN}✓{bcolors.ENDC}",end="") - elif bien: + elif bien == Resultado.BIEN: print(f"{bcolors.WARNING}{palabra['es']}{bcolors.ENDC}",end="") else: print(f"{bcolors.FAIL}{palabra['es']}{bcolors.ENDC}",end="") print(bcolors.LINK_END,end="") try: - input(" ") + if input(" ") == "+": + bien = Resultado.CORRECTO except EOFError: print() return Resultado.ADIOS - return Resultado.BIEN if bien else Resultado.MAL + return bien + +class Sesion: + def __init__(self, palabras, status): + self.palabras = palabras + self.status = status + self.bien = 0 + self.mal = 0 + + def empezar(self, quiero_unidad): + unidad = False + unidad_no = -1 + paso = False + cur_palabras = False + for palabra in self.palabras: + if paso != palabra['paso']: + if cur_palabras != False and (quiero_unidad == None or quiero_unidad == unidad_no): + c = [len(cur_palabras[x]) for x in cur_palabras] + print(f"{bcolors.BOLD}{unidad}{bcolors.ENDC}: {paso} ({c[0] + c[6]}/{c[1]}/{c[2]}/{c[3]}/{c[4]}/{bcolors.OKGREEN}{c[5]}{bcolors.ENDC})") + for n in range(5): # 1..4, no 5 + if self.hace_palabras(cur_palabras[n], n) == Resultado.ADIOS: + return + n = None + if self.hace_palabras(cur_palabras[n], n) == Resultado.ADIOS: + return + + cur_palabras = {0: [], 1: [], 2: [], 3: [], 4: [], 5: [], None: []} + if unidad != palabra['unidad']: + unidad_no += 1 + unidad = palabra['unidad'] + paso = palabra['paso'] + + cur_palabras[self.status.get(palabra['id'])].append(palabra) + + def hace_palabras(self, palabras, status): + random.shuffle(palabras) + for palabra in palabras: + match einzelne_abfrage(palabra, status): + case Resultado.CORRECTO: + self.status[palabra['id']] = status + (2 if status < 2 else 1) + self.bien += 1 + case Resultado.BIEN: + self.status[palabra['id']] = status + 1 + self.bien += 1 + case Resultado.NO_BIEN: + continue + case Resultado.MAL: + self.status[palabra['id']] = status - 1 + self.mal += 1 + case Resultado.ADIOS: + return Resultado.ADIOS + with open(STATUS_FILE + '.new', 'w') as f: + json.dump(self.status, f) + f.flush() + os.fsync(f.fileno()) + with open(STATUS_FILE + '.new', 'r') as f: + pass + os.replace(STATUS_FILE + '.new', STATUS_FILE) def abfrage(parser, quiero_unidad): random.seed() @@ -145,50 +214,9 @@ def abfrage(parser, quiero_unidad): parser.print_help() return - unidad = False - unidad_no = -1 - paso = False - cur_palabras = False - bien = 0 - mal = 0 - for palabra in palabras: - if paso != palabra['paso']: - if cur_palabras != False and (quiero_unidad == None or quiero_unidad == unidad_no): - c = [len(cur_palabras[x]) for x in cur_palabras] - print(f"{bcolors.BOLD}{unidad}{bcolors.ENDC}: {paso} (",end="") - print(*c, sep="/", end=")") - print() - for n in range(5): # 1..4, no 5 - random.shuffle(cur_palabras[n]) - for a_palabra in cur_palabras[n]: - s = status.get(a_palabra['id'], 0) - match einzelne_abfrage(a_palabra, s): - case Resultado.BIEN: - status[a_palabra['id']] = s + 1 - bien+=1 - case Resultado.MAL: - if s > 0: - status[a_palabra['id']] = s - 1 - mal+=1 - continue - case Resultado.ADIOS: - print(f'{bcolors.OKGREEN}+{bien}{bcolors.ENDC} / {bcolors.FAIL}-{mal}{bcolors.ENDC}') - return - with open(STATUS_FILE + '.new', 'w') as f: - json.dump(status, f) - f.flush() - os.fsync(f.fileno()) - with open(STATUS_FILE + '.new', 'r') as f: - status = json.load(f) - os.replace(STATUS_FILE + '.new', STATUS_FILE) - - cur_palabras = {0: [], 1: [], 2: [], 3: [], 4: [], 5: []} - if unidad != palabra['unidad']: - unidad_no += 1 - unidad = palabra['unidad'] - paso = palabra['paso'] - - cur_palabras[status.get(palabra['id'], 0)].append(palabra) + sesion = Sesion(palabras, status) + sesion.empezar(quiero_unidad) + print(f'{bcolors.OKGREEN}+{sesion.bien}{bcolors.ENDC} / {bcolors.FAIL}-{sesion.mal}{bcolors.ENDC}') parser = argparse.ArgumentParser() default_data_file = os.environ['PWD'] + '/assets/amf/vokabelTrainer147.amf'