Пример #1
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        returned = [SlotSet("object", None), SlotSet("next_action", None)]
        user, room = get_current_user_room(tracker)
        current_room = tracker.get_slot("current_room")
        value = tracker.get_slot("object")
        # Check if it is a treasure or monster in the room
        if isinstance(value, str) and not value.isnumeric():
            if value.lower() == "monster":
                if len(room.found_monsters) > 0:
                    current_monster = room.found_monsters[0]
                    room.monsters -= 1
                    dispatcher.utter_message(text="You reach a " +
                                             current_monster +
                                             ". What do you do?")
                    returned.append(SlotSet("current_monster",
                                            current_monster))
                else:
                    dispatcher.utter_message(
                        text="You don't see any monster here.")
                return returned
            elif value.lower() == "treasure":
                if len(room.found_treasures) > 0:
                    current_treasure = room.found_treasures.pop(0)
                    room.treasures -= 1
                    user.weapons.append(current_treasure)
                    dispatcher.utter_message(
                        text="<speak><emphasis level='strong'>You now have the "
                        + current_treasure +
                        ".</emphasis><break time='0.1'/> What do you want to do?</speak>"
                    )
                    returned.append(SlotSet("weapons", user.weapons))
                else:
                    dispatcher.utter_message(
                        text="You don't see any treasure here.")
                return returned
            elif value.lower() == "next":
                value = room.next[-1] if len(room.next) > 0 else 0
            elif value.lower() == "previous":
                value = room.previous
                if value is None:
                    dispatcher.utter_message(text="This is the first room!")
                    return returned
            else:
                dispatcher.utter_message(
                    text="You can't go here, what do you want to do?")
                return returned
        new_room = None
        reachable_rooms = []
        reachable_rooms = room.next
        if room.previous is not None:
            reachable_rooms.append(room.previous)
        new_room = get_room(user, reachable_rooms, value)
        if not new_room:
            dispatcher.utter_message(
                text="You cannot reach this room from here.")
            return returned

        if str(value) == str(user.n_rooms):
            dispatcher.utter_message(
                text=
                "<speak><emphasis level ='moderate'>You have reached the final room! <prosody pitch='high'>You win!!</prosody></emphasis></speak>"
            )
            return [Restarted()]
        else:
            dispatcher.utter_message(text="Welcome to room number " +
                                     str(value) + ", what do you want to do?")
        returned.append(SlotSet("current_room", value))
        return returned
Пример #2
0
 def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
         domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
     # dispatcher.utter_message(text="Hello World!")
     print(tracker.get_slot('num'))
     # dispatcher.utter_template('utter_your_num', tracker, number=details[str(tracker.get_slot('NAME')).lower()])
     return []
Пример #3
0
    def submit(self, dispatcher: CollectingDispatcher, tracker: Tracker,
               domain: Dict[Text, Any]) -> List[Dict]:
        """Once required slots are filled, print buttons for found facilities"""

        location = tracker.get_slot('location')
        facility_type = tracker.get_slot('facility_type')

        results = _find_facilities(location, facility_type)
        button_name = _resolve_name(FACILITY_TYPES, facility_type)
        if len(results) == 0:
            dispatcher.utter_message(
                "Sorry, we could not find a {} in {}.".format(
                    button_name, location.title()))
            return []

        buttons = []
        # limit number of results to 3 for clear presentation purposes
        for r in results[:3]:
            if facility_type == FACILITY_TYPES["hospital"]["resource"]:
                facility_id = r.get("provider_id")
                name = r["hospital_name"]
            elif facility_type == FACILITY_TYPES["nursing_home"]["resource"]:
                facility_id = r["federal_provider_number"]
                name = r["provider_name"]
            else:
                facility_id = r["provider_number"]
                name = r["provider_name"]

            payload = "/inform{\"facility_id\":\"" + facility_id + "\"}"
            buttons.append({
                "title": "{}".format(name.title()),
                "payload": payload
            })

        if len(buttons) == 1:
            message = "Here is a {} near you:".format(button_name)
        else:
            if button_name == "home health agency":
                button_name = "home health agencie"
            message = "Here are {} {}s near you:".format(
                len(buttons), button_name)

        # TODO: update rasa core version for configurable `button_type`
        dispatcher.utter_button_message(message, buttons)

        return []


# This is a simple example for a custom action which utters "Hello World!"

# class ActionHelloWorld(Action):
#
#     def name(self) -> Text:
#         return "action_hello_world"
#
#     def run(self, dispatcher: CollectingDispatcher,
#             tracker: Tracker,
#             domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
#
#         dispatcher.utter_message(text="Hello World!")
#
#         return []
Пример #4
0
def test_validate():
    # noinspection PyAbstractClass
    class CustomFormAction(FormAction):
        def name(self):
            return "some_form"

        @staticmethod
        def required_slots(_tracker):
            return ["some_slot", "some_other_slot"]

    form = CustomFormAction()

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {
            "entities": [
                {"entity": "some_slot", "value": "some_value"},
                {"entity": "some_other_slot", "value": "some_other_value"},
            ]
        },
        [],
        False,
        None,
        {},
        "action_listen",
    )

    events = form.validate(CollectingDispatcher(), tracker, {})
    # check that validation succeed
    assert events == [
        SlotSet("some_other_slot", "some_other_value"),
        SlotSet("some_slot", "some_value"),
    ] or events == [
        SlotSet("some_slot", "some_value"),
        SlotSet("some_other_slot", "some_other_value"),
    ]

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {"entities": [{"entity": "some_other_slot", "value": "some_other_value"}]},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    events = form.validate(CollectingDispatcher(), tracker, {})
    # check that validation succeed because other slot was extracted
    assert events == [SlotSet("some_other_slot", "some_other_value")]

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {"entities": []},
        [],
        False,
        None,
        {},
        "action_listen",
    )
    with pytest.raises(Exception) as execinfo:
        form.validate(CollectingDispatcher(), tracker, {})

    # check that validation failed gracefully
    assert execinfo.type == ActionExecutionRejection
    assert "Failed to extract slot some_slot with action some_form" in str(
        execinfo.value
    )
Пример #5
0
def test_validate_if_required():
    # noinspection PyAbstractClass
    class CustomFormAction(FormAction):
        def name(self):
            return "some_form"

        @staticmethod
        def required_slots(_tracker):
            return ["some_slot", "some_other_slot"]

    form = CustomFormAction()

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {
            "entities": [
                {"entity": "some_slot", "value": "some_value"},
                {"entity": "some_other_slot", "value": "some_other_value"},
            ]
        },
        [],
        False,
        None,
        {"name": "some_form", "validate": True, "rejected": False},
        "action_listen",
    )

    events = form._validate_if_required(CollectingDispatcher(), tracker, {})
    # check that validation was performed
    assert events == [
        SlotSet("some_other_slot", "some_other_value"),
        SlotSet("some_slot", "some_value"),
    ] or events == [
        SlotSet("some_slot", "some_value"),
        SlotSet("some_other_slot", "some_other_value"),
    ]

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {
            "entities": [
                {"entity": "some_slot", "value": "some_value"},
                {"entity": "some_other_slot", "value": "some_other_value"},
            ]
        },
        [],
        False,
        None,
        {"name": "some_form", "validate": False, "rejected": False},
        "action_listen",
    )

    events = form._validate_if_required(CollectingDispatcher(), tracker, {})
    # check that validation was skipped because 'validate': False
    assert events == []

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {
            "entities": [
                {"entity": "some_slot", "value": "some_value"},
                {"entity": "some_other_slot", "value": "some_other_value"},
            ]
        },
        [],
        False,
        None,
        {"name": "some_form", "validate": True, "rejected": False},
        "some_form",
    )

    events = form._validate_if_required(CollectingDispatcher(), tracker, {})
    # check that validation was skipped
    # because previous action is not action_listen
    assert events == []
