Skip to content

Change DeliveryMode bufferedReplies to expectReplies #838

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Mar 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
ConversationAccount,
ConversationParameters,
ConversationReference,
ExpectedReplies,
TokenResponse,
ResourceResponse,
DeliveryModes,
Expand Down Expand Up @@ -459,12 +460,12 @@ async def process_activity_with_identity(

# Return the buffered activities in the response. In this case, the invoker
# should deserialize accordingly:
# activities = [Activity().deserialize(activity) for activity in response.body]
if context.activity.delivery_mode == DeliveryModes.buffered_replies:
serialized_activities = [
activity.serialize() for activity in context.buffered_replies
]
return InvokeResponse(status=200, body=serialized_activities)
# activities = ExpectedReplies().deserialize(response.body).activities
if context.activity.delivery_mode == DeliveryModes.expect_replies:
expected_replies = ExpectedReplies(
activities=context.buffered_reply_activities
).serialize()
return InvokeResponse(status=200, body=expected_replies)

return None

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from logging import Logger
import aiohttp

from botbuilder.schema import Activity
from botbuilder.schema import Activity, ExpectedReplies
from botframework.connector.auth import (
ChannelProvider,
CredentialProvider,
Expand Down Expand Up @@ -110,14 +110,14 @@ async def post_buffered_activity(
) -> [Activity]:
"""
Helper method to return a list of activities when an Activity is being
sent with DeliveryMode == bufferedReplies.
sent with DeliveryMode == expectReplies.
"""
response = await self.post_activity(
from_bot_id, to_bot_id, to_url, service_url, conversation_id, activity
)
if not response or (response.status / 100) != 2:
return []
return [Activity().deserialize(activity) for activity in response.body]
return ExpectedReplies().deserialize(response.body).activities

async def _get_app_credentials(
self, app_id: str, oauth_scope: str
Expand Down
8 changes: 4 additions & 4 deletions libraries/botbuilder-core/botbuilder/core/turn_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ def __init__(self, adapter_or_context, request: Activity = None):

self._turn_state = {}

# A list of activities to send when `context.Activity.DeliveryMode == 'bufferedReplies'`
self.buffered_replies = []
# A list of activities to send when `context.Activity.DeliveryMode == 'expectReplies'`
self.buffered_reply_activities = []

@property
def turn_state(self) -> Dict[str, object]:
Expand Down Expand Up @@ -198,10 +198,10 @@ def activity_validator(activity: Activity) -> Activity:
async def logic():
nonlocal sent_non_trace_activity

if self.activity.delivery_mode == DeliveryModes.buffered_replies:
if self.activity.delivery_mode == DeliveryModes.expect_replies:
responses = []
for activity in output:
self.buffered_replies.append(activity)
self.buffered_reply_activities.append(activity)
responses.append(ResourceResponse())

if sent_non_trace_activity:
Expand Down
13 changes: 7 additions & 6 deletions libraries/botbuilder-core/tests/test_bot_framework_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
ConversationResourceResponse,
ChannelAccount,
DeliveryModes,
ExpectedReplies,
)
from botframework.connector.aio import ConnectorClient
from botframework.connector.auth import (
Expand Down Expand Up @@ -578,7 +579,7 @@ async def callback(context: TurnContext):
refs, callback, claims_identity=skills_identity, audience=skill_2_app_id
)

async def test_delivery_mode_buffered_replies(self):
async def test_delivery_mode_expect_replies(self):
mock_credential_provider = unittest.mock.create_autospec(CredentialProvider)

settings = BotFrameworkAdapterSettings(
Expand All @@ -595,7 +596,7 @@ async def callback(context: TurnContext):
type=ActivityTypes.message,
channel_id="emulator",
service_url="http://tempuri.org/whatever",
delivery_mode=DeliveryModes.buffered_replies,
delivery_mode=DeliveryModes.expect_replies,
text="hello world",
)

Expand All @@ -613,11 +614,11 @@ async def callback(context: TurnContext):
)
assert invoke_response
assert invoke_response.status == 200
activities = invoke_response.body
activities = ExpectedReplies().deserialize(invoke_response.body).activities
assert len(activities) == 3
assert activities[0]["text"] == "activity 1"
assert activities[1]["text"] == "activity 2"
assert activities[2]["text"] == "activity 3"
assert activities[0].text == "activity 1"
assert activities[1].text == "activity 2"
assert activities[2].text == "activity 3"
assert (
adapter.connector_client_mock.conversations.send_to_conversation.call_count
== 0
Expand Down
3 changes: 3 additions & 0 deletions libraries/botbuilder-schema/botbuilder/schema/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from ._models_py3 import ConversationReference
from ._models_py3 import ConversationResourceResponse
from ._models_py3 import ConversationsResult
from ._models_py3 import ExpectedReplies
from ._models_py3 import Entity
from ._models_py3 import Error
from ._models_py3 import ErrorResponse, ErrorResponseException
Expand Down Expand Up @@ -74,6 +75,7 @@
from ._models import ConversationReference
from ._models import ConversationResourceResponse
from ._models import ConversationsResult
from ._models import ExpectedReplies
from ._models import Entity
from ._models import Error
from ._models import ErrorResponse, ErrorResponseException
Expand Down Expand Up @@ -136,6 +138,7 @@
"ConversationReference",
"ConversationResourceResponse",
"ConversationsResult",
"ExpectedReplies",
"Entity",
"Error",
"ErrorResponse",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class DeliveryModes(str, Enum):

normal = "normal"
notification = "notification"
buffered_replies = "bufferedReplies"
expect_replies = "expectReplies"


class ContactRelationUpdateActionTypes(str, Enum):
Expand Down
17 changes: 16 additions & 1 deletion libraries/botbuilder-schema/botbuilder/schema/_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class Activity(Model):
:param delivery_mode: A delivery hint to signal to the recipient alternate
delivery paths for the activity.
The default delivery mode is "default". Possible values include: 'normal',
'notification'
'notification', 'expectReplies'
:type delivery_mode: str or ~botframework.connector.models.DeliveryModes
:param listen_for: List of phrases and references that speech and language
priming systems should listen for
Expand Down Expand Up @@ -806,6 +806,21 @@ def __init__(self, **kwargs):
self.conversations = kwargs.get("conversations", None)


class ExpectedReplies(Model):
"""ExpectedReplies.

:param activities: A collection of Activities that conforms to the
ExpectedReplies schema.
:type activities: list[~botframework.connector.models.Activity]
"""

_attribute_map = {"activities": {"key": "activities", "type": "[Activity]"}}

def __init__(self, **kwargs):
super(ExpectedReplies, self).__init__(**kwargs)
self.activities = kwargs.get("activities", None)


class Entity(Model):
"""Metadata object pertaining to an activity.

Expand Down
17 changes: 16 additions & 1 deletion libraries/botbuilder-schema/botbuilder/schema/_models_py3.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class Activity(Model):
:param delivery_mode: A delivery hint to signal to the recipient alternate
delivery paths for the activity.
The default delivery mode is "default". Possible values include: 'normal',
'notification'
'notification', 'expectReplies'
:type delivery_mode: str or ~botframework.connector.models.DeliveryModes
:param listen_for: List of phrases and references that speech and language
priming systems should listen for
Expand Down Expand Up @@ -978,6 +978,21 @@ def __init__(
self.conversations = conversations


class ExpectedReplies(Model):
"""ExpectedReplies.

:param activities: A collection of Activities that conforms to the
ExpectedReplies schema.
:type activities: list[~botframework.connector.models.Activity]
"""

_attribute_map = {"activities": {"key": "activities", "type": "[Activity]"}}

def __init__(self, *, activities=None, **kwargs) -> None:
super(ExpectedReplies, self).__init__(**kwargs)
self.activities = activities


class Entity(Model):
"""Metadata object pertaining to an activity.

Expand Down
3 changes: 2 additions & 1 deletion libraries/swagger/ConnectorAPI.json
Original file line number Diff line number Diff line change
Expand Up @@ -2293,7 +2293,8 @@
"description": "Values for deliveryMode field",
"enum": [
"normal",
"notification"
"notification",
"expectReplies"
],
"type": "string",
"properties": {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async def on_message_activity(self, turn_context: TurnContext):
TurnContext.apply_conversation_reference(
activity, TurnContext.get_conversation_reference(turn_context.activity)
)
activity.delivery_mode = DeliveryModes.buffered_replies
activity.delivery_mode = DeliveryModes.expect_replies

activities = await self.client.post_buffered_activity(
None,
Expand Down