Spaces:
Build error
Build error
Validify-testbot-1
/
botbuilder-python
/libraries
/botbuilder-dialogs
/botbuilder
/dialogs
/prompts
/choice_prompt.py
| # Copyright (c) Microsoft Corporation. All rights reserved. | |
| # Licensed under the MIT License. | |
| from typing import Callable, Dict, List | |
| from botbuilder.core import TurnContext | |
| from botbuilder.dialogs.choices import ( | |
| Choice, | |
| ChoiceFactoryOptions, | |
| ChoiceRecognizers, | |
| FindChoicesOptions, | |
| ListStyle, | |
| ) | |
| from botbuilder.schema import Activity, ActivityTypes | |
| from .prompt import Prompt | |
| from .prompt_culture_models import PromptCultureModels | |
| from .prompt_options import PromptOptions | |
| from .prompt_validator_context import PromptValidatorContext | |
| from .prompt_recognizer_result import PromptRecognizerResult | |
| class ChoicePrompt(Prompt): | |
| """ | |
| Prompts a user to select from a list of choices. | |
| By default the prompt will return to the calling dialog a `FoundChoice` object containing the choice that | |
| was selected. | |
| """ | |
| _default_choice_options: Dict[str, ChoiceFactoryOptions] = { | |
| c.locale: ChoiceFactoryOptions( | |
| inline_separator=c.separator, | |
| inline_or=c.inline_or_more, | |
| inline_or_more=c.inline_or_more, | |
| include_numbers=True, | |
| ) | |
| for c in PromptCultureModels.get_supported_cultures() | |
| } | |
| def __init__( | |
| self, | |
| dialog_id: str, | |
| validator: Callable[[PromptValidatorContext], bool] = None, | |
| default_locale: str = None, | |
| choice_defaults: Dict[str, ChoiceFactoryOptions] = None, | |
| ): | |
| """ | |
| :param dialog_id: Unique ID of the dialog within its parent `DialogSet`. | |
| :param validator: (Optional) validator that will be called each time the user responds to the prompt. | |
| If the validator replies with a message no additional retry prompt will be sent. | |
| :param default_locale: (Optional) locale to use if `dc.context.activity.locale` not specified. | |
| Defaults to a value of `en-us`. | |
| :param choice_defaults: (Optional) Overrides the dictionary of | |
| Bot Framework SDK-supported _default_choice_options. | |
| As type Dict[str, ChoiceFactoryOptions], the key is a string of the locale, such as "en-us". | |
| * Must be passed in to each ConfirmPrompt that needs the custom choice defaults. | |
| """ | |
| super().__init__(dialog_id, validator) | |
| self.style = ListStyle.auto | |
| self.default_locale = default_locale | |
| self.choice_options: ChoiceFactoryOptions = None | |
| self.recognizer_options: FindChoicesOptions = None | |
| if choice_defaults is not None: | |
| self._default_choice_options = choice_defaults | |
| async def on_prompt( | |
| self, | |
| turn_context: TurnContext, | |
| state: Dict[str, object], | |
| options: PromptOptions, | |
| is_retry: bool, | |
| ): | |
| if not turn_context: | |
| raise TypeError("ChoicePrompt.on_prompt(): turn_context cannot be None.") | |
| if not options: | |
| raise TypeError("ChoicePrompt.on_prompt(): options cannot be None.") | |
| # Determine culture | |
| culture = self._determine_culture(turn_context.activity) | |
| # Format prompt to send | |
| choices: List[Choice] = options.choices if options.choices else [] | |
| channel_id: str = turn_context.activity.channel_id | |
| choice_options: ChoiceFactoryOptions = ( | |
| self.choice_options | |
| if self.choice_options | |
| else self._default_choice_options[culture] | |
| ) | |
| choice_style = ( | |
| 0 if options.style == 0 else options.style if options.style else self.style | |
| ) | |
| if is_retry and options.retry_prompt is not None: | |
| prompt = self.append_choices( | |
| options.retry_prompt, channel_id, choices, choice_style, choice_options | |
| ) | |
| else: | |
| prompt = self.append_choices( | |
| options.prompt, channel_id, choices, choice_style, choice_options | |
| ) | |
| # Send prompt | |
| await turn_context.send_activity(prompt) | |
| async def on_recognize( | |
| self, | |
| turn_context: TurnContext, | |
| state: Dict[str, object], | |
| options: PromptOptions, | |
| ) -> PromptRecognizerResult: | |
| if not turn_context: | |
| raise TypeError("ChoicePrompt.on_recognize(): turn_context cannot be None.") | |
| choices: List[Choice] = options.choices if (options and options.choices) else [] | |
| result: PromptRecognizerResult = PromptRecognizerResult() | |
| if turn_context.activity.type == ActivityTypes.message: | |
| activity: Activity = turn_context.activity | |
| utterance: str = activity.text | |
| if not utterance: | |
| return result | |
| opt: FindChoicesOptions = ( | |
| self.recognizer_options | |
| if self.recognizer_options | |
| else FindChoicesOptions() | |
| ) | |
| opt.locale = self._determine_culture(turn_context.activity, opt) | |
| results = ChoiceRecognizers.recognize_choices(utterance, choices, opt) | |
| if results is not None and results: | |
| result.succeeded = True | |
| result.value = results[0].resolution | |
| return result | |
| def _determine_culture( | |
| self, activity: Activity, opt: FindChoicesOptions = FindChoicesOptions() | |
| ) -> str: | |
| culture = ( | |
| PromptCultureModels.map_to_nearest_language(activity.locale) | |
| or opt.locale | |
| or self.default_locale | |
| or PromptCultureModels.English.locale | |
| ) | |
| if not culture or not self._default_choice_options.get(culture): | |
| culture = PromptCultureModels.English.locale | |
| return culture | |