Пример #6
0
    def submit(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> List[Dict]:
        #read pickle file
        df, _ = check_and_reload_data()
        if tracker.get_slot('time') is None:
            date_query = datetime.today().date()
            print(date_query)
            out_data = df[df['date'].dt.date == date_query]
            # print('DATAFRAME')
            # print(out_data.head())
            if len(out_data) > 0:
                if tracker.get_slot('metric') == 'confirmed':
                    dispatcher.utter_message(
                        "Total confirmed cases are {} out of which {} are added today"
                        .format(
                            list(out_data['totalconfirmed'])[0],
                            list(out_data['dailyconfirmed'])[0]))
                elif tracker.get_slot('metric') == 'recovered':
                    dispatcher.utter_message(
                        "Total recovered cases are {} out of which {} are added today"
                        .format(
                            list(out_data['totalrecovered'])[0],
                            list(out_data['dailyrecovered'])[0]))
                elif tracker.get_slot("metric") == "deceased":
                    dispatcher.utter_message(
                        "Total deceased cases are {} out of which {} are added today"
                        .format(
                            list(out_data['totaldeceased'])[0],
                            list(out_data['dailydeceased'])[0]))
                else:
                    dispatcher.utter_message(
                        "Total active cases are {} out of which {} are added today"
                        .format(
                            list(out_data['totalactive'])[0],
                            list(out_data['dailyactive'])[0]))
            else:
                dispatcher.utter_message(
                    "I am having trouble getting you the data. I am still in learning phase."
                )
            return [AllSlotsReset()]
        else:
            all_entities = tracker.latest_message.get("entities", [])
            time_entity = [
                e for e in all_entities if e.get("entity") == "time"
            ]
            # print(time_entity)
            additional_info = time_entity[0]['additional_info']
            print(additional_info)
            # dispatcher.utter_message("Additional Info")
            if additional_info['type'] == 'interval':
                from_time = parser.isoparse(additional_info['from']['value'])
                to_time = parser.isoparse(additional_info['to']['value'])
                grain = additional_info['from']['grain']
                if grain == "day":
                    out_data = df[(df['date'].dt.date > from_time.date())
                                  & (df['date'].dt.date <= to_time.date())][
                                      'daily' +
                                      tracker.get_slot('metric')].sum()
                elif grain == 'month':
                    out_data = df[(df['date'].dt.month > from_time.month)
                                  & (df['date'].dt.month <= to_time.month)][
                                      'daily' +
                                      tracker.get_slot('metric')].sum()
                elif grain == 'week':
                    out_data = df[
                        (df['date'].dt.week > int(from_time.strftime('%V')))
                        & (df['date'].dt.week <= int(to_time.strftime('%V')))][
                            'daily' + tracker.get_slot('metric')].sum()
                elif grain == 'year':
                    out_data = df[(df['date'].dt.year > from_time.year)
                                  & (df['date'].dt.year <= to_time.year)][
                                      'daily' +
                                      tracker.get_slot('metric')].sum()
                else:
                    dispatcher.utter_message(
                        "I have date wise data only. I wish I could have second wise feed :("
                    )
                    return [AllSlotsReset()]
                if tracker.get_slot('metric') == 'confirmed':

                    dispatcher.utter_message(
                        "In {} total confirmed cases are {}".format(
                            tracker.get_slot("time"), out_data))
                elif tracker.get_slot('metric') == 'recovered':
                    dispatcher.utter_message(
                        "In {} total recovered cases are {}".format(
                            tracker.get_slot("time"), out_data))
                elif tracker.get_slot("metric") == "deceased":
                    dispatcher.utter_message(
                        "In {} total deceased cases are {}".format(
                            tracker.get_slot("time"), out_data))
                else:
                    dispatcher.utter_message(
                        "In {} total active cases are {}".format(
                            tracker.get_slot("time"), out_data))
            else:
                from_time = parser.isoparse(additional_info['value'])
                # from_time = parser.isoparse(additional_info['value'])
                # to_time =  parser.isoparse(additional_info['to']['value'])
                if additional_info['grain'] == 'day':
                    out_data = df[df['date'].dt.date == from_time.date()][
                        'daily' + tracker.get_slot('metric')].sum()
                elif additional_info['grain'] == 'month':
                    out_data = df[df['date'].dt.month == from_time.month][
                        'daily' + tracker.get_slot('metric')].sum()
                elif additional_info['grain'] == 'week':
                    out_data = df[df['date'].dt.week == int(
                        from_time.strftime('%V'))][
                            'daily' + tracker.get_slot('metric')].sum()
                elif additional_info['grain'] == 'year':
                    out_data = df[df['date'].dt.year == from_time.year][
                        'daily' + tracker.get_slot('metric')].sum()
                else:
                    dispatcher.utter_message(
                        "I wish I could have that granular data :(")
                    return [AllSlotsReset()]
                time_print = format_time_by_grain(from_time,
                                                  additional_info['grain'])
                if tracker.get_slot('metric') == 'confirmed':

                    dispatcher.utter_message(
                        "{}: total confirmed cases are {}".format(
                            time_print, out_data))
                elif tracker.get_slot('metric') == 'recovered':
                    dispatcher.utter_message(
                        "{}:total recovered cases are {}".format(
                            time_print, out_data))
                elif tracker.get_slot("metric") == "deceased":
                    dispatcher.utter_message(
                        "{}: total deceased cases are {}".format(
                            time_print, out_data))
                else:
                    dispatcher.utter_message(
                        "{}: total active cases are {}".format(
                            time_print, out_data))
            return [AllSlotsReset()]
        # print(tracker.slots)
        # print(tracker.latest_message)
        # dispatcher.utter_message("Here is your number")
        dispatcher.utter_message(
            "Overall Numbers till now. Total:{}, Active:{}, Deaths: {}, Recovered: {}:"
            .format(df['dailyconfirmed'].sum(), df['dailyactive'].sum(),
                    df['dailydeceased'].sum(), df['dailyrecovered'].sum()))
        return []
Пример #7
0
def test_extract_trigger_slots():
    """Test extraction of a slot value from trigger intent
    """
    # noinspection PyAbstractClass
    class CustomFormAction(FormAction):
        def name(self):
            return "some_form"

        @staticmethod
        def required_slots(_tracker):
            return ["some_slot"]

        def slot_mappings(self):
            return {
                "some_slot": self.from_trigger_intent(
                    intent="trigger_intent", value="some_value"
                )
            }

    form = CustomFormAction()

    tracker = Tracker(
        "default",
        {},
        {"intent": {"name": "trigger_intent", "confidence": 1.0}},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was extracted for correct intent
    assert slot_values == {"some_slot": "some_value"}

    tracker = Tracker(
        "default",
        {},
        {"intent": {"name": "other_intent", "confidence": 1.0}},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was not extracted for incorrect intent
    assert slot_values == {}

    # tracker with active form
    tracker = Tracker(
        "default",
        {},
        {"intent": {"name": "trigger_intent", "confidence": 1.0}},
        [],
        False,
        None,
        {"name": "some_form", "validate": True, "rejected": False},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was not extracted for correct intent
    assert slot_values == {}
Пример #8
0
    def required_slots(tracker: Tracker) -> List[Text]:
        last(tracker)
        latest_entities = tracker.latest_message['entities']
        if latest_entities:
            for entity in latest_entities:

                if entity['entity'] == 'qualification':

                    # print('fees q,c latest_message')
                    if (tracker.get_slot('course')):
                        ACode('qc')
                        return ["qualification", "course"]
                    elif (tracker.get_slot('field')):
                        ACode('qf')
                        return ["qualification", "field"]
                    else:
                        ACode('qf')
                        return ["qualification", "field"]
                elif entity['entity'] == 'degree':

                    #print('fees degree latest_message')
                    if entity['value'] == 'msc' or entity['value'] == 'bsc':
                        #print('with sc')
                        ACode('dc')
                        return ['degree', 'course']

                    else:
                        ACode('d')
                        return ["degree"]
                elif entity['entity'] == 'field':
                    ACode('qf')
                    # print('fees q,c latest_message')

                    return ["qualification", "field"]

                elif entity['entity'] == 'course':
                    ACode('qc')
                    # print('fees q,c latest_message')

                    return ["qualification", "course"]

                elif all_entites2:

                    if all_entites2[-1] == "degree":
                        #print("fees with degree called last entity")
                        if tracker.get_slot(
                                all_entites2[-1]) == 'bsc' or tracker.get_slot(
                                    all_entites2[-1]) == 'msc':
                            ACode('dc')
                            return ['degree', 'course']

                        else:
                            ACode('d')
                            return ["degree"]
                    elif (all_entites2[-1] == "qualification"):
                        if (tracker.get_slot('course')):
                            ACode('qc')
                            return ["qualification", "course"]
                        elif (tracker.get_slot('field')):
                            ACode('qf')
                            return ["qualification", "field"]
                        else:
                            ACode('qf')
                            return ["qualification", "field"]
                    elif (all_entites2[-1] == "field"):
                        ACode('qf')
                        #print("fees with q,c called")
                        return ["qualification", "field"]
                    elif (all_entites2[-1] == "course"):
                        ACode('qc')
                        #print("fees with q,c called")
                        return ["qualification", "course"]

                else:
                    ACode('d')
                    #print("fees with q,c called")
                    return ["degree"]
        elif all_entites2:
            if all_entites2[-1] == "degree":
                #print("fees with degree called last entity")
                if tracker.get_slot(
                        all_entites2[-1]) == 'bsc' or tracker.get_slot(
                            all_entites2[-1]) == 'msc':
                    ACode('dc')
                    return ['degree', 'course']
                else:
                    ACode('d')
                    return ["degree"]
            elif (all_entites2[-1] == "course"):
                ACode('qc')
                #print("fees with q,c called")
                return ["qualification", "course"]
            elif (all_entites2[-1] == "field"):
                ACode('qf')
                return ["qualification", "field"]
            elif (all_entites2[-1] == "qualification"):
                if (tracker.get_slot('course')):
                    ACode('qc')
                    return ["qualification", "course"]
                elif (tracker.get_slot('field')):
                    ACode('qf')
                    return ["qualification", "field"]
                else:
                    ACode('qf')
                    return ["qualification", "field"]
        else:
            ACode('d')
            #print("fees with q,c called")
            return ["degree"]
Пример #9
0
    def submit(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> List[Dict]:
        if (AdmissionCodes[-1] == 'qf'):
            field = tracker.get_slot('field')
            qualification = tracker.get_slot('qualification')
            if (field == 'pharmacy' and qualification == 'undergraduate'):
                dispatcher.utter_template('utter_adm_pharmacy_undergraduate',
                                          tracker)
            elif ((field == 'physio' and qualification == 'undergraduate') or
                  (field == 'nursing' and qualification == 'undergraduate')):
                dispatcher.utter_template(
                    'utter_adm_nursing/physio_undergraduate', tracker)
            elif (field == 'engineering' and qualification == 'undergraduate'):
                dispatcher.utter_template(
                    'utter_adm_engineering_undergraduate', tracker)
            elif (field == 'management' and qualification == 'undergraduate'):
                dispatcher.utter_template('utter_adm_bba_undergraduate',
                                          tracker)
            elif (field == 'computer applications'
                  and qualification == 'undergraduate'):
                dispatcher.utter_template(
                    'utter_adm_computeraplication_undergraduate', tracker)
            else:
                dispatcher.utter_template('utter_other_field', tracker)

        elif (AdmissionCodes[-1] == 'qc'):
            course = tracker.get_slot('course')
            qualification = tracker.get_slot('qualification')
            if ((course == "ce" or course == "it" or course == "cs" or course
                 == 'me' or course == 'ci' or course == 'ee' or course == 'ec')
                    and qualification == 'undergraduate'):
                dispatcher.utter_template(
                    'utter_adm_engineering_undergraduate', tracker)
            elif (course == 'GNM' and qualification == 'undergraduate'):
                dispatcher.utter_template(
                    'utter_adm_nursing/physio_undergraduate', tracker)
            else:
                dispatcher.utter_template('utter_other_field', tracker)

        elif (AdmissionCodes[-1] == 'dc'):
            course = tracker.get_slot('course')
            degree = tracker.get_slot('degree')
            if (degree == 'bsc' and course == 'it'):
                dispatcher.utter_template('utter_adm_bscit_undergraduate',
                                          tracker)
            else:
                dispatcher.utter_template('utter_other_field', tracker)

        elif (AdmissionCodes[-1] == 'd'):
            degree = tracker.get_slot('degree')
            if (degree == 'bpharm'):
                dispatcher.utter_template('utter_adm_pharmacy_undergraduate',
                                          tracker)
            elif (degree == 'btech'):
                dispatcher.utter_template(
                    'utter_adm_engineering_undergraduate', tracker)
            elif (degree == 'bpt'):
                dispatcher.utter_template(
                    'utter_adm_nursing/physio_undergraduate', tracker)
            elif (degree == 'bba'):
                dispatcher.utter_template('utter_adm_bba_undergraduate',
                                          tracker)
            elif (degree == 'bca'):
                dispatcher.utter_template(
                    'utter_adm_computeraplication_undergraduate', tracker)
            else:
                dispatcher.utter_template('utter_other_field', tracker)
        return []
Пример #10
0
 def submit(
     self,
     dispatcher: CollectingDispatcher,
     tracker: Tracker,
     domain: Dict[Text, Any],
 ) -> List[Dict]:
     print("programCode: ", programCodes[-1])
     if programCodes[-1] == 'qf':
         if tracker.get_slot('field') == "commerce":
             m = ""
             m = available_programs_qf(coursesRoot,
                                       tracker.get_slot('qualification'),
                                       "computer applications")
             m = m + available_programs_qf(
                 coursesRoot, tracker.get_slot('qualification'),
                 "management")
             dispatcher.utter_message(m)
         elif tracker.get_slot('field') == "medical":
             m = ""
             m = available_programs_qf(coursesRoot,
                                       tracker.get_slot('qualification'),
                                       "nursing")
             m = m + available_programs_qf(
                 coursesRoot, tracker.get_slot('qualification'), "physio")
             m = m + available_programs_qf(
                 coursesRoot, tracker.get_slot('qualification'), "pharmacy")
             m = m + available_programs_qf(
                 coursesRoot, tracker.get_slot('qualification'),
                 "paramedical sciences")
             dispatcher.utter_message(m)
         else:
             m = ""
             m = available_programs_qf(coursesRoot,
                                       tracker.get_slot('qualification'),
                                       tracker.get_slot('field'))
             dispatcher.utter_message(m)
     elif programCodes[-1] == 'd':
         m = ""
         m = available_programs_d(coursesRoot, tracker.get_slot('degree'))
         dispatcher.utter_message(m)
     return []
Пример #11
0
    def required_slots(tracker: Tracker) -> List[Text]:
        last(tracker)
        latest_entities = tracker.latest_message['entities']

        if latest_entities:
            for entity in latest_entities:
                if entity['entity'] == "field":
                    f = tracker.get_slot('field')
                    if f == "engineering":
                        lCode('f')
                        return ['course', 'field']

                    elif f == "pharmacy" or f == "physio":
                        lCode('f')
                        return ['field']

                    else:
                        if all_entites3:
                            if all_entites3[-1] == "field":
                                f = tracker.get_slot('field')
                                if f == "engineering":
                                    lCode('f')
                                    return ['course', 'field']
                                elif f == "pharmacy" or f == "physio":
                                    lCode('f')
                                    return ['field']
                                else:
                                    lCode('f')
                                    return ['field']
                            elif all_entites3[-1] == "course":
                                lCode('c')
                                return ['course']
                            else:
                                lCode('f')
                                return ['field']

                elif entity['entity'] == "course":
                    lCode('c')
                    return ['course']

                elif all_entites3:
                    if all_entites3[-1] == "field":
                        f = tracker.get_slot('field')
                        if f == "engineering":
                            lCode('f')
                            return ['course', 'field']
                        elif f == "pharmacy" or f == "physio":
                            lCode('f')
                            return ['field']
                        else:
                            lCode('f')
                            return ['field']
                    elif all_entites3[-1] == "course":
                        lCode('c')
                        return ['course']
                    else:
                        lCode('f')
                        return ['field']
                else:
                    lCode('f')
                    return ['field']
        elif all_entites3:
            if all_entites3[-1] == "field":
                f = tracker.get_slot('field')
                if f == "engineering":
                    lCode('f')
                    return ['course', 'field']
                elif f == "pharmacy" or f == "physio":
                    lCode('f')
                    return ['field']
                else:
                    lCode('f')
                    return ['field']
            elif all_entites3[-1] == "course":
                lCode('c')
                return ['course']
            else:
                lCode('f')
                return ['field']
        else:
            lCode('f')
            return ['field']
Пример #12
0
 def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
    slot_dict = tracker.current_slot_values()
    for slot_entry in slot_dict:
       dispatcher.utter_message(str(slot_entry))
       dispatcher.utter_message(str(slot_dict[slot_entry]))
    return []
Пример #13
0
    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

            # user_name = tracker.get_slot("user_name")
            crime_date = tracker.get_slot("crime_date")
            crime_time = tracker.get_slot("crime_time")
            # report_date = tracker.get_slot("report_date")
            # report_time = tracker.get_slot("report_time")
            crime_location = tracker.get_slot("crime_location")
            suspected_people = tracker.get_slot("suspected_people")
            sname = tracker.get_slot("sname")
            cname = tracker.get_slot("cname")
            crime_type = tracker.get_slot("crime_type")
            stolen_things = tracker.get_slot("stolen_things")
            stolen_amount = tracker.get_slot("stolen_amount")
            injury_occured = tracker.get_slot("injury_occured")
            people_with = tracker.get_slot("people_with")
            vehicle_type = tracker.get_slot("vehicle_type")
            number_people_died = tracker.get_slot("number_people_died")
            person_location = tracker.get_slot("person_location")
            kidnapper_call = tracker.get_slot("kidnapper_call")
            if kidnapper_call == None:
                kidnapper_call = "No contact"            
            call_details = tracker.get_slot("call_details")
            robbery_details = tracker.get_slot("robbery_details")
            accident_details = tracker.get_slot("accident_details")
            

            """
            msg = "Data [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] is to be sent to the database...!!!".format(
                     crime_date, crime_time, crime_location, suspected_people, stolen_things
                    , stolen_amount, sname, cname, crime_type, injury_occured, people_with, vehicle_type
                    , number_people_died, person_location, kidnapper_call, call_details, robbery_details, accident_details)
"""
            msg = "Required data has been captured..."
            dispatcher.utter_message(text=msg)

            return []
Пример #14
0
 def required_slots(tracker: Tracker) -> List[Text]:
     if tracker.get_slot("object"):
         return []
     else:
         return ["direction"]
Пример #15
0
 def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
         domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
     current_question = tracker.get_slot('question_id')
     dispatcher.utter_message(text=self.__choose_answer(current_question))
Пример #16
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        search = Talk.search()
        time_slot = tracker.get_slot('time')
        day_slot = tracker.get_slot('day')

        if time_slot and day_slot:
            if day_slot.lower() == 'hoy' or day_slot.lower() == 'mañana':
                weekday = datetime.today().weekday()
                if day_slot.lower() == 'mañana':
                    weekday += 1
                if weekday == 5:
                    day = 'Sabado'
                elif weekday == '6':
                    day = 'Domingo'
                else:
                    dispatcher.utter_message(
                        "Solo tengo registradas charlas el Sábado y Domingo\n")
                    return []
            else:
                day = unidecode.unidecode(day_slot).lower()
                if day != 'sabado' and day != 'domingo':
                    dispatcher.utter_message(
                        "Solo tengo registradas charlas el Sábado y Domingo\n")
                    return []

            if ':' in time_slot:
                time_parts = time_slot.split(':')
                hour = int(time_parts[0])
                minute = int(time_parts[1])
            else:
                hour = int(time_slot)
                minute = 0

            if day == 'sabado':
                date = datetime(year=2019,
                                month=10,
                                day=5,
                                hour=hour,
                                minute=minute)
            else:
                date = datetime(year=2019,
                                month=10,
                                day=6,
                                hour=hour,
                                minute=minute)

            query = search.sort('start').\
                query('term', day=day).\
                query('range', start={'gte': date})
            if query.count() == 0:
                dispatcher.utter_message(
                    "No he encontrado ninguna charla el dia {} a las {}\n".
                    format(day, time_slot))
            else:
                message = "He encontrado las siguientes charlas el dia {} a las {}:\n".format(
                    day, time_slot)
                message += range_query_to_message(query)
                dispatcher.utter_message(message)
                return [SlotSet('time', None), SlotSet('day', None)]

        elif time_slot and not day_slot:
            dispatcher.utter_message("¿Qué día, Sábado o Domingo?\n")
        elif day_slot and not time_slot:
            dispatcher.utter_message("¿A qué hora?\n")
        else:
            dispatcher.utter_message(
                "He entendido que buscas una charla, pero no he encontrado día ni hora\n"
            )

        return []
Пример #17
0
 def __user_needs_evaluation(self, tracker: Tracker) -> bool:
     return tracker.get_slot('score_questions') > CUTOFF_POINT
Пример #18
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        search = Talk.search()
        talk_slot = tracker.get_slot('talk')
        if talk_slot:
            query = search.sort('start').query('match', title=talk_slot)
            if query.count() > 0:
                talks = []
                for t in query:
                    talks.append(t.title + " el " + t.day + " a las " +
                                 t.start.strftime('%H:%M') + " en " + t.place)
                dispatcher.utter_message(
                    "Las charlas que he encontrado son:\n{}".format(
                        '\n'.join(talks)))
            else:
                dispatcher.utter_message(
                    "No he encontrado ninguna charla sobre ese tema. ¿Puedes reformular la pregunta?"
                )
            return [SlotSet('talk', None)]

        speaker = tracker.get_slot('speaker')
        if speaker:
            query = search.sort('start').query('match', speakers=speaker)
            if query.count() > 0:
                # TODO Replace this ugly code by an Elastic Aggregation. Make speakers field a keyword as well
                talksBySpeaker = defaultdict(list)
                for t in query:
                    t.speakers.sort()
                    for s in t.speakers:
                        if speaker.lower() in s.lower():
                            talksBySpeaker[s].append(t)
                if len(talksBySpeaker) == 1:
                    talks = []
                    for t in list(talksBySpeaker.values())[0]:
                        talks.append(t.title + " el " + t.day + " a las " +
                                     t.start.strftime('%H:%M') + " en " +
                                     t.place)
                    dispatcher.utter_message(
                        "Las charlas que he encontrado de {} son:\n{}".format(
                            speaker, '\n'.join(talks)))
                else:
                    found_speakers = talksBySpeaker.keys()
                    message = "¿A qué '{}' te refieres?. He encontrado {}:\n{}".\
                        format(speaker, len(talksBySpeaker), '\n'.join(found_speakers))
                    dispatcher.utter_message(message)
                    return [SlotSet("found_speakers", list(found_speakers))]
            else:
                query = search.sort('start').query('match', title=speaker)
                if query.count() == 0:
                    dispatcher.utter_message(
                        "No he encontrado ninguna charla de {}".format(
                            speaker))
                else:
                    talks = []
                    for t in query:
                        talks.append(t.title + " el " + t.day + " a las " +
                                     t.start.strftime('%H:%M') + " en " +
                                     t.place)
                    dispatcher.utter_message(
                        "Las charlas que he encontrado de {} son:\n{}".format(
                            speaker, '\n'.join(talks)))
                return [SlotSet("speaker", None)]
        else:
            tokens = tokenize(tracker.latest_message.get('text'))
            candidates = search_talks_database(tokens)
            if len(candidates) > 0:
                shoulds = []
                for candidate in candidates:
                    shoulds.append(Q('match_phrase', title=candidate))
                q = Q('bool', should=shoulds)
                query = search.sort('start').query(q)
                if query.count() == 0:
                    dispatcher.utter_message(
                        "No he podido encontrar ninguna charla, lo siento".
                        format(speaker))
                else:
                    talks = []
                    for t in query:
                        talks.append(t.title + " el " + t.day + " a las " +
                                     t.start.strftime('%H:%M') + " en " +
                                     t.place)
                    dispatcher.utter_message(
                        "Las posibles charlas relevantes que he encontrado son:\n{}"
                        .format('\n'.join(talks)))
            else:
                dispatcher.utter_message(
                    "No he encontrado ninguna charla. ¿Puedes reformular la pregunta?"
                )

        return []
Пример #19
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        job_workplaces = tracker.get_slot("1_activity") + tracker.get_slot(
            "2_outside") + tracker.get_slot("3_workingtime") + (
                "4_environment") + ("5_company")
        job_softskills = tracker.get_slot("6_skills") + tracker.get_slot(
            "7_personally") + tracker.get_slot(
                "8_problems_dealing") + tracker.get_slot("9_public")

        # List of strings
        # Append a list as new line to an old csv file

        dispatcher.utter_message(
            template="utter_slots_values",
            activity=tracker.get_slot("1_activity"),
            outside=tracker.get_slot("2_outside"),
            workingtime=tracker.get_slot("3_workingtime"),
            environment=tracker.get_slot("4_environment"),
            company=tracker.get_slot("5_company"),
            skills=tracker.get_slot("6_skills"),
            personally=tracker.get_slot("7_personally"),
            problems_dealing=tracker.get_slot("8_problems_dealing"),
            public=tracker.get_slot("9_public"),
            min_salary=tracker.get_slot("10_min_salary"),
            wish_salary=tracker.get_slot("11_wish_salary"))
        return []
Пример #20
0
 def submit(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict]:
     dispatcher.utter_message(text="Parameters Submitted")
     self.error_query = tracker.get_slot("error_action")
     print(f"slot value: {self.error_query}")
     return []
Пример #21
0
def test_extract_other_slots_no_intent():
    """Test extraction of other not requested slots values
        from entities with the same names
    """
    # noinspection PyAbstractClass
    class CustomFormAction(FormAction):
        def name(self):
            return "some_form"

        @staticmethod
        def required_slots(_tracker):
            return ["some_slot", "some_other_slot"]

    form = CustomFormAction()

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {"entities": [{"entity": "some_slot", "value": "some_value"}]},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was not extracted for requested slot
    assert slot_values == {}

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {"entities": [{"entity": "some_other_slot", "value": "some_other_value"}]},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was extracted for non requested slot
    assert slot_values == {"some_other_slot": "some_other_value"}

    tracker = Tracker(
        "default",
        {"requested_slot": "some_slot"},
        {
            "entities": [
                {"entity": "some_slot", "value": "some_value"},
                {"entity": "some_other_slot", "value": "some_other_value"},
            ]
        },
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.extract_other_slots(CollectingDispatcher(), tracker, {})
    # check that the value was extracted only for non requested slot
    assert slot_values == {"some_other_slot": "some_other_value"}
    def submit(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> List[Dict]:
        """Define what the form has to do
            after all required slots are filled"""
        age = float(tracker.get_slot('AGE'))
        print(age)
        bp = float(tracker.get_slot('BloodPressure'))
        print(bp)
        al = float(tracker.get_slot('Albumin'))
        print(al)
        pcc = float(tracker.get_slot('PusCellClumps'))
        print(pcc)
        bgr = float(tracker.get_slot('BloodGlucoseRandom'))
        print(bgr)
        bu = float(tracker.get_slot('BloodUrea'))
        print(bu)
        sod = float(tracker.get_slot('Sodium'))
        print(sod)
        pot = float(tracker.get_slot('Potassium'))
        print(pot)
        hemo = float(tracker.get_slot('Hemoglobin'))
        print(hemo)
        rbcc = float(tracker.get_slot('RedBloodCellCount'))
        print(rbcc)
        dm = float(tracker.get_slot('DiabetesMellitus'))
        print(dm)
        appet = float(tracker.get_slot('Appetite'))
        print(appet)

        # final_features = pd.DataFrame(
        #     {'age': [age / 80], 'bp': [bp / 10], 'al': [al / 5], 'pcc': [pcc],
        #      'bgr': [bgr / 146], 'bu': [bu / 418], 'sod': [sod / 164], 'pot': [pot / 130.1],
        #      'hemo': [hemo / 21.7], 'rbcc': [rbcc / 12.8], 'dm': [dm], 'appet': [appet]})
        # print('After '+final_features)
        # model = pickle.load(open('model.pkl', 'rb'))
        # print('after model')
        # prediction = model.predict(final_features)
        # print('after prediction')

        request = {
            'age': age,
            'bp': bp,
            'al': al,
            'pcc': pcc,
            'bgr': bgr,
            'bu': bu,
            'sod': sod,
            'pot': pot,
            'hemo': hemo,
            'rbcc': rbcc,
            'dm': dm,
            'appet': appet
        }

        register_url = 'http://127.0.0.1:5000/' + "predict"

        r = requests.get(register_url, params=request)
        print(r.content)
        pred = r.content.decode("utf-8")
        print("after string :" + pred)
        pred = float(pred)
        print('after float:' + str(pred))
        print(pred)
        print(type(pred))
        # print('after pred :'+r.content)
        # pred=int(r.content)

        if pred > 0.75:
            print('in if loop if part')
            result_prediction = 'Don\'t worry you have ' + str(
                (1 - pred) * 100
            ) + '% precentage to have chronicle kidney disease. We have 99.06% confident for say that !! '
            print('in if loop if part')
        elif (pred > 0.5):
            print('in if loop else part')
            result_prediction = 'You are in some denger zone. You have ' + str(
                (1 - pred) * 100
            ) + '% percentae to have chronicle kidney disease. We have 99.06% confident for say that !! Care full'
            print('in if loop else part')
        else:
            result_prediction = 'You are in very danger zone.You have ' + str(
                (1 - pred) * 100
            ) + '% percentae to have chronicle kidney disease. We have 99.06% confident for say that !! Meet your doctor as soon as possible'

        # utter submit template
        print(result_prediction)
        dispatcher.utter_message(responses="utter_submit",
                                 text=result_prediction.format())
        return [SlotSet("result", result_prediction)]
Пример #23
0
def test_validate_trigger_slots():
    """Test validation results of from_trigger_intent slot mappings
    """

    # noinspection PyAbstractClass
    class CustomFormAction(FormAction):
        def name(self):
            return "some_form"

        @staticmethod
        def required_slots(_tracker):
            return ["some_slot"]

        def slot_mappings(self):
            return {
                "some_slot": self.from_trigger_intent(
                    intent="trigger_intent", value="some_value"
                )
            }

    form = CustomFormAction()

    tracker = Tracker(
        "default",
        {},
        {"intent": {"name": "trigger_intent", "confidence": 1.0}},
        [],
        False,
        None,
        {},
        "action_listen",
    )

    slot_values = form.validate(CollectingDispatcher(), tracker, {})

    # check that the value was extracted on form activation
    assert slot_values == [
        {"event": "slot", "timestamp": None, "name": "some_slot", "value": "some_value"}
    ]

    tracker = Tracker(
        "default",
        {},
        {"intent": {"name": "trigger_intent", "confidence": 1.0}},
        [],
        False,
        None,
        {
            "name": "some_form",
            "validate": True,
            "rejected": False,
            "trigger_message": {
                "intent": {"name": "trigger_intent", "confidence": 1.0}
            },
        },
        "action_listen",
    )

    slot_values = form.validate(CollectingDispatcher(), tracker, {})
    # check that the value was not extracted after form activation
    assert slot_values == []

    tracker = Tracker(
        "default",
        {"requested_slot": "some_other_slot"},
        {
            "intent": {"name": "some_other_intent", "confidence": 1.0},
            "entities": [{"entity": "some_other_slot", "value": "some_other_value"}],
        },
        [],
        False,
        None,
        {
            "name": "some_form",
            "validate": True,
            "rejected": False,
            "trigger_message": {
                "intent": {"name": "trigger_intent", "confidence": 1.0}
            },
        },
        "action_listen",
    )

    slot_values = form.validate(CollectingDispatcher(), tracker, {})

    # check that validation failed gracefully
    assert slot_values == [
        {
            "event": "slot",
            "timestamp": None,
            "name": "some_other_slot",
            "value": "some_other_value",
        }
    ]
Пример #24
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        logger.debug("---- [ActionCheckMuscle] ----")

        # Get slot value
        body = tracker.get_slot('body')
        muscle = tracker.get_slot('muscle')
        intent = tracker.latest_message['intent'].get('name')

        logger.debug("b:{}, m:{}".format(body, muscle))

        try:
            # Need muscle suggestion
            if body != None and (intent == 'negative'
                                 or tracker.get_slot('deny') != None
                                 or tracker.get_slot('suggest') != None):
                rnd = random.choice(list(bodyMap[body.lower()]))
                dispatcher.utter_message(template='utter_random_muscle',
                                         variable=rnd)
                dispatcher.utter_message(template='utter_ask_facility')
                return [
                    SlotSet('muscle', muscleMap[rnd][0]),
                    SlotSet('deny', None),
                    SlotSet('suggest', None),
                    FollowupAction('action_listen')
                ]
            # Need to know what muscles in body.
            elif intent == 'query':
                if muscle != None:
                    return [FollowupAction('action_check_equipment')]
                dispatcher.utter_template('utter_query_muscle',
                                          tracker,
                                          body=body)
                dispatcher.utter_message(" - {}".format(bodyMap[body.lower()]))
                return []
            # Ask muscle directly.
            elif body == None and any(
                    tracker.get_latest_entity_values('muscle')):
                print(tracker.latest_message)
                body = tracker.latest_message['entities'][0].get('role')
                dispatcher.utter_message(template='utter_ask_facility')
                return [
                    SlotSet('body', body),
                    SlotSet('deny', None),
                    SlotSet('suggest', None)
                ]

            # Vaildate muscle
            if any(
                    tracker.get_latest_entity_values(
                        'muscle', entity_role=str(body).lower())):
                dispatcher.utter_message(template='utter_ask_facility')
                return [SlotSet('deny', None), SlotSet('suggest', None)]
            # Vaildate muscle fail
            dispatcher.utter_template('utter_wrong_muscle', tracker)
            return [SlotSet('muscle', None)]

        except:
            dispatcher.utter_template('utter_system_wrong')
            return [AllSlotsReset(), FollowupAction('action_restart')]
Пример #25
0
def _has_211(tracker: Tracker) -> bool:
    province = tracker.get_slot(PROVINCE_SLOT)
    return province in PROVINCES_WITH_211
Пример #26
0
 def get_carry_over_slots(self, tracker: Tracker) -> List[Dict[Text, Any]]:
     actions = super().get_carry_over_slots(tracker)
     carry_over_slots = ("first_name", "last_name", "destination", "reason")
     for slot in carry_over_slots:
         actions.append(SlotSet(slot, tracker.get_slot(slot)))
     return actions
Пример #27
0
    def validate(self, dispatcher: CollectingDispatcher, tracker: Tracker,
                 domain: Dict[Text, Any]) -> List[Dict]:
        #def validate(self, dispatcher, tracker, domain):
        # type: (CollectingDispatcher, Tracker, Dict[Text, Any]) -> List[Dict]
        """"Validate extracted requested slot else raise an error"""
        slot_values = self.extract_other_slots(dispatcher, tracker, domain)

        # extract requested slot
        slot_to_fill = tracker.get_slot(REQUESTED_SLOT)
        if slot_to_fill:
            slot_values.update(
                self.extract_requested_slot(dispatcher, tracker, domain))
            if not slot_values:
                # reject form action execution
                # if some slot was requested but nothing was extracted
                # it will allow other policies to predict another action
                raise ActionExecutionRejection(
                    self.name(), "Failed to validate slot {0} "
                    "with action {1}"
                    "".format(slot_to_fill, self.name()))

        for slot, value in slot_values.items():

            if slot == 'dept':
                if value.lower() not in self.dept_db():
                    dispatcher.utter_template('utter_incorrect_dept', tracker)
                    slot_values[slot] = None
                    # validation failed, set this slot to None
            elif slot == 'time':
                dept = tracker.get_slot('dept')
                if value[11:19] == "00:00:00":
                    dispatcher.utter_template("utter_incorrect_time", tracker)
                    slot_values[slot] = None
                else:
                    flag = 0
                    file = pd.read_csv('DocAvail.csv')
                    date = value[0:10]
                    time_slot = value[11:19]
                    date_time = datetime.datetime.strptime(date, "%Y-%m-%d")
                    weekday = datetime.datetime.strftime(date_time, "%A")
                    Dept = file[file['Department'].str.lower() ==
                                dept].reset_index().drop('index', axis=1)[[
                                    'Physician name', weekday
                                ]]
                    print(Dept)
                    for i in range(len(Dept)):
                        avail_time = Dept.ix[i, weekday].split('-')
                        low = int(avail_time[0].split(':')[0])
                        high = int(avail_time[1].split(':')[0])
                        time_slot_int = int(value[11:19].split(':')[0])
                        if time_slot_int > low and time_slot_int < high:
                            flag = 1
                            break
                    if flag == 1:
                        pass
                    else:
                        dispatcher.utter_template("utter_incorrect_time",
                                                  tracker)
                        slot_values[slot] = None

        return [SlotSet(slot, value) for slot, value in slot_values.items()]
Пример #28
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        """
        Trả về generic template san pham cuoi va ask them vao gio hang/thanh toan

        :param dispatcher:
        :param tracker:
        :param domain:
        :return:
        """
        # debug('\n_________act_shoe_new_shoe_________')

        print('_____' + self.name())

        prefix_name = tracker.get_slot(Entities.prefix_name)
        customer_name = tracker.get_slot(Entities.customer_name)
        messenger_id = tracker.current_state()["sender_id"]
        bot_position = tracker.get_slot(Entities.bot_position)
        shoe_id = tracker.get_slot(Entities.shoe_id)
        shoe_model = tracker.get_slot(Entities.shoe_model)
        shoe_size = tracker.get_slot(Entities.shoe_size)
        color_id = tracker.get_slot(Entities.color_id)
        color_name = tracker.get_slot(Entities.shoe_color)
        coupon_id = tracker.get_slot(Entities.coupon_id)
        coupon_code = tracker.get_slot(Entities.coupon_code)

        # get_final_shoe(shoe_id int, shoe_size int, color_id int)
        # query = 'call get_final_shoe({}, {}, {})'.format(shoe_id, shoe_size, color_id)
        query = f'''
            select 
                mainapp_shoe.id as shoe_id,
                mainapp_shoe.shoeName,
                mainapp_shoe.shoeModel,
                mainapp_shoe.shoeThumbnail,
                mainapp_shoe.image_static,
                mainapp_detailshoe.id as detailShoe_id,
                mainapp_detailshoe.newPrice,
                mainapp_detailshoe.quantityAvailable,
                mainapp_detailshoe.size,
                mainapp_color.id as color_id,
                mainapp_color.colorName
            from mainapp_shoe 
                inner join mainapp_detailshoe
                    on (mainapp_shoe.id = mainapp_detailshoe.shoe_id)
                inner join mainapp_color
                    on (mainapp_detailshoe.color_id = mainapp_color.id)
            where
                mainapp_shoe.id = {shoe_id} and
                mainapp_detailshoe.size = {shoe_size} and
                mainapp_color.id = {color_id};
        '''

        shoes, detail_shoes, colors = SqlUtils.get_result(
            query, Shoe, DetailShoe, Color)

        if len(detail_shoes) == 0:
            err_code = ErrorCode.ERR_IN_ACT_SHOW_FINAL_CHOICE
            err_message = f'Xin lỗi {prefix_name}{customer_name}, hệ thống đã xảy ra lỗi. error code={err_code}'
            dispatcher.utter_message(text=err_message)
            return []
        elif detail_shoes[0].quantityAvailable < 1:
            text = 'Xin lỗi {}, đôi {} size {} màu {} hết hàng rồi ạ' \
                .format(prefix_name, shoe_model, shoe_size, color_name)
            dispatcher.utter_message(text=text)
            return []
        else:
            text = '{} thêm món này vào giỏ hàng giúp {} nhé'.format(
                bot_position, prefix_name)
            dispatcher.utter_message(text=text)

            horizontal_template_elements = []
            for index in range(len(shoes)):
                shoe = shoes[index]
                detail_shoe = detail_shoes[index]
                detail_shoe: DetailShoe

                buttons = [
                    PostBackButton(
                        title='Thêm vào giỏ hàng' + shoe.shoeModel,
                        str_send_to_webhook='ok luôn. thêm vào giỏ hàng'),
                    # UrlButton(
                    #     title='Mua luôn đôi này',
                    #     url_access=MyWebUrl.get_buy_now_url(messenger_id=messenger_id,
                    #                                         detail_shoe_id=detail_shoe.detailShoe_id)
                    # ),
                ]
                element = HorizontalTemplateElement(
                    image_url=shoe.image_static,
                    title=shoe.shoeName,
                    subtitle=f'màu: {color_name}, size: {shoe_size}\n ' +
                    price_format(detail_shoe.newPrice),
                    default_action=HorizontalTemplateElement.DefaultAction(
                        MyWebUrl.get_detail_shoe_url(shoe.shoe_id)),
                    list_buttons=buttons,
                )
                horizontal_template_elements.append(element)
            horizontal_template = HorizontalTemplate(
                horizontal_template_elements)
            dispatcher.utter_message(
                json_message=horizontal_template.to_json_message())

            # xem tiep
            quick_reply_elements = [
                QuickReplyElement(QuickReplyElement.TEXT, 'Xem thêm giày',
                                  'Xem đôi giày khác'),
            ]
            text = 'Hành động khác:'
            # if not coupon_id:
            #     text = '{} có muốn lấy mã giảm giá không ạ?'.format(prefix_name)
            #     quick_reply_elements.append(
            #         QuickReplyElement(QuickReplyElement.TEXT, 'Lấy mã giảm giá', 'cho tôi xem mã giảm giá'),
            #     )
            quick_replies = QuickReplies(
                text_before_template=text,
                list_quick_reply_elements=quick_reply_elements)
            dispatcher.utter_message(
                json_message=quick_replies.to_json_message())

            # print('*****************************************************')
            # print(horizontal_template.to_json_message())
            # print('*****************************************************')
            # pprint(quick_replies.to_json_message())
        return []
Пример #29
0
    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[EventType]:

        slots = {}

        if tracker.get_slot('date') is None and tracker.get_slot('time') is None:
            any_date, good_date = False, False
            for entity in tracker.latest_message['entities']:
                if entity['entity'] == 'dates':
                    any_date = True
                    date_intervals = entity['value']
                    for e_date in date_intervals:
                        overlaps = is_good_date(self.appointments, e_date, all_options=True)
                        if overlaps and not good_date:

                            # If specified interval is longer then a day, suggest narrowing it...
                            if is_multiple_days(overlaps):
                                cands = sorted([d['start_date'] for d in overlaps])
                                cands_s = f'{get_date_text(cands[0])} és {get_date_text(cands[1])}'
                                dispatcher.utter_message(
                                    text=f"A legközelebbi két nap amikor ráérek a kért időszakban {cands_s} lesz.")
                                return []
                            else:
                                good_date = overlaps[0]['start_date'].date()
                                break

                elif entity['entity'] == 'times' and tracker.get_slot('possible_dates') is not None:
                    for date in tracker.get_slot('possible_dates'):
                        for appointment in self.appointments:
                            if date in appointment['start_date'].strftime("%Y-%m-%d"):
                                good_date = datetime.strptime(date, "%Y-%m-%d").date()
                                any_date = True
                                break

            # Checking the value of any_date and good_date variables, and with that give back the right sentence
            if not any_date:
                dispatcher.utter_message(text="Okés. Mikor lenne jó?")
                return []

            if not good_date:
                dispatcher.utter_message(text="Sajnos nem érek rá akkor... Máskor esetleg?")
                return [FollowupAction("followup_action_recommend_date")]

            if good_date:
                slots['date'] = SlotSet('date', good_date.strftime('%Y-%m-%d'))

        if tracker.get_slot("date") or slots:
            if tracker.get_slot('date'):
                possible_date = datetime.strptime(tracker.get_slot('date'), '%Y-%m-%d').date()
            else:
                possible_date = good_date

            any_time, good_time = False, False
            for entity in tracker.latest_message['entities']:
                if entity['entity'] == 'times':
                    any_time = True
                    time_intervals = entity['value']
                    time_intervals = [{'start_date': datetime.combine(possible_date,
                                                                      datetime.strptime(ti['start_date'],
                                                                                        '%H:%M').time()),
                                       'end_date': datetime.combine(possible_date,
                                                                    datetime.strptime(ti['end_date'], '%H:%M').time())}
                                      for ti in time_intervals]
                    for e_time in time_intervals:
                        overlap = is_good_date(self.appointments, e_time)
                        if overlap and not good_time:

                            # If specified interval is longer then an hour, suggest narrowing it...
                            if (overlap['end_date'] - overlap['start_date']).seconds > 3600:
                                dispatcher.utter_message(
                                    text=f"{get_time_text(overlap['start_date'])} és {get_time_text(overlap['end_date'])} között ráérek. Mikor legyen pontosan?")
                                return []
                            else:
                                good_time = overlap['start_date'].time()
                                break

            if not any_time and not slots:
                dispatcher.utter_message(text="Nem értettem, ne haragudj. Hány órakor találkozzunk?")
                return []

            if not good_time and not slots:
                dispatcher.utter_message(text=f"Sajnos nem érek rá ekkor... Egy másik időpont esetleg?")
                return [FollowupAction("followup_action_recommend_date")]

            if good_time:
                slots['time'] = SlotSet('time', good_time.strftime('%H:%M'))

        if slots:
            if 'time' in list(slots.keys()):
                if 'date' in list(slots.keys()):
                    date = good_date
                else:
                    date = datetime.strptime(tracker.get_slot('date'), '%Y-%m-%d')

                dispatcher.utter_message(template="utter_submit",
                                         date=get_date_text(date),
                                         time=get_time_text(datetime.combine(datetime.min.date(), good_time),
                                                            add_suffix=True))

            elif 'date' in list(slots.keys()):
                dispatcher.utter_message(text=f"Ráérek {get_date_text(good_date)}. Mikor lenne jó aznap?")

            return list(slots.values())
        else:
            return []
Пример #30
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        dia = tracker.get_slot('dia')
        horas = tracker.get_slot('horas')
        duracion = tracker.get_slot('duracion')

        if duracion != "None" and "hora" in duracion:
            switcher = {
                "una hora": "60",
                "dos horas": "120",
                "tres horas": "180",
                "cuatro horas": "240",
                "1 hora": "60",
                "2 horas": "120",
                "3 horas": "180",
                "4 horas": "240"
            }
            duracion = switcher.get(duracion)

        if duracion != "None" and "minuto" in duracion:
            switcher = {
                "un": "1",
                "dos": "2",
                "tres": "3",
                "cuatro": "4",
                "cinco": "5",
                "seis": "6",
                "siete": "7",
                "ocho": "8",
                "nueve": "9"
            }
            duracion = duracion.replace(" minutos", "")
            duracion = duracion.replace(" minuto", "")
            duracion = switcher.get(duracion, duracion)

        horas = horas.replace("h",
                              "")  # para cuando toma por ejemplo: a las 11h
        if horas != "None" and len(horas) > 2 and not ":" in horas:
            switcher = {
                "ocho": "08:00",
                "nueve": "09:00",
                "una": "13:00",
                "dos": "14:00",
                "tres": "15:00",
                "cuatro": "16:00",
                "cinco": "17:00",
                "seis": "18:00"
            }
            horas = switcher.get(horas)

        if horas != "None" and len(horas) < 2 and not ":" in horas:
            switcher = {
                "1": "13:00",
                "2": "14:00",
                "3": "15:00",
                "4": "16:00",
                "5": "17:00",
                "6": "18:00",
                "7": "19:00",
                "8": "20:00",
                "9": "21:00"
            }
            horas = switcher.get(horas)

        if ":" in horas:
            switcher = {
                "01": "13",
                "02": "14",
                "03": "15",
                "04": "16",
                "05": "17",
                "06": "18"
            }
            hora = horas[:2]
            horas = str(switcher.get(hora, hora)) + horas[2:]
        else:
            if horas != "None":
                horas = horas + ":00"

        dispatcher.utter_message(text='!c_evento:' +
                                 tracker.get_slot('evento') + '_dia:' + dia +
                                 '_horario:' + horas + '_duracion:' + duracion)
        return [
            SlotSet('evento', "None"),
            SlotSet('dia', "hoy"),
            SlotSet('horas', "None"),
            SlotSet('duracion', "None")
        ]