Example #1
0
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))