-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
123 lines (107 loc) · 5.5 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from flask import Flask, request, jsonify
import logging
import json
import random
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
# создаем словарь, в котором ключ — название города,
# а значение — массив, где перечислены id картинок,
# которые мы записали в прошлом пункте.
cities = {
'москва': ['1540737/daa6e420d33102bf6947',
'213044/7df73ae4cc715175059e'],
'нью-йорк': ['1652229/728d5c86707054d4745f',
'1030494/aca7ed7acefde2606bdc'],
'париж': ["1652229/f77136c2364eb90a3ea8",
'3450494/aca7ed7acefde22341bdc']
}
# создаем словарь, где для каждого пользователя
# мы будем хранить его имя
sessionStorage = {}
@app.route('/post', methods=['POST'])
def main():
logging.info(f'Request: {request.json!r}')
response = {
'session': request.json['session'],
'version': request.json['version'],
'response': {
'end_session': False
}
}
handle_dialog(response, request.json)
logging.info(f'Response: {response!r}')
return jsonify(response)
def handle_dialog(res, req):
user_id = req['session']['user_id']
# если пользователь новый, то просим его представиться.
if req['session']['new']:
res['response']['text'] = 'Привет! Назови свое имя!'
# создаем словарь в который в будущем положим имя пользователя
sessionStorage[user_id] = {
'first_name': None
}
return
# если пользователь не новый, то попадаем сюда.
# если поле имени пустое, то это говорит о том,
# что пользователь еще не представился.
if sessionStorage[user_id]['first_name'] is None:
# в последнем его сообщение ищем имя.
first_name = get_first_name(req)
# если не нашли, то сообщаем пользователю что не расслышали.
if first_name is None:
res['response']['text'] = \
'Не расслышала имя. Повтори, пожалуйста!'
# если нашли, то приветствуем пользователя.
# И спрашиваем какой город он хочет увидеть.
else:
sessionStorage[user_id]['first_name'] = first_name
res['response'][
'text'] = 'Приятно познакомиться, ' \
+ first_name.title() \
+ '. Я - Алиса. Какой город хочешь увидеть?'
# получаем варианты buttons из ключей нашего словаря cities
res['response']['buttons'] = [
{
'title': city.title(),
'hide': True
} for city in cities
]
# если мы знакомы с пользователем и он нам что-то написал,
# то это говорит о том, что он уже говорит о городе,
# что хочет увидеть.
else:
# ищем город в сообщение от пользователя
city = get_city(req)
# если этот город среди известных нам,
# то показываем его (выбираем одну из двух картинок случайно)
if city in cities:
res['response']['card'] = {}
res['response']['card']['type'] = 'BigImage'
res['response']['card']['title'] = 'Этот город я знаю.'
res['response']['card']['image_id'] = random.choice(cities[city])
res['response']['text'] = 'Я угадал!'
# если не нашел, то отвечает пользователю
# 'Первый раз слышу об этом городе.'
else:
res['response']['text'] = \
'Первый раз слышу об этом городе. Попробуй еще разок!'
def get_city(req):
# перебираем именованные сущности
for entity in req['request']['nlu']['entities']:
# если тип YANDEX.GEO то пытаемся получить город(city),
# если нет, то возвращаем None
if entity['type'] == 'YANDEX.GEO':
# возвращаем None, если не нашли сущности с типом YANDEX.GEO
return entity['value'].get('city', None)
def get_first_name(req):
# перебираем сущности
for entity in req['request']['nlu']['entities']:
# находим сущность с типом 'YANDEX.FIO'
if entity['type'] == 'YANDEX.FIO':
# Если есть сущность с ключом 'first_name',
# то возвращаем ее значение.
# Во всех остальных случаях возвращаем None.
return entity['value'].get('first_name', None)
if __name__ == '__main__':
port = int(os.environ.get("PORT", 5000))
app.run(host='0.0.0.0', port=port)