100 lines
1.9 KiB
Python

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 = {}