diff --git a/actions/action_followup.py b/actions/action_followup.py index 79fd1ac..01f93b9 100644 --- a/actions/action_followup.py +++ b/actions/action_followup.py @@ -32,18 +32,20 @@ def name(**kwargs) -> Text: @staticmethod def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], **kwargs): - # get all slots - recording_start_query = tracker.get_slot("recording_start_query") - location_permission = tracker.get_slot("location_permission") - is_dashboard_fragment = tracker.get_slot("is_dashboard_fragment") - gps = tracker.get_slot("gps") - car = tracker.get_slot("car") - bluetooth_permission = tracker.get_slot("bluetooth_permission") - bluetooth = tracker.get_slot("bluetooth") - obd_adapter = tracker.get_slot("bluetooth") - - print("slots:", recording_start_query, is_dashboard_fragment, - location_permission, gps, car, bluetooth, obd_adapter) + # get all slotss + slots = tracker.slots + + print("slotss:", slots) + + recording_start_query = slots["recording_start_query"] + recording_stop_query = slots["recording_stop_query"] + location_permission = slots["location_permission"] + is_dashboard_fragment = slots["is_dashboard_fragment"] + gps = slots["gps"] + car = slots["car"] + bluetooth_permission = slots["bluetooth_permission"] + bluetooth = slots["bluetooth"] + obd_adapter = slots["obd_adapter"] # check if recording query is true if recording_start_query: @@ -61,7 +63,6 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A turn_on_bluetooth(dispatcher) else: select_obd_adapter(dispatcher) - return [AllSlotsReset()] diff --git a/actions/start_recording_actions/action_start_recording.py b/actions/start_recording_actions/action_start_recording.py index 674f5df..2f96ffa 100644 --- a/actions/start_recording_actions/action_start_recording.py +++ b/actions/start_recording_actions/action_start_recording.py @@ -60,13 +60,13 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A text="GPS is not on! Do you want to turn it on?") return [SlotSet("location_permission", True), SlotSet("is_dashboard_fragment", True), SlotSet("gps", False), - SlotSet("recording_query", True)] + SlotSet("recording_start_query", True)] if car == Car.Not_Selected.value: dispatcher.utter_message( text="Car is not selected! Do you want to select one?") return [SlotSet("location_permission", True), SlotSet("is_dashboard_fragment", True), - SlotSet("car", False), SlotSet("recording_query", True)] + SlotSet("car", False), SlotSet("recording_start_query", True)] # GPS MODE if recording_mode == RecordingMode.GPS.value: @@ -76,7 +76,7 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A SlotSet("is_dashboard_fragment", True), SlotSet("gps", True), SlotSet("car", True), - SlotSet("recording_query", False) + SlotSet("recording_start_query", False) ] else: if metadata["recordingMetadata"]["has_bluetooth_permission"]: @@ -91,7 +91,7 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A SlotSet("bluetooth_permission", True), SlotSet("bluetooth", True), SlotSet("obd_adapter", True), - SlotSet("recording_query", False) + SlotSet("recording_start_query", False) ] else: dispatcher.utter_message( @@ -104,7 +104,7 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A SlotSet("bluetooth_permission", True), SlotSet("bluetooth", True), SlotSet("obd_adapter", False), - SlotSet("recording_query", True) + SlotSet("recording_start_query", True) ] else: dispatcher.utter_message( @@ -116,7 +116,7 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A SlotSet("car", True), SlotSet("bluetooth_permission", True), SlotSet("bluetooth", False), - SlotSet("recording_query", True) + SlotSet("recording_start_query", True) ] else: dispatcher.utter_message( @@ -128,7 +128,7 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A SlotSet("car", True), SlotSet("bluetooth_permission", False), SlotSet("bluetooth", False), - SlotSet("recording_query", True) + SlotSet("recording_start_query", True) ] else: dispatcher.utter_message( @@ -136,36 +136,36 @@ def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, A return [ SlotSet("is_dashboard_fragment", True), SlotSet("location_permission", False), - SlotSet("recording_query", True) + SlotSet("recording_start_query", True) ] elif metadata["recordingMetadata"]["recording_status"] == RecordingState.RECORDING_RUNNING.value: dispatcher.utter_message( text="Recording is already started!") - return [SlotSet("recording_query", False)] + return [SlotSet("recording_start_query", False)] elif metadata["recordingMetadata"]["recording_status"] == RecordingState.RECORDING_INIT.value: dispatcher.utter_message( text="Recording is starting, Please wait!") - return [SlotSet("recording_query", False)] + return [SlotSet("recording_start_query", False)] else: dispatcher.utter_message( text="Wrong Recording state, Something went wrong!") - return [SlotSet("recording_query", False)] + return [SlotSet("recording_start_query", False)] # dispatcher.utter_message( # text="Recording is already started! Navigating to recording screen(if not already there)") - # return [SlotSet("recording_query", True)] + # return [SlotSet("recording_start_query", True)] # dispatcher.utter_message( # text="Recording is already started! Do you want to stop it?") - # return [SlotSet("recording_query", True)] + # return [SlotSet("recording_start_query", True)] else: dispatcher.utter_message( - text="You are not on dashboard fragment! Do you want to go to dashboard fragment?") - return [SlotSet("is_dashboard_fragment", False), SlotSet("recording_query", True)] + text="You are not on dashboard fragment! Please go to dashboard fragment to start recording.") + return [SlotSet("is_dashboard_fragment", False), SlotSet("recording_start_query", True)] else: dispatcher.utter_message( text="Something went wrong! Please try again!") - return [SlotSet("recording_query", False)] + return [SlotSet("recording_start_query", False)] def start_recording(dispatcher: CollectingDispatcher, message: str, intent: str, entities: json) -> None: @@ -175,7 +175,7 @@ def start_recording(dispatcher: CollectingDispatcher, message: str, intent: str, action=ActionModel( activity_class_name="org.envirocar.app.recording.RecordingService", custom_event=Recording.START.value, - next_action=NextAction.RECOGNITION.value + next_action=NextAction.STANDBY.value ), data={ "intent": intent, diff --git a/actions/stop_recording_actions/action_stop_recording.py b/actions/stop_recording_actions/action_stop_recording.py index 81f471e..aeba5be 100644 --- a/actions/stop_recording_actions/action_stop_recording.py +++ b/actions/stop_recording_actions/action_stop_recording.py @@ -1,9 +1,15 @@ +import json from typing import Any, Text, Dict, List from rasa_sdk import Action, Tracker +from rasa_sdk.events import SlotSet from rasa_sdk.executor import CollectingDispatcher +from enums.recording.RecordingState import RecordingState +from enums.recording.metadata_type import MetadataType +from enums.recording.recording import Recording from model.action_model import ActionModel +from model.next_action import NextAction from model.response_model import ResponseModel @@ -15,32 +21,67 @@ def name(**kwargs) -> Text: return "action_stop_recording" @staticmethod - def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], **kwargs) -> List[Dict[Text, Any]]: + def run(dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], **kwargs) -> List[ + Dict[Text, Any] + ]: message = tracker.latest_message.get("text") intent = tracker.latest_message['intent'].get('name') entities = tracker.latest_message['entities'] - response = ResponseModel( - query=message, - reply="sure stop I will.", - action=ActionModel( - activity_class_name="org.envirocar.app.recording.RecordingService", - ), - data={ - "intent": intent, - "entity": entities[0]['entity'] - } - ) - - dispatcher.utter_message( - response="utter_custom_response", - query=response.query, - reply=response.reply, - action={ - "activity_class_name": response.action.activity_class_name, - "activity_extras": response.action.activity_extras - }, - data=response.data, - ) - - return [] + # get metadata from the latest message + metadata = tracker.latest_message.get("metadata") + + print("metadata", metadata) + + # if the metadata type is recording and user is on dashboard fragment, + if metadata["type"] == MetadataType.RECORDING.value: + if metadata["recordingMetadata"]["isDashboardFragment"]: + # if the user is on dashboard fragment, then check if recording is currently going on + if metadata["recordingMetadata"]["recording_status"] == RecordingState.RECORDING_RUNNING.value: + # if recording is currently going on, then stop the recording + stop_recording(dispatcher, message, intent, entities) + return [SlotSet("is_dashboard_fragment", True)] + + elif metadata["recordingMetadata"]["recording_status"] == RecordingState.RECORDING_STOPPED.value: + dispatcher.utter_message( + text="There is currently no Recording going on") + return [SlotSet("recording_stop_query", False)] + elif metadata["recordingMetadata"]["recording_status"] == RecordingState.RECORDING_INIT.value: + dispatcher.utter_message( + text="There is currently no Recording going on") + return [SlotSet("recording_stop_query", False)] + else: + dispatcher.utter_message( + text="Wrong Recording state, Something went wrong!") + return [SlotSet("recording_stop_query", False)] + else: + dispatcher.utter_message( + text="You are not on dashboard fragment! Please go to dashboard fragment to start recording.") + return [SlotSet("is_dashboard_fragment", False), SlotSet("recording_stop_query", True)] + else: + dispatcher.utter_message( + text="Something went wrong! Please try again!") + return [SlotSet("recording_stop_query", False)] + + +def stop_recording(dispatcher: CollectingDispatcher, message: str, intent: str, entities: json) -> None: + response = ResponseModel( + query=message, + reply="Sure, I will stop recording", + action=ActionModel( + activity_class_name="org.envirocar.app.recording.RecordingService", + custom_event=Recording.STOP.value, + next_action=NextAction.STANDBY.value + ), + data={ + "intent": intent, + "entity": entities[0]['entity'] + } + ) + + dispatcher.utter_message(json_message={ + "query": response.query, + "reply": response.reply, + "action": response.action.as_dict(), + "data": response.data + }) diff --git a/data/rules.yml b/data/rules.yml index 472de1c..98fd03c 100644 --- a/data/rules.yml +++ b/data/rules.yml @@ -15,7 +15,7 @@ rules: - rule: Run a followup start action anytime the user affirms steps: - intent: affirm - - action: action_followup_start + - action: action_followup - rule: Start recording steps: