예제 #1
0
    def run(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> List[Dict[Text, Any]]:
        bind_logger(tracker)

        last_user_event = tracker.get_last_event_for("user")
        last_user_event = copy.deepcopy(last_user_event)
        text = last_user_event["text"]

        fallback_user_event = UserUttered(
            text,
            parse_data={
                "text": text,
                "intent": {"name": "fallback", "confidence": 1.0},
                "intent_ranking": [{"name": "fallback", "confidence": 1.0}],
                "entities": [],
            },
        )

        return [
            UserUtteranceReverted(),
            ActionExecuted("action_listen"),
            fallback_user_event,
        ]
예제 #2
0
    async def validate_location(
        self,
        value: Text,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> Dict[Text, Optional[Text]]:
        latest_message = tracker.get_last_event_for("user")
        metadata = latest_message.get("metadata")

        # Use location pin data if submitted
        if metadata and metadata.get("type") == "location":
            latitude = metadata["location"]["latitude"]
            longitude = metadata["location"]["longitude"]
            address = metadata["location"].get("address")
            if not address:
                address = f"GPS: {latitude}, {longitude}"
            return {
                "location_coords": self.format_location(latitude, longitude),
                "location": address,
                "location_confirm": "yes",
            }

        if not value:
            dispatcher.utter_message(template="utter_incorrect_selection")
            return {"location": None}

        if not config.GOOGLE_PLACES_API_KEY:
            return {
                "location": value,
            }

        session_token = uuid.uuid4().hex
        province = self.get_province(tracker)

        if hasattr(httpx, "AsyncClient"):
            # from httpx>=0.11.0, the async client is a different class
            HTTPXClient = getattr(httpx, "AsyncClient")
        else:
            HTTPXClient = getattr(httpx, "Client")

        async with HTTPXClient() as client:
            location = None
            for _ in range(3):
                try:
                    location = await self.places_lookup(
                        client, value, session_token, province)
                    break
                except Exception:
                    pass
            if not location:
                dispatcher.utter_message(template="utter_incorrect_location")
                return {"location": None}
            geometry = location["geometry"]["location"]
            return {
                "location":
                location["formatted_address"],
                "city_location_coords":
                self.format_location(geometry["lat"], geometry["lng"]),
            }
예제 #3
0
 def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
         domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
     results = []
     list_entity = tracker.get_last_event_for(
         'user')["parse_data"]["entities"]
     dispatcher.utter_message(
         'Giữa các gói tin có sự khác nhau về mức độ ưu tiên hiển thị, màu và độ lớn của tiêu đề ạ.'
     )
     for entity in list_entity:
         if entity['entity'] == 'post_package':
             value = entity['value'].lower()
             if value in [
                     'tin thuong', 'tin thường', 'tinthường', 'tinthuong'
             ]:
                 results.append('utter_vip0_info')
             elif 'vip' in value:
                 if '1' in value:
                     results.append('utter_vip1_info')
                 elif '2' in value:
                     results.append('utter_vip2_info')
                 elif '3' in value:
                     results.append('utter_vip3_info')
     if len(results) <= 1:
         results = [
             'utter_vip0_info', 'utter_vip1_info', 'utter_vip2_info',
             'utter_vip3_info'
         ]
     for utter in results:
         dispatcher.utter_template(utter, tracker)
     return [SlotSet("post_package", None)]
예제 #4
0
def _replay_message_with_suffix(
    dispatcher: CollectingDispatcher, tracker: Tracker
) -> List[EventType]:
    logger.debug(
        "No rule matched for intent, playing error version of last bot message"
    )
    latest_bot_message = tracker.get_last_event_for("bot")
    template = latest_bot_message["metadata"]["template_name"]
    dispatcher.utter_message(template=_with_error_suffix(template))

    return [UserUtteranceReverted(), FollowupAction(ACTION_LISTEN_NAME)]
def get_user_id_from_event(tracker: Tracker) -> Text:
    """Pulls "session_started" event, if available, and 
       returns the userId from the channel's metadata.
       Anonymous user profile ID is returned if channel 
       metadata is not available
    """
    event = tracker.get_last_event_for("session_started")
    if event is not None:
        # Read the channel's metadata.
        metadata = event.get("metadata", {})
        # If "usedId" key is missing, return anonymous ID.
        return metadata.get("userId", anonymous_profile.get("id"))

    return anonymous_profile.get("id")
예제 #6
0
    async def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
                  domain: Dict) -> List[EventType]:
        bind_logger(tracker)

        latest_bot_message = tracker.get_last_event_for(
            "bot")["metadata"]["template_name"]

        if latest_bot_message.startswith(
                "utter_ask_daily_ci_enroll_form_validation_code"):
            dispatcher.utter_message(
                template="utter_ask_daily_ci_enroll_form_validation_code_error"
            )
        else:
            dispatcher.utter_message(
                template="utter_ask_daily_ci_enroll_form_validation_code")

        return []
예제 #7
0
    async def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
                  domain: Dict) -> List[EventType]:
        bind_logger(tracker)

        latest_bot_event = tracker.get_last_event_for("bot")
        latest_bot_message = (latest_bot_event["metadata"]["template_name"]
                              if latest_bot_event else None)

        if tracker.get_slot(PHONE_TO_CHANGE_SLOT) is True:
            dispatcher.utter_message(template="utter_ask_phone_number_new")
        # Coming from cancel digression. Cannot find a better way.
        elif (tracker.get_slot(PHONE_TRY_COUNTER_SLOT) > 0
              or latest_bot_message
              == "utter_daily_ci_enroll_acknowledge_continue"):
            dispatcher.utter_message(template="utter_ask_phone_number_error")
        else:
            dispatcher.utter_message(template="utter_ask_phone_number")

        return []
