Esempio n. 1
0
def in_progress_choose_sceanrio_request(handler_input, minus_points,
                                        quit_minus_points):
    session_attributes = handler_input.attributes_manager.session_attributes
    user = handler_input.request_envelope.context.system.user.user_id
    active_scenario = ActiveScenario.objects.get(user=user)

    # if box was opened in game
    if not session_attributes.get('box') and active_scenario.box:
        return cancel_and_stop_request(handler_input, quit_minus_points)

    # only ask how many persons will participate if scenario is selected
    if not session_attributes.get('scenario'):
        try:
            slots = handler_input.request_envelope.request.intent.slots
            scenario_slot = slots.get('scenario').value if slots.get(
                'scenario') else None
            Scenario.objects.get(
                other_names__contains=scenario_slot) if scenario_slot else None
        except Scenario.DoesNotExist:
            return fallback_request(handler_input, minus_points,
                                    quit_minus_points)

        current_intent = handler_input.request_envelope.request.intent
        return handler_input.response_builder.add_directive(
            DelegateDirective(updated_intent=current_intent)).response
    else:
        return fallback_request(handler_input, minus_points, quit_minus_points)
Esempio n. 2
0
def choose_sceanrio_request(handler_input, minus_points, quit_minus_points):
    """Handler for Choose Scenario Intent."""
    session_attributes = handler_input.attributes_manager.session_attributes
    user = handler_input.request_envelope.context.system.user.user_id
    slots = handler_input.request_envelope.request.intent.slots
    active_scenario = ActiveScenario.objects.get(user=user)

    # if box was opened in game
    if not session_attributes.get('box') and active_scenario.box:
        return cancel_and_stop_request(handler_input, quit_minus_points)

    if slots.get('players'):
        user_input = (slots.get('players').value)
        try:
            number_of_players = int(user_input)
        except ValueError:
            number_of_players = 0
    else:
        number_of_players = 0

    session_attributes['players'] = number_of_players

    # if scenario set in session
    if not session_attributes.get('scenario'):
        # save players
        try:
            scenario = Scenario.objects.get(other_names__contains=slots.get(
                'scenario').value if slots.get('scenario') else None)
            session_attributes['scenario'] = scenario.id
            speech_text = get_template('skill/close_box.html').render()
            return handler_input.response_builder.speak(speech_text).set_card(
                SimpleCard(
                    f'Spiel Vorbereitungen',
                    BeautifulSoup(
                        speech_text,
                        features="html.parser").text)).set_should_end_session(
                            False).response
        except Scenario.DoesNotExist as e:
            print('Scenario.DoesNotExist: ', e)
            return fallback_request(handler_input, minus_points,
                                    quit_minus_points)
        except ValueError as e:
            print('ValueError: ', e)
            return fallback_request(handler_input, minus_points,
                                    quit_minus_points)
    else:
        return fallback_request(handler_input, minus_points, quit_minus_points)
Esempio n. 3
0
def catch_all(handler_input):
    # is executed if no suitable request handler was found.
    return fallback_request(handler_input, MINUS_POINTS, QUIT_MINUS_POINTS)
Esempio n. 4
0
def fallback_handler(handler_input):
    """Fallback Handler"""
    return fallback_request(handler_input, MINUS_POINTS, QUIT_MINUS_POINTS)
