예제 #1
0
def callback(request):
    def startButton(reply_token, send_text):
        try:
            reply = line_bot_api.reply_message(reply_token, [
                TextSendMessage(send_text),
                TemplateSendMessage(alt_text='メニューを更新',
                                    template=ButtonsTemplate(
                                        title='メニューを更新',
                                        text='更新ボタンを押してください',
                                        actions=[
                                            PostbackTemplateAction(
                                                label='メニューを更新', data='start'),
                                        ]))
            ])
        except LineBotApiError:
            return HttpResponseBadRequest()
        return reply

    def confirmButton(reply_token, send_text):
        try:
            reply = line_bot_api.reply_message(reply_token, [
                TextSendMessage(send_text),
                TemplateSendMessage(
                    alt_text='確認',
                    template=ButtonsTemplate(
                        title='確認',
                        text='選択してください',
                        actions=[
                            PostbackTemplateAction(label='更新', data='save'),
                            PostbackTemplateAction(label='中止', data='quit'),
                        ]))
            ])
        except LineBotApiError:
            return HttpResponseBadRequest()
        return reply

    if request.method == 'POST':
        body = request.body.decode('utf-8')
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        try:
            events = parser.parse(body, signature)
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            posts = Post.objects.values('user_id').order_by('-created_at')
            users = []
            for post in posts:
                users.append(post['user_id'])
            has_created = event.source.user_id in users
            if has_created == True:
                post = Post.objects.filter(
                    user_id=event.source.user_id).order_by('-created_at')[0]

            if isinstance(event, FollowEvent):
                startButton(
                    event.reply_token,
                    'フォローありがとうございます!\nメニューを更新したい場合、下のボタンを押してください\nなお、以下がサイトのURLです\n\nhttps://{}'
                    .format(settings.DOMAIN_NAME))

            elif isinstance(event, PostbackEvent):
                if event.postback.data == 'start':
                    if has_created == False:
                        post = Post(user_id=event.source.user_id, status=1)
                        post.save()
                        try:
                            line_bot_api.reply_message(
                                event.reply_token,
                                TextSendMessage('メニューの更新ですね\nまずは料理名を入力してください'))
                        except LineBotApiError:
                            return HttpResponseBadRequest()
                    else:
                        if post.status == 0:
                            post = Post(user_id=event.source.user_id, status=1)
                            post.save()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage(
                                        'メニューの更新ですね\nまずは料理名を入力してください'))
                            except LineBotApiError:
                                return HttpResponseBadRequest()

                elif event.postback.data == 'save':
                    if has_created == True:
                        if post.status == 5:
                            post.status = 0
                            post.save()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage(
                                        'サイトが更新されました\n\nhttps://{}'.format(
                                            settings.DOMAIN_NAME)))
                            except LineBotApiError:
                                return HttpResponseBadRequest()

                elif event.postback.data == 'quit':
                    if has_created == True:
                        if post.status == 5:
                            post.image_path.delete()
                            post.delete()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('操作中のデータを削除しました'))
                            except LineBotApiError:
                                return HttpResponseBadRequest()

            elif isinstance(event, MessageEvent):
                if isinstance(event.message, TextMessage):
                    if event.message.text == 'ニッポンポン':
                        del_posts = Post.objects.exclude(
                            Q(image_path__contains='ebi-fry')
                            | Q(image_path__contains='katsu-don')
                            | Q(image_path__contains='beef-stew'))
                        for del_post in del_posts:
                            del_post.image_path.delete()
                        Post.objects.all().delete()
                        try:
                            line_bot_api.reply_message(
                                event.reply_token,
                                TextSendMessage('合衆国ニッポンポン!!!'))
                        except LineBotApiError:
                            return HttpResponseBadRequest()
                    elif event.message.text == 'ナナリー':
                        del_posts = Post.objects.exclude(
                            Q(image_path__contains='ebi-fry')
                            | Q(image_path__contains='katsu-don')
                            | Q(image_path__contains='beef-stew'))
                        for del_post in del_posts:
                            del_post.image_path.delete()
                        Post.objects.all().delete()
                        Post.objects.bulk_create([
                            Post(title='エビフライ',
                                 description='プリプリのエビをカリカリの衣で包んだ至高の一品',
                                 price='850',
                                 image_path='img/post/ebi-fry.jpg',
                                 status=0),
                            Post(title='シチュー',
                                 description='バラ肉をルーとともにホロホロになるまで煮込んだビーフシチュー',
                                 price='1200',
                                 image_path='img/post/beef-stew.jpg',
                                 status=0),
                            Post(title='かつ丼',
                                 description='揚げたてのカツをふんわり半熟卵でとじた定番の一品',
                                 price='750',
                                 image_path='img/post/katsu-don.jpg',
                                 status=0),
                        ])
                        try:
                            line_bot_api.reply_message(
                                event.reply_token,
                                TextSendMessage('ナナリーーーーーッッ!!!!!'))
                        except LineBotApiError:
                            return HttpResponseBadRequest()

                    if has_created == True:
                        if post.status == 0:
                            startButton(
                                event.reply_token,
                                'ご利用ありがとうございます\nメニューを更新したい場合、下のボタンを押してください\nなお、以下がサイトのURLです\n\nhttps://{}'
                                .format(settings.DOMAIN_NAME))
                        elif post.status == 1:
                            post.title = event.message.text
                            post.status = 2
                            post.save()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('次はメニューの説明文を入力してください'),
                                )
                            except LineBotApiError:
                                return HttpResponseBadRequest()
                        elif post.status == 2:
                            post.description = event.message.text
                            post.status = 3
                            post.save()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('次は値段を入力してください'),
                                )
                            except LineBotApiError:
                                return HttpResponseBadRequest()
                        elif post.status == 3:
                            try:
                                post.price = int(event.message.text)
                                post.status = 4
                                post.save()
                            except:
                                try:
                                    line_bot_api.reply_message(
                                        event.reply_token,
                                        TextSendMessage('半角数字を入力してください'),
                                    )
                                except LineBotApiError:
                                    return HttpResponseBadRequest()
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('次は掲載する画像を送信してください'),
                                )
                            except LineBotApiError:
                                return HttpResponseBadRequest()
                        elif post.status == 4:
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('画像を送信してください'),
                                )
                            except LineBotApiError:
                                return HttpResponseBadRequest()
                    else:
                        startButton(
                            event.reply_token,
                            'ご利用ありがとうございます\nメニューを更新したい場合、下のボタンを押してください\nなお、以下がサイトのURLです\n\nhttps://{}'
                            .format(settings.DOMAIN_NAME))
                elif isinstance(event.message, ImageMessage):
                    if has_created == True:
                        if post.status == 4:
                            try:
                                message_content = line_bot_api.get_message_content(
                                    event.message.id)
                                with NamedTemporaryFile(mode='w+b') as f:
                                    for chunk in message_content.iter_content(
                                    ):
                                        f.write(chunk)
                                    post.image_path.save(event.message.id +
                                                         '.jpg',
                                                         File(f),
                                                         save=True)
                                post.status = 5
                                post.save()
                            except:
                                traceback.print_exc()
                                try:
                                    line_bot_api.reply_message(
                                        event.reply_token,
                                        TextSendMessage('画像を保存できませんでした'),
                                    )
                                except LineBotApiError:
                                    return HttpResponseBadRequest()
                            confirmButton(
                                event.reply_token,
                                '項目は以上です\nこれでよろしければ「保存」、更新を中止したい場合は「中止」を押してください'
                            )

                        elif post.status == 0:
                            startButton(
                                event.reply_token,
                                'ご利用ありがとうございます\nメニューを更新したい場合、下のボタンを押してください\nなお、以下がサイトのURLです\n\nhttps://{}'
                                .format(settings.DOMAIN_NAME))

                        elif post.status == 5:
                            confirmButton(event.reply_token,
                                          'すでに画像は送信されています\n更新または中止を選択してください')

                        else:
                            try:
                                line_bot_api.reply_message(
                                    event.reply_token,
                                    TextSendMessage('テキストを入力してください'),
                                )
                            except LineBotApiError:
                                return HttpResponseBadRequest()
                    else:
                        startButton(
                            event.reply_token,
                            'ご利用ありがとうございます\nメニューを更新したい場合、下のボタンを押してください\nなお、以下がサイトのURLです\n\nhttps://{}'
                            .format(settings.DOMAIN_NAME))
        return HttpResponse()
    else:
        return HttpResponseBadRequest()