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)
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)
def catch_all(handler_input): # is executed if no suitable request handler was found. return fallback_request(handler_input, MINUS_POINTS, QUIT_MINUS_POINTS)
def fallback_handler(handler_input): """Fallback Handler""" return fallback_request(handler_input, MINUS_POINTS, QUIT_MINUS_POINTS)
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)
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)