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, ]
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"]), }
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)]
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")
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 []
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 []
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, ]
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
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)]