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))
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
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
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) }))
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
def error_404(*args): logging.error('404') logging.error(request.url) logging.error(str(dict(request.headers))) logging.error(log_object(request.json))
def callback(user=user): user.state = 1 user.init_state(True) user.text = 'Найди ' + user.text logging.info('SWITCHING CALLBACK ' + log_object(user.data))
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
def add_card(self, card): logging.info('Adding card ' + log_object(card.data)) self.cards.append(card)