Spaces:
Build error
Build error
Validify-testbot-1
/
botbuilder-python
/libraries
/botbuilder-dialogs
/botbuilder
/dialogs
/prompts
/confirm_prompt.py
| # Copyright (c) Microsoft Corporation. All rights reserved. | |
| # Licensed under the MIT License. | |
| from typing import Dict | |
| from recognizers_choice import recognize_boolean | |
| from botbuilder.core.turn_context import TurnContext | |
| from botbuilder.schema import ActivityTypes, Activity | |
| from botbuilder.dialogs.choices import ( | |
| Choice, | |
| ChoiceFactoryOptions, | |
| ChoiceRecognizers, | |
| ListStyle, | |
| ) | |
| from .prompt import Prompt | |
| from .prompt_culture_models import PromptCultureModels | |
| from .prompt_options import PromptOptions | |
| from .prompt_recognizer_result import PromptRecognizerResult | |
| class ConfirmPrompt(Prompt): | |
| _default_choice_options: Dict[str, object] = { | |
| c.locale: ( | |
| Choice(c.yes_in_language), | |
| Choice(c.no_in_language), | |
| ChoiceFactoryOptions(c.separator, c.inline_or, c.inline_or_more, True), | |
| ) | |
| for c in PromptCultureModels.get_supported_cultures() | |
| } | |
| # TODO: PromptValidator | |
| def __init__( | |
| self, | |
| dialog_id: str, | |
| validator: object = None, | |
| default_locale: str = None, | |
| choice_defaults: Dict[str, object] = None, | |
| ): | |
| super().__init__(dialog_id, validator) | |
| if dialog_id is None: | |
| raise TypeError("ConfirmPrompt(): dialog_id cannot be None.") | |
| # TODO: Port ListStyle | |
| self.style = ListStyle.auto | |
| # TODO: Import defaultLocale | |
| self.default_locale = default_locale | |
| self.choice_options = None | |
| self.confirm_choices = 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("ConfirmPrompt.on_prompt(): turn_context cannot be None.") | |
| if not options: | |
| raise TypeError("ConfirmPrompt.on_prompt(): options cannot be None.") | |
| # Format prompt to send | |
| channel_id = turn_context.activity.channel_id | |
| culture = self._determine_culture(turn_context.activity) | |
| defaults = self._default_choice_options[culture] | |
| choice_opts = ( | |
| self.choice_options if self.choice_options is not None else defaults[2] | |
| ) | |
| confirms = ( | |
| self.confirm_choices | |
| if self.confirm_choices is not None | |
| else (defaults[0], defaults[1]) | |
| ) | |
| choices = [confirms[0], confirms[1]] | |
| if is_retry and options.retry_prompt is not None: | |
| prompt = self.append_choices( | |
| options.retry_prompt, channel_id, choices, self.style, choice_opts | |
| ) | |
| else: | |
| prompt = self.append_choices( | |
| options.prompt, channel_id, choices, self.style, choice_opts | |
| ) | |
| 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("ConfirmPrompt.on_prompt(): turn_context cannot be None.") | |
| result = PromptRecognizerResult() | |
| if turn_context.activity.type == ActivityTypes.message: | |
| # Recognize utterance | |
| utterance = turn_context.activity.text | |
| if not utterance: | |
| return result | |
| culture = self._determine_culture(turn_context.activity) | |
| results = recognize_boolean(utterance, culture) | |
| if results: | |
| first = results[0] | |
| if "value" in first.resolution: | |
| result.succeeded = True | |
| result.value = first.resolution["value"] | |
| else: | |
| # First check whether the prompt was sent to the user with numbers | |
| # if it was we should recognize numbers | |
| defaults = self._default_choice_options[culture] | |
| opts = ( | |
| self.choice_options | |
| if self.choice_options is not None | |
| else defaults[2] | |
| ) | |
| # This logic reflects the fact that IncludeNumbers is nullable and True is the default set in | |
| # Inline style | |
| if opts.include_numbers is None or opts.include_numbers: | |
| # The text may be a number in which case we will interpret that as a choice. | |
| confirm_choices = ( | |
| self.confirm_choices | |
| if self.confirm_choices is not None | |
| else (defaults[0], defaults[1]) | |
| ) | |
| choices = {confirm_choices[0], confirm_choices[1]} | |
| second_attempt_results = ChoiceRecognizers.recognize_choices( | |
| utterance, choices | |
| ) | |
| if second_attempt_results: | |
| result.succeeded = True | |
| result.value = second_attempt_results[0].resolution.index == 0 | |
| return result | |
| def _determine_culture(self, activity: Activity) -> str: | |
| culture = ( | |
| PromptCultureModels.map_to_nearest_language(activity.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 | |