Spaces:
Build error
Build error
Validify-testbot-1
/
botbuilder-python
/libraries
/botbuilder-dialogs
/botbuilder
/dialogs
/dialog.py
# Copyright (c) Microsoft Corporation. All rights reserved. | |
# Licensed under the MIT License. | |
from abc import ABC, abstractmethod | |
from botbuilder.core import TurnContext, NullTelemetryClient, BotTelemetryClient | |
from .dialog_reason import DialogReason | |
from .dialog_event import DialogEvent | |
from .dialog_turn_status import DialogTurnStatus | |
from .dialog_turn_result import DialogTurnResult | |
from .dialog_instance import DialogInstance | |
class Dialog(ABC): | |
end_of_turn = DialogTurnResult(DialogTurnStatus.Waiting) | |
def __init__(self, dialog_id: str): | |
if dialog_id is None or not dialog_id.strip(): | |
raise TypeError("Dialog(): dialogId cannot be None.") | |
self._telemetry_client = NullTelemetryClient() | |
self._id = dialog_id | |
def id(self) -> str: # pylint: disable=invalid-name | |
return self._id | |
def telemetry_client(self) -> BotTelemetryClient: | |
""" | |
Gets the telemetry client for logging events. | |
""" | |
return self._telemetry_client | |
def telemetry_client(self, value: BotTelemetryClient) -> None: | |
""" | |
Sets the telemetry client for logging events. | |
""" | |
if value is None: | |
self._telemetry_client = NullTelemetryClient() | |
else: | |
self._telemetry_client = value | |
async def begin_dialog( | |
self, dialog_context: "DialogContext", options: object = None | |
): | |
""" | |
Method called when a new dialog has been pushed onto the stack and is being activated. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:param options: (Optional) additional argument(s) to pass to the dialog being started. | |
""" | |
raise NotImplementedError() | |
async def continue_dialog(self, dialog_context: "DialogContext"): | |
""" | |
Method called when an instance of the dialog is the "current" dialog and the | |
user replies with a new activity. The dialog will generally continue to receive the user's | |
replies until it calls either `end_dialog()` or `begin_dialog()`. | |
If this method is NOT implemented then the dialog will automatically be ended when the user replies. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:return: | |
""" | |
# By default just end the current dialog. | |
return await dialog_context.end_dialog(None) | |
async def resume_dialog( # pylint: disable=unused-argument | |
self, dialog_context: "DialogContext", reason: DialogReason, result: object | |
): | |
""" | |
Method called when an instance of the dialog is being returned to from another | |
dialog that was started by the current instance using `begin_dialog()`. | |
If this method is NOT implemented then the dialog will be automatically ended with a call | |
to `end_dialog()`. Any result passed from the called dialog will be passed | |
to the current dialog's parent. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:param reason: Reason why the dialog resumed. | |
:param result: (Optional) value returned from the dialog that was called. The type of the value returned is | |
dependent on the dialog that was called. | |
:return: | |
""" | |
# By default just end the current dialog and return result to parent. | |
return await dialog_context.end_dialog(result) | |
# TODO: instance is DialogInstance | |
async def reprompt_dialog( # pylint: disable=unused-argument | |
self, context: TurnContext, instance: DialogInstance | |
): | |
""" | |
:param context: | |
:param instance: | |
:return: | |
""" | |
# No-op by default | |
return | |
# TODO: instance is DialogInstance | |
async def end_dialog( # pylint: disable=unused-argument | |
self, context: TurnContext, instance: DialogInstance, reason: DialogReason | |
): | |
""" | |
:param context: | |
:param instance: | |
:param reason: | |
:return: | |
""" | |
# No-op by default | |
return | |
def get_version(self) -> str: | |
return self.id | |
async def on_dialog_event( | |
self, dialog_context: "DialogContext", dialog_event: DialogEvent | |
) -> bool: | |
""" | |
Called when an event has been raised, using `DialogContext.emitEvent()`, by either the current dialog or a | |
dialog that the current dialog started. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:param dialog_event: The event being raised. | |
:return: True if the event is handled by the current dialog and bubbling should stop. | |
""" | |
# Before bubble | |
handled = await self._on_pre_bubble_event(dialog_context, dialog_event) | |
# Bubble as needed | |
if (not handled) and dialog_event.bubble and dialog_context.parent: | |
handled = await dialog_context.parent.emit( | |
dialog_event.name, dialog_event.value, True, False | |
) | |
# Post bubble | |
if not handled: | |
handled = await self._on_post_bubble_event(dialog_context, dialog_event) | |
return handled | |
async def _on_pre_bubble_event( # pylint: disable=unused-argument | |
self, dialog_context: "DialogContext", dialog_event: DialogEvent | |
) -> bool: | |
""" | |
Called before an event is bubbled to its parent. | |
This is a good place to perform interception of an event as returning `true` will prevent | |
any further bubbling of the event to the dialogs parents and will also prevent any child | |
dialogs from performing their default processing. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:param dialog_event: The event being raised. | |
:return: Whether the event is handled by the current dialog and further processing should stop. | |
""" | |
return False | |
async def _on_post_bubble_event( # pylint: disable=unused-argument | |
self, dialog_context: "DialogContext", dialog_event: DialogEvent | |
) -> bool: | |
""" | |
Called after an event was bubbled to all parents and wasn't handled. | |
This is a good place to perform default processing logic for an event. Returning `true` will | |
prevent any processing of the event by child dialogs. | |
:param dialog_context: The dialog context for the current turn of conversation. | |
:param dialog_event: The event being raised. | |
:return: Whether the event is handled by the current dialog and further processing should stop. | |
""" | |
return False | |
def _on_compute_id(self) -> str: | |
""" | |
Computes an unique ID for a dialog. | |
:return: An unique ID for a dialog | |
""" | |
return self.__class__.__name__ | |
def _register_source_location( | |
self, path: str, line_number: int | |
): # pylint: disable=unused-argument | |
""" | |
Registers a SourceRange in the provided location. | |
:param path: The path to the source file. | |
:param line_number: The line number where the source will be located on the file. | |
:return: | |
""" | |
if path: | |
# This will be added when debbuging support is ported. | |
# DebugSupport.source_map.add(self, SourceRange( | |
# path = path, | |
# start_point = SourcePoint(line_index = line_number, char_index = 0 ), | |
# end_point = SourcePoint(line_index = line_number + 1, char_index = 0 ), | |
# ) | |
return | |