카카오톡 플러스친구 스마트채팅 만들기 5 - 식당 선택 & 결과 보기

카카오톡 플러스친구 스마트채팅 만들기 5 - 식당 선택 & 결과 보기

사용자가 식당 목록 버튼을 선택하면 /message로 전달됩니다. 이를 처리하여 결과를 보여줍니다.

식당 선택

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Message(Resource):
#...생략...

def post(self):
select = Select(self.args)

if self.content == Const.BTN_SELECT_LUNCH:
return select.show_restaurant_list()

# 사용자 입력처리
user = fs.collection(Const.COL_USER).document(self.user_key).get()
user_state = user.get(Const.FIELD_STATE)

if user_state == Const.STATE_SELECT_RESTAURANT:
return select.restaurant_selected()

# default
return Util.show_start_menu()

먼저 정의한 버튼인지 확인합니다.
목록에 없으면 사용자계정에서 상태정보를 읽습니다.

1
2
3
# 사용자 입력처리
user = fs.collection(Const.COL_USER).document(self.user_key).get()
user_state = user.get(Const.FIELD_STATE)

해당 상태에 맞도록 처리합니다. 식당 선택 상태 였으므로, select.restaurant_selected() 함수를 호출하여 처리합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Select(Args):
def restaurant_selected(self):
user = fs.collection(Const.COL_USER).document(self.user_key).get()
user_group = user.get(Const.FIELD_GROUP)
today = Util.get_day_str()

fs.collection(Const.COL_SELECT).document(user_group).collection(Const.COL_TODAY).document(today).update({
self.user_key: self.content
}, firestore.CreateIfMissingOption(True))

msg = '[{}] 을(를) 선택하였습니다'.format(self.content)

try:
ref = fs.collection(Const.COL_GROUP).document(user_group).get()
restaurants = ref._data.get(Const.FIELD_RESTAURANT)
target = restaurants.get(self.content)
img_src = target.get(Const.FIELD_IMG_SRC)
except:
img_src = None

return Util.show_start_menu(msg, img_src)

사용자의 그룹정보를 얻습니다.
오늘 날짜 정보를 얻습니다. 타임존을 Asia/Seoul로 설정합니다.

1
2
3
4
5
6
7
8
9
10
from datetime import datetime, timedelta
import pytz

class Util:
@classmethod
def get_day_str(cls, days=0):
tz = pytz.timezone('Asia/Seoul')
now = datetime.now(tz) + timedelta(days=days)
day_str = now.strftime('%Y.%m.%d')
return day_str

먼저 선택한 정보를 데이터를 입력합니다.

1
2
3
fs.collection(Const.COL_SELECT).document(user_group).collection(Const.COL_TODAY).document(today).update({
self.user_key: self.content
}, firestore.CreateIfMissingOption(True))

다음과 같은 형태로 저장합니다.

select - 그룹 - today - 날짜 - { 사용자키 : 선택식당 }

실데이터를 적용하면 다음과 같습니다.

select - 연구소 - today - 2018.05.01 - { JOcneAEi_23 : '북촌손만두' }

선택한 식당에 이미지 정보가 있는지 확인합니다. 있으면 사용자 선택 결과에 이미지를 같이 보내줍니다.

1
2
3
4
5
6
ref = fs.collection(Const.COL_GROUP).document(user_group).get()
restaurants = ref._data.get(Const.FIELD_RESTAURANT)
target = restaurants.get(self.content)
img_src = target.get(Const.FIELD_IMG_SRC)

return Util.show_start_menu(msg, img_src)

결과 보기

#결과 보기 버튼을 누른 경우를 처리합니다.

코드는 추가된 부분만 작성하도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
class Message(Resource):

def post(self):
select = Select(self.args)
result = Result(self.args)

if self.content == Const.BTN_SELECT_LUNCH:
return select.show_restaurant_list()
elif self.content == Const.BTN_SEE_RESULT:
return result.show_result()

result.show_result() 를 구현합니다.

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
# events/result.py

import operator

from conf.const import Const
from conf.firebaseInit import fs
from conf.util import Util
from events.args import Args
from events.select import Select


class Result(Args):
def show_result(self):
try:
# 해당 그룹에서 가장 많이 나온 순서대로 보여준다.
user = fs.collection(Const.COL_USER).document(self.user_key).get()
user_group = user.get(Const.FIELD_GROUP)
except:
print('Not Found User Group')
return Select(self.args).show_group_list()

today = Util.get_day_str()
today_format = '[{}]'.format(today)
msg_list = [today_format]
result_dict = {}
try:
result = fs.collection(Const.COL_SELECT).document(user_group).collection(Const.COL_TODAY).document(today).get()
for user_key, restaurant in result._data.items():
if restaurant in result_dict:
result_dict[restaurant] += 1
else:
result_dict[restaurant] = 1

sorted_list = sorted(result_dict.items(), key=operator.itemgetter(1))
sorted_list.reverse()

for item in sorted_list:
title = item[0]
count = item[1]
msg_list.append('{}명 : {}'.format(count, title))
except:
print('Error')
msg_list.append('아직 아무도 선택하지 않았습니다.')

rst = {
"message": {
"text": '\n'.join(msg_list)
},
"keyboard": {
"type": "buttons",
"buttons": Const.DEFAULT_KEYBOARD
}
}

return Util.send_response(rst)

먼저 그룹을 확인합니다.
해당 그룹의 그룹원들이 오늘 선택한 내용을 확인해서 많이 나온 순서대로 정렬하여 결과를 보여줍니다.

공유하기