WtfJoke/kult-lunchbot

View on GitHub
googleaction.py

Summary

Maintainability
A
35 mins
Test Coverage
"""
Handling Dialog of dialogflow.com used in Google Action
For more info about request/response
https://dialogflow.com/docs/fulfillment#request
https://dialogflow.com/docs/fulfillment#response
"""
import json
from flask import make_response, jsonify
import datetime
from menu.lunchmenu import DateFormats
import scraper


class GoogleActionDialog:

    GOOGLE_LINE_SEPARATOR = "  "

    def __init__(self, request, kult_menu):
        self.request = request
        request_data = json.loads(request.data)
        self.request_result = request_data['result']
        self.kult_menu = kult_menu

    def handle(self):
        return self.handle_by_action()

    def handle_by_action(self):
        action = self.request_result['action']

        if action == "listMenus":
            response = self.action_list_menus()
        elif action == "selectedMenuNumber":
            response = self.action_selected_menu_number()
        elif action == "startAction":
            response = self.action_start()
        elif action == "whichMenu":
            response = self.action_which_menu()
        else:
            response = make_response('nothing to do here', 404)

        return response

    def action_list_menus(self):
        today = datetime.date.today()
        # TODO take date from request and change weekday to "Heute" if weekday == today
        today_translated_weekday = today.strftime("%A")
        daily_menu = self.kult_menu.get_daily_menu_by_date(today.strftime(DateFormats.COMMON))

        menu_count = len(daily_menu.get_menu_items())

        list_kult_menus = "Interessierst du dich für eine der {} Menüs die es {} im {} gibt?"\
            .format(menu_count, today_translated_weekday, "Kult")
        response = jsonify(speech=list_kult_menus,
                           displaytext=list_kult_menus,
                           source=scraper.URL)
        return make_response(response)

    def action_selected_menu_number(self):
        menu_numbers = self.request_result["parameters"]["number"]
        daily_menu = self.kult_menu.get_daily_menu_by_date(datetime.date.today().strftime(DateFormats.COMMON))
        menu_texts = []
        if not menu_numbers:  # empty string means all menus
            menu_texts.append(daily_menu.get_menu_one().get_menu())
            menu_texts.append(daily_menu.get_menu_two().get_menu())
            menu_texts.append(daily_menu.get_menu_three().get_menu())

        for menu_number_as_string in menu_numbers:
            menu_number = int(menu_number_as_string)
            if menu_number == 1:
                menu_texts.append(daily_menu.get_menu_one().get_menu())
            elif menu_number == 2:
                menu_texts.append(daily_menu.get_menu_two().get_menu())
            elif menu_number == 3:
                menu_texts.append(daily_menu.get_menu_three().get_menu())
            else:
                menu_texts.append("Sorry, habe kein Menü: " + str(menu_number))

        menu_text = self.GOOGLE_LINE_SEPARATOR.join(menu_texts)
        response = jsonify(speech=menu_text,
                           displaytext=menu_text,
                           source=scraper.URL)
        return make_response(response)

    def action_start(self):
        parameters = self.request_result["parameters"]
        date = parameters["date"]  # TODO: take session and remember all inputs like date
        list_restaurant_text = "Es gibt im Restaurant Kult Mittagstisch"
        response = jsonify(speech=list_restaurant_text,
                           displaytext=list_restaurant_text,
                           source=scraper.URL)
        return make_response(response)

    def action_which_menu(self):
        daily_menu = self.kult_menu.get_daily_menu_by_date(datetime.date.today().strftime(DateFormats.COMMON))
        menu_count = len(daily_menu.get_menu_items())
        which_menu_text = "Für welche der {} Menüs interessierst du dich?".format(menu_count)
        response = jsonify(speech=which_menu_text,
                           displaytext=which_menu_text,
                           source=scraper.URL)
        return make_response(response)