async def message(scope, info, matches, content): text = re.sub(r'\s+', ' ', (await text_reader(content)).strip().lstrip('.').strip()) if text == '': return text_response(dialogflow.event('WELCOME')) answers = dialogflow.get_answers(text, kb=False) if answers: return text_response(answers[0]) query = text.strip('?!').strip() if not validate(query): return text_response(dialogflow.event('fallback')) answer = find_answer(query) if answer: return text_response(answer) total = 4 fragments = PriorityQueue(total, lambda f, r: 1 - r) for url in search(query)[:1]: doc = Document(url) if not doc: print('[WARN] URL request failed:', doc.url) continue for fragment_name in doc: if _Fragment.get_by(name=fragment_name): print('[INFO] Found fragment:', fragment_name) total -= 1 if total == 0: break continue print('[INFO] Generating fragment:', fragment_name) fragment = doc[fragment_name] if not fragment: print('[INFO] Skipping empty fragment:', fragment_name) continue fragments.add((doc, fragment_name, fragment), similarity(query, fragment)) for doc, name, fragment in fragments[:total]: print('[INFO] Uploading fragment:', name) res = fandom.create(name, fragment) if res is None: print('[WARN] Fragment upload failed:', name) continue _doc = _Document.get_by(name=doc.name) if not _doc: _doc = _Document(name=doc.name, url=doc.url, caption=doc.caption, site=doc.site) _fragment = _Fragment(path=res.name, name=name, document=_doc) print('[INFO] Fragment uploaded:', name) rom.session.flush() #lambda a: _Fragment.get_by(path=a.source).document['url'] in urls) answers = dialogflow.get_answers(query) if not answers: return text_response(dialogflow.event('fallback')) answer = max( answers, key=lambda a: a.match_confidence * similarity(query, a.answer)) return text_response(save_answer(query, answer.answer))