Esempio n. 5
0
def pose_riddle_request(handler_input, minus_points, quit_minus_points):
    """Handler for Pose Riddle Intent."""
    session_attributes = handler_input.attributes_manager.session_attributes
    user = handler_input.request_envelope.context.system.user.user_id
    active_scenario = ActiveScenario.objects.get(user=user)

    # if box was opened in game
    if not session_attributes.get('box') and active_scenario.box:
        return cancel_and_stop_request(handler_input, quit_minus_points)

    if session_attributes.get('scenario') and not session_attributes.get('box'):
        slots = handler_input.request_envelope.request.intent.slots
        set_should_end_session = False
        next_riddle = None
        duration = None

        # slots
        answer = slots.get("answer").value if slots.get("answer").value else slots.get("number").value

        # attributes
        counter = session_attributes['counter']
        scenario = Scenario.objects.get(id=session_attributes['scenario'])
        riddle = scenario.riddles.get(id=session_attributes['riddle'])
        score = session_attributes['score']

        if answer in riddle.solution.lower().split(', '):
            # Reset hint counter if answer correct
            session_attributes['hint_counter'] = 0
            # Set next Riddle
            counter += 1
            # Add points to the score
            score += riddle.points

            if counter == scenario.riddles.count():
                # Won: all puzzles answered
                set_should_end_session = True

                user = handler_input.request_envelope.context.system.user.user_id
                box_command_to_json(Command.objects.get(name='modbus box öffnen'), user)

                start_time = datetime.datetime.strptime(session_attributes.get('start_time'), '%Y-%m-%d %H:%M:%S.%f')
                now = datetime.datetime.now()

                duration = (active_scenario.duration + (now - start_time)).seconds / 60

                active_scenario.delete()
            else:
                # Gehe zum nächsten Rätsel
                next_riddle = scenario.riddles.order_by('orderedriddle')[counter]
                riddle_commands_to_json(next_riddle, user)

                session_attributes['riddle'] = next_riddle.id
        else:
            # Wrong answer
            score += minus_points

        speech_text = get_template('skill/riddle.html').render(
            {
                'score': score,
                'counter': counter,
                'scenario': scenario,
                'riddle': riddle,
                'next_riddle': next_riddle,
                'duration': duration,
                'correct': answer in riddle.solution.lower().split(', '),
            }
        )

        session_attributes['counter'] = counter
        session_attributes['score'] = score

        return handler_input.response_builder.speak(
            speech_text
        ).set_card(
            SimpleCard(
                f'{counter + 1}. Rästel',
                BeautifulSoup(speech_text, features="html.parser").text
            )
        ).set_should_end_session(
            set_should_end_session
        ).response
    else:
        return fallback_request(handler_input, minus_points, quit_minus_points)
Esempio n. 6
0
def close_box_start_game_request(handler_input, minus_points, quit_minus_points):
    """Handler to close box and start the game"""
    session_attributes = handler_input.attributes_manager.session_attributes

    # scenario selected and box still opened
    if session_attributes.get('scenario') and session_attributes.get('box'):
        user = handler_input.request_envelope.context.system.user.user_id
        active_scenario = ActiveScenario.objects.get(user=user)

        # check if box is closed at all
        if active_scenario.box:
            speech_text = get_template('skill/close_box.html').render()

            return handler_input.response_builder.speak(
                speech_text
            ).set_card(
                SimpleCard(
                    "Spiel Vorbereitungen",
                    BeautifulSoup(speech_text, features="html.parser").text
                )
            ).set_should_end_session(
                False
            ).response
        else:
            box_command_to_json(Command.objects.get(name='modbus box schließen'), user)
            session_attributes['box'] = False
            scenario = Scenario.objects.get(id=session_attributes['scenario'])

            # new game will be started
            if not session_attributes.get('riddle'):
                riddle = scenario.riddles.order_by('orderedriddle').first()
                counter = 0
                session_attributes['score'] = 0
                session_attributes['counter'] = counter
                session_attributes['riddle'] = riddle.id

                speech_text = get_template('skill/first_riddle.html').render(
                    {'scenario': scenario, 'riddle': riddle}
                )
            # game will be continued
            else:
                counter = session_attributes['counter']
                riddle = scenario.riddles.get(id=session_attributes['riddle'])

                speech_text = get_template('skill/first_riddle.html').render(
                    {'scenario': None, 'riddle': riddle}
                )

            # if commands in riddle, create JSON -> pi starts executing commands
            riddle_commands_to_json(riddle, user)

            return handler_input.response_builder.speak(
                speech_text
            ).set_card(
                SimpleCard(
                    f'{counter + 1}. Rästel für Szenario: {scenario.name}',
                    BeautifulSoup(speech_text, features="html.parser").text
                )
            ).set_should_end_session(
                False
            ).response
    else:
        return fallback_request(handler_input, minus_points, quit_minus_points)