def message(request): if request.method == 'POST': request_data = ((request.body).decode('utf-8')) request_data = json.loads(request_data) userMessage = request_data['content'] user_key = request_data['user_key'] user = User.getOrCreate(user_key) start = datetime.datetime.now() botMessageDict = Response.getResponseDict(user, userMessage) timeDiff = datetime.datetime.now() - start numOfMails = Mail.getNumOfMails(user) if numOfMails: botMessageDict['message']['text'] = '[\'메시지\'라고 입력해주세요!(' + str( numOfMails) + '개)]\n\n' + botMessageDict['message']['text'] Log.write(user, userMessage, botMessageDict['message']['text'], timeDiff.total_seconds()) botMessageDumped = json.dumps(botMessageDict) return HttpResponse(botMessageDumped)
def answer(request): json_str = ((request.body).decode('utf-8')) received_json_data = json.loads(json_str) datacontent = received_json_data['userRequest']['utterance'] user_key = received_json_data['userRequest']['user']['properties']['plusfriendUserKey'] user = User.get_or_create(user_key) bot_user = User.get_or_create('sunwoobot') if not bot_user.user_name: bot_user.set_name("선우봇") start = datetime.datetime.now() cmd = datacontent.split()[0] data = re.sub(cmd + " ", "", datacontent) if user.state == 'lazylet' and cmd == '/내카드': try: set_ = Lazylet_Set.objects.get(user=user) except Lazylet_Set.DoesNotExist: set_ = Lazylet_Set(user=user, title=str(user.user_name) + "의 세트") set_.save() if not Lazylet_Term.objects.filter(lazylet_set=set_).exists(): setempty = "[귀찮렛 베타]\n세트가 비어 있습니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setempty } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' } ] } } else: term_list = Lazylet_Term.objects.filter(lazylet_set=set_) paginator = Paginator(term_list, 5) # Show 5 terms per page page = data terms = paginator.get_page(page) items = [] for t in terms: item = { 'title': t.term, 'description': t.definition, 'link': { 'web': 'http://dic.daum.net/search.do?dic=eng&q=' + t.term } } if t.image_url: item['imageUrl'] = t.image_url items.append(item) quickReplies = [ { 'label': '내보내기', 'action': 'message', 'messageText': '/내보내기' }, { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] if terms.has_next(): quickReplies.insert(0, { 'label': '다음', 'action': 'message', 'messageText': '/내카드 ' + str(terms.next_page_number()) }) if terms.has_previous(): quickReplies.insert(0, { 'label': '이전', 'action': 'message', 'messageText': '/내카드 ' + str(terms.previous_page_number()) }) response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'listCard': { 'header': { 'title': '내 카드' }, 'items': items } } ], 'quickReplies': quickReplies } } elif user.state == 'lazylet' and cmd == '/내보내기': try: set_ = Lazylet_Set.objects.get(user=user) except Lazylet_Set.DoesNotExist: set_ = Lazylet_Set(user=user, title=str(user.user_name) + "의 세트") set_.save() if not Lazylet_Term.objects.filter(lazylet_set=set_).exists(): setempty = "[귀찮렛 베타]\n세트가 비어 있습니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setempty } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' } ] } } else: term_set = Lazylet_Term.objects.filter(lazylet_set=set_) response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': "\n".join(['%s\t%s' % (term.term, term.definition) for term in term_set]) } }, { 'basicCard': { 'description': 'Quizlet을 사용하고 있나요? 단어 목록을 복사하여 Quizlet에 붙여넣기만 하면 됩니다. 간단하죠?', 'buttons': [ { 'action': 'webLink', 'label': 'Quizlet으로 가져오기', 'webLinkUrl': 'https://quizlet.com/ko/help/2444107/import-content-to-quizlet' } ] } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] } } elif user.state == 'lazylet' and cmd == '/카드추가': try: set_ = Lazylet_Set.objects.get(user=user) except Lazylet_Set.DoesNotExist: set_ = Lazylet_Set(user=user, title=str(user.user_name) + "의 세트") set_.save() if not Lazylet_Term.objects.filter(lazylet_set=set_).exists(): setempty = "[귀찮렛 베타]\n여러분이 배우고 있는 단어나 문장을 입력하세요. Daum 사전 덕분에 뜻이 그 옆에 마법처럼 나타납니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setempty } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' } ] } } else: term_set = Lazylet_Term.objects.filter(lazylet_set=set_) response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': "\n".join(['%s\t%s' % (term.term, term.definition) for term in term_set]) } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] } } elif user.state == 'lazylet' and cmd == '/지우기': try: set_ = Lazylet_Set.objects.get(user=user) except Lazylet_Set.DoesNotExist: set_ = Lazylet_Set(user=user, title=str(user.user_name) + "의 세트") set_.save() Lazylet_Term.objects.filter(lazylet_set=set_).delete() setempty = "[귀찮렛 베타]\n세트가 비어 있습니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setempty } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' } ] } } elif user.state == 'lazylet' and not cmd.startswith('/'): words = re.findall("[\w']+", datacontent) try: set_ = Lazylet_Set.objects.get(user=user) except Lazylet_Set.DoesNotExist: set_ = Lazylet_Set(user=user, title=str(user.user_name) + "의 세트") set_.save() for w in words: term = Lazylet_Term(lazylet_set=set_, term=w, definition="로드 중...", image_url="") term.save() t = Lazylet_GetMeaningWordsThread(set_) t.start() t.join(3) if len(words) == 1: basicCard = { 'description': '[귀찮렛 베타]\n성공적으로 추가되었습니다.\n모든 카드를 보려면 /내카드 를 입력하십시오.\n\n %s\t%s' % (words[0], Lazylet_Term.objects.get(lazylet_set=set_, term=words[0]).definition), 'buttons': [ { 'action': 'webLink', 'label': 'Daum 사전에서 보기', 'webLinkUrl': 'http://dic.daum.net/search.do?dic=eng&q=' + words[0] } ] } if Lazylet_Term.objects.get(lazylet_set=set_, term=words[0]).image_url: basicCard['thumbnail'] = { 'imageUrl': Lazylet_Term.objects.get(lazylet_set=set_, term=words[0]).image_url } response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'basicCard': basicCard } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] } } else: response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': '[귀찮렛 베타]\n성공적으로 추가되었습니다.\n모든 카드를 보려면 /내카드 를 입력하십시오.\n\n ' + "\n".join(['%s\t%s' % (w, Lazylet_Term.objects.get(lazylet_set=set_, term=w).definition) for w in words]) } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] } } elif user.state == 'wordchain' and cmd == '/랭킹': try: player = WordChain_Player.objects.get(user=user) except WordChain_Player.DoesNotExist: player = WordChain_Player(user=user) player.save() player_list = WordChain_Player.objects.all().order_by('-score') paginator = Paginator(player_list, 5) # Show 5 players per page page = data players = paginator.get_page(page) items = [] for idx, p in enumerate(players): item = { 'title': str(players.start_index() + idx) + ". " + p.user.user_name, 'description': str(p.score) + "점" } items.append(item) quickReplies = [ { 'label': '뒤로', 'action': 'message', 'messageText': '/끝말톡' }, { 'label': '/랭킹', 'action': 'message', 'messageText': '/랭킹' } ] if players.has_next(): quickReplies.insert(0, { 'label': '다음', 'action': 'message', 'messageText': '/랭킹 ' + str(players.next_page_number()) }) if players.has_previous(): quickReplies.insert(0, { 'label': '이전', 'action': 'message', 'messageText': '/랭킹 ' + str(players.previous_page_number()) }) response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'listCard': { 'header': { 'title': '🏆 랭킹' }, 'items': items } } ], 'quickReplies': quickReplies } } elif user.state == 'setusername' and not cmd.startswith('/'): if not User.objects.filter(user_name=datacontent).exists(): user.set_name(datacontent) user.state = 'home' user.save(update_fields=['state']) setusername = "******" + user.user_name + "님! 선우봇에 오신 것을 환영합니다!" response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setusername } } ], 'quickReplies': [ { 'label': '/끝말톡', 'action': 'message', 'messageText': '/끝말톡' }, { 'label': '/귀찮렛', 'action': 'message', 'messageText': '/귀찮렛' }, { 'label': '/도움말', 'action': 'message', 'messageText': '/도움말' } ] } } else: setusername = "******" response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setusername } } ] } } elif cmd == '/귀찮렛': user.state = 'lazylet' user.save(update_fields=['state']) lazylet = "[귀찮렛 베타]\n어학 사전을 찾는 것이 귀찮으신가요? 선우봇 귀찮렛 베타가 대신 찾아드립니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'basicCard': { 'description': lazylet, 'thumbnail': { 'imageUrl': 'https://ryuhyuncom.files.wordpress.com/2019/01/lazylet-1.png' } } } ], 'quickReplies': [ { 'label': '/내카드', 'action': 'message', 'messageText': '/내카드' }, { 'label': '/카드추가', 'action': 'message', 'messageText': '/카드추가' }, { 'label': '/지우기', 'action': 'message', 'messageText': '/지우기' } ] } } elif cmd == '/끝말톡': user.state = 'wordchain' user.save(update_fields=['state']) wordchain = "[끝말톡 이전 안내]\n\n끝말톡 온라인의 정식 버전이 출시되었어요!\n새로운 플러스친구 @끝말톡 (http://pf.kakao.com/_YzzWj)에서 지금 만나실 수 있습니다.\n오픈 베타 서비스가 종료됨에 따라, 모든 기존 사용자 데이터는 초기화되는 점에 유의하시기 바랍니다.\n\n그동안 끝말톡 오픈 베타를 이용해주셔서 감사드리며 더 좋은 서비스로 찾아뵙도록 하겠습니다." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'basicCard': { 'description': wordchain, 'thumbnail': { 'imageUrl': 'http://ryuhyun.com/wp-content/uploads/2019/02/wordchain-1.png', 'fixedRatio': True } } } ], 'quickReplies': [ { 'label': '/랭킹', 'action': 'message', 'messageText': '/랭킹' } ] } } else: user.state = 'home' user.save(update_fields=['state']) help = "봇 이름 : 선우봇\n버전 : " + version + \ "\n제작자 : 류현(박선우)\n\n 앱을 실행하려면 /<앱 이름>을 사용하십시오." response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': help } } ], 'quickReplies': [ { 'label': '/끝말톡', 'action': 'message', 'messageText': '/끝말톡' }, { 'label': '/귀찮렛', 'action': 'message', 'messageText': '/귀찮렛' }, { 'label': '/도움말', 'action': 'message', 'messageText': '/도움말' } ] } } time_diff = datetime.datetime.now() - start if not user.user_name: user.state = 'setusername' user.save(update_fields=['state']) setusername = "******" response_body = { 'version': "2.0", 'template': { 'outputs': [ { 'simpleText': { 'text': setusername } } ] } } Log.write(user, datacontent, str(response_body), time_diff.total_seconds()) return JsonResponse(response_body)