Beispiel #1
0
 def set_image(self, key, mid):
     logging.info('SETTING IMAGE ' + str(key) + ' TO ' + str(mid))
     if mid:
         if key in self.images:
             DialogsApi.remove_image(self.images[key])
         self.images[key] = mid
         logging.info('NEW IMAGES ' + log_object(self.images))
Beispiel #2
0
def dialog(data):
    logging.info('-----------DIALOG-----------')
    if data['session']['new']:
        Storage.remove(data['session']['user_id'])
    user = Storage(data)
    resp = Response(data)
    logging.info('CONTINUE ' + str(user.id))
    logging.info('INPUT ' + log_object(user.request))
    logging.info('STATE ' + str(user.state) + ' ' + str(user.state_init) +
                 ' DELAY ' + str(user.delay))
    logging.info('TYPE ' + str(user.type))
    logging.info('STORAGE ' + str(id(user)) + ' ' + log_object(user.data))

    user.pre_step()
    result = handle_state(user, resp)
    user.post_step()
    return result
Beispiel #3
0
 def get_image(self, key):
     logging.info('FROM IMAGES ' + log_object(self.images))
     for k, v in self.images.items():
         if k == key:
             logging.info('WITH KEY ' + str(key) + ' GOT ' + str(v))
             return v
     logging.info('WITH KEY ' + str(key) + ' GOT NONE')
     return None
Beispiel #4
0
 def callback(user=user, request=user.request):
     user.state = 1
     user.init_state(True)
     user.request = request
     logging.info(
         'continue after position recognition ' +
         log_object({
             'text': user.text,
             'pos': user['position'],
             'state': (user.state, user.delay)
         }))
