Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)