import os from typing import Generator, Tuple, IO from ums.messages.message import Message class Riddle(Message): _ATTRIBUTES = { # * in name -> optional "context" : str, "question" : str, "solution_before*" : str, "review_before*" : str } _DEFAULTS = {} class RiddleStatus(Message): _ATTRIBUTES = { # * in name -> optional "steps" : { "extract" : bool, "solve" : bool, "validate" : bool }, "trial" : int, "solved" : bool } _DEFAULTS = { "steps" : { "extract" : True, "solve" : True, "validate" : True }, "trial" : 0, "solved" : False } class RiddleData(Message): TYPE_TEXT = "text" TYPE_IMAGE = "image" TYPE_AUDIO = "audio" DATA_TYPES = [ TYPE_IMAGE, TYPE_TEXT, TYPE_AUDIO ] FILE_BASEPATH = '/ums-agenten/share' _ATTRIBUTES = [ { "type" : str, "file_plain" : str, "file_extracted*" : str } ] _DEFAULTS = [] def iterate(self, yield_plain:bool=True, yield_extracted:bool=True, file_pointer:bool=False ) -> Generator[Tuple[str, str|IO|None, str|IO|None], None, None]: for item in self.items: if item["type"] in self.DATA_TYPES: f_e = None if yield_extracted and "file_extracted" in item: f_e_p = os.path.join(self.FILE_BASEPATH, item["file_extracted"]) if os.path.isfile(f_e_p): f_e = open(f_e_p, 'r') if file_pointer else f_e_p f_p = None if yield_plain: f_p_p = os.path.join(self.FILE_BASEPATH, item["file_plain"]) if os.path.isfile(f_p_p): f_e = open(f_p_p, 'r') if file_pointer else f_p_p yield item["type"], f_p, f_e if hasattr(f_p, 'close'): f_p.close() if hasattr(f_e, 'close'): f_e.close() def __iter__(self): yield from self.iterate() class Solution(Message): _ATTRIBUTES = { "solution" : str, "explanation" : str, "used_data*" : "ums.messages.specials.RiddleData", "review*" : str } _DEFAULTS = {}