Beispiel #5
0
def handle_state(user, resp):
    if user.type == 'SimpleUtterance':
        sent = Sentence(user.text)
        key_loc = sent.filter([
            'где', 'найти', 'близкий', 'радиус', 'от', 'до', 'наиболее',
            'более', 'нахожусь', 'поблизости', 'рядом', 'искать'
        ])
        ag, dg = sent.agreement

        if user.state == 0:
            if user.delay == 0:
                user.init_state()
                resp.msg('Приветствую! Меня зовут Алиса, а как ваше имя?')
            else:
                fios = user.entity(t='fio')
                if fios and 'first_name' in fios[0]['value']:
                    logging.info('NAME RECOGNIZED ' + log_object(fios))
                    name = fios[0]['value']['first_name']
                    user['name'] = name[0].upper() + name[1:]
                    resp.msg('Очень приятно.')
                    user.add_button(
                        Button(user,
                               'hint',
                               'Что ты умеешь?',
                               attach=False,
                               payload={'input': 'Что ты умеешь?'},
                               life=-1))
                    user.add_button(
                        Button(user,
                               'find_hint',
                               'Найти',
                               attach=False,
                               payload={'input': 'Найти'},
                               life=-1))
                    user.state = 1
                else:
                    resp.msg(
                        'Простите, я не расслышала вашего имени. Повторите, пожалуйста.'
                    )
            user.delay_up()

        if user.state != 0 and sent.sentence_collision(['умеешь', 'можешь']):
            resp.msg(hint % (user['name'], ))
            return resp

        if user.state == 1:
            if user.delay == 0:
                user.init_state()
                if not user.get('context', None):
                    resp.msg(hint % (user['name'], ))
            else:
                if sent.sentence_collision(['близкий', 'поблизости', 'рядом'
                                            ]) and not user['position']:

                    def callback(user=user, request=user.request):
                        user.state = 1
                        user.init_state(True)
                        user.request = request
                        logging.info(
                            'continue after position recognition ' +
                            log_object({
                                'text': user.text,
                                'pos': user['position'],
                                'state': (user.state, user.delay)
                            }))

                    user['next'].append(callback)
                    user.state = -1
                    resp.msg('{}?'.format(
                        sent.find(['близкий', 'поблизости',
                                   'рядом'])[0][0].word))

                elif sent.word_collision('нахожусь'):
                    user['next'].append(user.state)
                    user.state = -1
                    user.init_state(True)

                elif sent.sentence_collision(['где', 'найти', 'искать']):
                    user['context'] = 'search'
                    if 'vn' in user:
                        del user['vn']
                    api_res = None
                    geo = user.geo_entity()
                    try:
                        if (geo or sent.word_collision('место')) and \
                                not sent.sentence_collision(['объект', 'организация']):
                            logging.info('RECOGNIZED GEO ' + log_object(geo))
                            api_res = GeoApi(geo[0], ll=user['position'])
                        elif len(key_loc) > 0:
                            logging.info('SEARCHING BY WORDS ' + str(key_loc))
                            api_res = SearchApi(str(key_loc),
                                                ll=user['position'])
                        else:

                            def callback(user=user):
                                user.state = 1
                                user.init_state(True)
                                user.text = 'Найди ' + user.text
                                logging.info('SWITCHING CALLBACK ' +
                                             log_object(user.data))

                            user['next'].append(callback)
                            user.state = -3
                            return handle_state(user, resp)
                    except Exception:
                        pass
                    if api_res:
                        logging.info(
                            'RECOGNIZED {} GEO '.format(len(api_res)) +
                            log_object(api_res.data))
                        user['variants'] = []
                        resp.msg('Вот что мне удалось найти:\n')
                        mp = MapsApi()
                        for n, i in enumerate(api_res, 1):
                            resp.msg('{} - {}\n\t{}'.format(
                                n, i.name, i.formatted_address))
                            user['variants'].append(i)
                            mp.include_view(i.rect)
                            mp.add_marker(i.pos, 'pm2rdm' + str(n))
                        ym = mp.get_url(False)
                        if user['position']:
                            mp.add_marker(user['position'], 'pm2al')
                        btn = Button(user,
                                     'map',
                                     'Показать карту',
                                     life=-1,
                                     payload={
                                         'action': 'map',
                                         'url': ym,
                                         'image_url': mp.get_url(True)
                                     })
                        user.add_button(btn)
                    else:
                        resp.msg(
                            'Простите, не могу понять, о каком месте вы говорите. Попробуйте ещё раз'
                        )

                elif user.get('variants', None):
                    new = False
                    if sent.sentence_collision(
                        ['вариант', 'подробный', 'расскажи']):
                        if user.entity(t='number'):
                            vn = int(user.entity(t='number')[0]['value'])
                            if 1 <= vn <= len(user['variants']):
                                user['vn'] = vn - 1
                                for i in [
                                        'Время работы', 'телефон', 'адрес',
                                        'покажи на карте'
                                ]:
                                    user.add_button(
                                        Button(user,
                                               i,
                                               i,
                                               attach=False,
                                               payload={'input': i},
                                               life=-1))
                                new = True
                            else:
                                resp.msg(
                                    'Я что-то не помню варианта под таким номером.'
                                )
                    if user.get('vn', None) is not None:
                        user['context'] = 'variant'
                        v = user['variants'][user['vn']]

                        if sent.word_collision('карта'):
                            mp = MapsApi(bbox=v.rect)
                            mp.add_marker(v.pos, 'pm2bll')
                            ym = mp.get_url(False)
                            if user['position']:
                                mp.add_marker(user['position'], 'pm2al')
                                mp.include_view(user['position'])

                            mid = user.upload_image('map', mp.get_url(True))
                            resp.msg('Показать карту не удалось')
                            btn = Button(user,
                                         'map_url',
                                         'Показать на Яндекс.Картах',
                                         url=ym)
                            if mid:
                                card = Card(user, 'Показать на Яндекс.Картах',
                                            mid)
                                card['button'] = btn.send()
                                user.add_card(card)
                            else:
                                user.add_button(btn)

                        elif sent.sentence_collision(
                            ['имя', 'название', 'что', 'тип']):
                            resp.msg(v.name)

                        elif sent.sentence_collision(['адрес', 'находиться']):
                            resp.msg('Полный адрес:\n' + v.formatted_address)

                        elif sent.sentence_collision(
                            ['время', 'когда', 'часы', 'сейчас', 'работает']):
                            wh = v.workhours
                            if wh:
                                resp.msg(wh['text'])
                                resp.msg(wh['State']['text'])
                                resp.msg('Сейчас {}'.format(
                                    'открыто' if wh['State']['is_open_now'] ==
                                    '1' else 'закрыто'))
                            else:
                                resp.msg('Данных о времени работы нет')

                        elif sent.sentence_collision(
                            ['телефон', 'сотовый', 'номер']):
                            t = v.phone_numbers
                            if t:
                                resp.msg('Известные номера для этого объекта:')
                                resp.msg('\n'.join(t))
                            else:
                                resp.msg('Нет информации о номере телефона')
                        elif new:
                            resp.msg('Что вы хотите узнать про этот вариант?')
                if not resp.text:
                    for i in user.buttons[::-1]:
                        if sent.sentence_collision(i['title']):
                            user.type = 'ButtonPressed'
                            user.payload = i['payload']
                            return handle_state(user, resp)
                    resp.msg('Простите, не понимаю вашу просьбу')
            user.delay_up()

        if user.state == -1:
            if user.delay == 0:
                user.init_state()
                resp.msg('Где вы находитесь?')
            else:
                geo = user.geo_entity()
                api_res = None
                if geo:
                    logging.info('RECOGNIZED GEO ' + log_object(geo))
                    api_res = GeoApi(geo[0])
                if api_res:
                    loc = api_res[0]
                    mp = MapsApi(bbox=loc.rect)
                    mp.add_marker(loc.pos, 'pm2al')
                    user.add_button(
                        Button(user,
                               None,
                               'Показать карту',
                               payload={
                                   'url': mp.get_url(False),
                                   'image_url': mp.get_url(True),
                                   'action': 'map'
                               }))
                    user['back'].append(-1)

                    def callback(user=user, pos=loc.pos):
                        logging.info('CALLBACK setting position')
                        user['position'] = list(pos)
                        return user.next()

                    user['next'].append(callback)
                    user.state = -2
                else:
                    resp.msg('Где вы находитесь?')
                    resp.msg('Простите, не могу понять где это')
            user.delay_up()

        if user.state == -2:
            if user.delay == 0:
                user.init_state()
                resp.msg('Это здесь?')
            else:
                if ag > dg:
                    resp.msg('Понятно')
                    user.state = user.next()
                    return handle_state(user, resp)
                elif dg > ag:
                    resp.msg('Как скажете')
                    user.state = user.back()
                    return handle_state(user, resp)
                else:
                    resp.msg('Не могу понять вашего ответа')
            user.delay_up()

        if user.state == -3:
            if user.delay == 0:
                resp.msg('Что вы желаете найти?')
                user.init_state()
            else:
                user.state = user.next()
                return handle_state(user, resp)
            user.delay_up()

    elif user.type == 'ButtonPressed':
        if user.payload:
            pl = user.payload
            action = pl.get('action')
            if action == 'map':
                resp.text = 'Показать карту не удалось'
                btn = Button(user,
                             'map_url',
                             'Показать на Яндекс.Картах',
                             url=pl['url'])
                img = user.upload_image('map', pl['image_url'])
                if img:
                    card = Card(user, '', img)
                    card['button'] = btn.send()
                    card['title'] = btn['title']
                    user.add_card(card)
                else:
                    user.add_button(btn)
            elif 'input' in pl:
                user.type = 'SimpleUtterance'
                user.text = pl['input']
                return handle_state(user, resp)
        else:
            resp.text = 'Выполняю'

    return resp
Beispiel #6
0
def error_404(*args):
    logging.error('404')
    logging.error(request.url)
    logging.error(str(dict(request.headers)))
    logging.error(log_object(request.json))
Beispiel #7
0
 def callback(user=user):
     user.state = 1
     user.init_state(True)
     user.text = 'Найди ' + user.text
     logging.info('SWITCHING CALLBACK ' +
                  log_object(user.data))
Beispiel #8
0
 def send(self):
     logging.info('SENDING ' + log_object(self.data))
     data = jsonify(self.data)
     if self.end:
         self.storage.remove(self.storage.id)
     return data
Beispiel #9
0
 def add_card(self, card):
     logging.info('Adding card ' + log_object(card.data))
     self.cards.append(card)