예제 #8
0
def _replace_user_input(tracker: Tracker) -> List[EventType]:
    logger.debug(
        "No rule matched for intent, replacing user input with fallback intent"
    )
    last_user_event = tracker.get_last_event_for("user")
    last_user_event = copy.deepcopy(last_user_event)
    text = last_user_event["text"]

    fallback_user_event = UserUttered(
        text,
        parse_data={
            "text": text,
            "intent": {"name": FALLBACK_INTENT, "confidence": 1.0},
            "intent_ranking": [{"name": FALLBACK_INTENT, "confidence": 1.0}],
            "entities": [],
        },
    )

    return [
        UserUtteranceReverted(),
        ActionExecuted(ACTION_LISTEN_NAME),
        fallback_user_event,
    ]
예제 #9
0
def _get_last_action_name(tracker: Tracker) -> Optional[str]:
    last_action = tracker.get_last_event_for(
        "action", exclude=[ACTION_LISTEN_NAME, FALLBACK_ACTION_NAME])
    return last_action["name"] if last_action is not None else None
예제 #10
0
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        post_package = tracker.get_slot('post_package')
        duration = tracker.get_slot('duration')
        duration, duration_value, duration_unit, _ = convert_duration(duration)

        vip_type = convert_post_package(post_package)

        fee_table = self.fee_table
        if vip_type is not None:
            # nếu chỉ bắt được post_package
            if duration == None:
                dispatcher.utter_message(
                    text="Giá gói {} hiện tại là {}đ/tin/ngày ạ.".format(
                        fee_table[vip_type]['name'],
                        price_format(fee_table[vip_type]['fee'][1])))
                message = 'Ngoài ra MeeyLand còn có các gói'
                for package in fee_table:
                    if package != vip_type:
                        message += ' {} với giá {}đ/tin/ngày,'.format(
                            fee_table[package]['name'],
                            price_format(fee_table[package]['fee'][1]))
                message = message[:-1] + ' ạ.'
                dispatcher.utter_message(message)
                return [
                    SlotSet("post_package", None),
                    SlotSet("duration", None)
                ]
            # nếu bắt dc cả 2
            else:
                cost = fee_table[vip_type]['fee'][
                    1] * duration_value * self.coefficient[duration_unit][
                        'coef']
                text_unit = self.coefficient[duration_unit]['text']
                message = 'Gói {} trong {} {} có giá {}đ ạ'.format(
                    fee_table[vip_type]['name'], duration_value, text_unit,
                    price_format(cost))
                dispatcher.utter_message(message)
                return [
                    SlotSet("post_package", None),
                    SlotSet("duration", None)
                ]

        # Nếu chỉ bắt dc duration
        elif duration != None:
            message = 'Không biết bạn muốn hỏi về gói vip nào ạ'
            dispatcher.utter_message(message)
            message = 'Hiện tại bên em đang có 3 gói đăng tin vip là VIP1, VIP2 và VIP3 ạ.'
            dispatcher.utter_message(message)
            return [SlotSet("post_package", None), SlotSet("duration", None)]

        # Còn lại là trường hợp không bắt được gì
        text = tracker.get_last_event_for('user')['text']
        if 'vip' in text:
            message = 'Hiện tại Meeyland cung cấp {} gói tin VIP là'.format(
                len(fee_table))
            for package in fee_table:
                message += ' gói {} giá {}đ/tin/ngày,'.format(
                    fee_table[package]['name'],
                    price_format(fee_table[package]['fee'][1]))
            message = message[:-1] + ' ạ.'
            dispatcher.utter_message(message)
            dispatcher.utter_message(
                "Bạn có thể tham khảo chi tiết bảng giá tại [đây](https://meeyland.com/page/bao-gia)"
            )
            return [SlotSet("post_package", None), SlotSet("duration", None)]
        else:
            message = 'Hiện tại Meeyland cung cấp {} gói tin là'.format(
                len(fee_table) + 1)
            for package in fee_table:
                message += ' gói {} giá {}đ/tin/ngày,'.format(
                    fee_table[package]['name'],
                    price_format(fee_table[package]['fee'][1]))
            message = message[:-1] + ' và gói tin thường miễn phí ạ.'
            dispatcher.utter_message(message)
            dispatcher.utter_message(
                "Bạn có thể tham khảo chi tiết bảng giá tại [đây](https://meeyland.com/page/bao-gia)"
            )
            return [SlotSet("post_package", None), SlotSet("duration", None)]