From ea8208b0013a42f8aefe91d65ac25fd86c9d98ad Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Tue, 28 Jan 2020 10:26:10 -0800 Subject: [PATCH 1/8] adding helper for starting thread in Teams --- .../botbuilder/core/bot_framework_adapter.py | 7 ++-- .../botbuilder/core/teams/teams_info.py | 33 +++++++++++++++++-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py index 7309bdbef..fcedde2ca 100644 --- a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py +++ b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py @@ -198,7 +198,9 @@ async def create_conversation( ) ) client = await self.create_connector_client(reference.service_url) - + resource_response = await client.conversations.create_conversation( + parameters + ) # Mix in the tenant ID if specified. This is required for MS Teams. if reference.conversation is not None and reference.conversation.tenant_id: # Putting tenant_id in channel_data is a temporary while we wait for the Teams API to be updated @@ -209,9 +211,6 @@ async def create_conversation( # Permanent solution is to put tenant_id in parameters.tenant_id parameters.tenant_id = reference.conversation.tenant_id - resource_response = await client.conversations.create_conversation( - parameters - ) request = TurnContext.apply_conversation_reference( Activity(type=ActivityTypes.event, name="CreateConversation"), reference, diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 0b9cb9471..848ec3303 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -2,7 +2,8 @@ # Licensed under the MIT License. from typing import List -from botbuilder.core.turn_context import TurnContext +from botbuilder.schema import ConversationParameters +from botbuilder.core.turn_context import Activity, TurnContext from botbuilder.schema.teams import ( ChannelInfo, TeamDetails, @@ -12,8 +13,36 @@ from botframework.connector.aio import ConnectorClient from botframework.connector.teams.teams_connector_client import TeamsConnectorClient - class TeamsInfo: + @staticmethod + async def send_message_to_teams_channel( + turn_context: TurnContext, activity: Activity, teams_channel_id: str + ) -> tuple: + if not turn_context: + raise ValueError("The turn_context cannot be None") + if not turn_context.activity: + raise ValueError("The turn_context.activity cannot be None") + if not teams_channel_id: + raise ValueError("The teams_channel_id cannot be None or empty") + + old_ref = TurnContext.get_conversation_reference(turn_context.activity) + conversation_parameters = ConversationParameters( + is_group=True, + channel_data={"channel": {"id": teams_channel_id}}, + activity=activity, + ) + + result = await turn_context.adapter.create_conversation( + old_ref, TeamsInfo._create_conversation_callback, conversation_parameters + ) + return (result[0], result[1]) + + @staticmethod + async def _create_conversation_callback(new_turn_context) -> tuple: + new_activity_id = new_turn_context.activity.id + conversation_reference = TurnContext.get_conversation_reference(new_turn_context.activity) + return (conversation_reference, new_activity_id) + @staticmethod async def get_team_details( turn_context: TurnContext, team_id: str = "" From 6a017c584de057bcc3460ca782e5dbeb621e06b2 Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Tue, 28 Jan 2020 11:06:24 -0800 Subject: [PATCH 2/8] updating for black --- .../botbuilder-core/botbuilder/core/teams/teams_info.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 848ec3303..c2f552627 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -13,6 +13,7 @@ from botframework.connector.aio import ConnectorClient from botframework.connector.teams.teams_connector_client import TeamsConnectorClient + class TeamsInfo: @staticmethod async def send_message_to_teams_channel( @@ -40,7 +41,9 @@ async def send_message_to_teams_channel( @staticmethod async def _create_conversation_callback(new_turn_context) -> tuple: new_activity_id = new_turn_context.activity.id - conversation_reference = TurnContext.get_conversation_reference(new_turn_context.activity) + conversation_reference = TurnContext.get_conversation_reference( + new_turn_context.activity + ) return (conversation_reference, new_activity_id) @staticmethod From b9a55a0c475232e6dd6d75ee78f5ed0030b0f3b4 Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Tue, 28 Jan 2020 10:26:10 -0800 Subject: [PATCH 3/8] adding helper for starting thread in Teams --- .../botbuilder/core/bot_framework_adapter.py | 7 ++-- .../botbuilder/core/teams/teams_info.py | 33 +++++++++++++++++-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py index 688f7ccda..933e4d8e5 100644 --- a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py +++ b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py @@ -270,7 +270,9 @@ async def create_conversation( ) ) client = await self.create_connector_client(reference.service_url) - + resource_response = await client.conversations.create_conversation( + parameters + ) # Mix in the tenant ID if specified. This is required for MS Teams. if reference.conversation is not None and reference.conversation.tenant_id: # Putting tenant_id in channel_data is a temporary while we wait for the Teams API to be updated @@ -281,9 +283,6 @@ async def create_conversation( # Permanent solution is to put tenant_id in parameters.tenant_id parameters.tenant_id = reference.conversation.tenant_id - resource_response = await client.conversations.create_conversation( - parameters - ) request = TurnContext.apply_conversation_reference( Activity(type=ActivityTypes.event, name="CreateConversation"), reference, diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 0b9cb9471..848ec3303 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -2,7 +2,8 @@ # Licensed under the MIT License. from typing import List -from botbuilder.core.turn_context import TurnContext +from botbuilder.schema import ConversationParameters +from botbuilder.core.turn_context import Activity, TurnContext from botbuilder.schema.teams import ( ChannelInfo, TeamDetails, @@ -12,8 +13,36 @@ from botframework.connector.aio import ConnectorClient from botframework.connector.teams.teams_connector_client import TeamsConnectorClient - class TeamsInfo: + @staticmethod + async def send_message_to_teams_channel( + turn_context: TurnContext, activity: Activity, teams_channel_id: str + ) -> tuple: + if not turn_context: + raise ValueError("The turn_context cannot be None") + if not turn_context.activity: + raise ValueError("The turn_context.activity cannot be None") + if not teams_channel_id: + raise ValueError("The teams_channel_id cannot be None or empty") + + old_ref = TurnContext.get_conversation_reference(turn_context.activity) + conversation_parameters = ConversationParameters( + is_group=True, + channel_data={"channel": {"id": teams_channel_id}}, + activity=activity, + ) + + result = await turn_context.adapter.create_conversation( + old_ref, TeamsInfo._create_conversation_callback, conversation_parameters + ) + return (result[0], result[1]) + + @staticmethod + async def _create_conversation_callback(new_turn_context) -> tuple: + new_activity_id = new_turn_context.activity.id + conversation_reference = TurnContext.get_conversation_reference(new_turn_context.activity) + return (conversation_reference, new_activity_id) + @staticmethod async def get_team_details( turn_context: TurnContext, team_id: str = "" From e06a091b128bf228f4a750178072d2984f4be1bf Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Tue, 28 Jan 2020 11:06:24 -0800 Subject: [PATCH 4/8] updating for black --- .../botbuilder-core/botbuilder/core/teams/teams_info.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 848ec3303..c2f552627 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -13,6 +13,7 @@ from botframework.connector.aio import ConnectorClient from botframework.connector.teams.teams_connector_client import TeamsConnectorClient + class TeamsInfo: @staticmethod async def send_message_to_teams_channel( @@ -40,7 +41,9 @@ async def send_message_to_teams_channel( @staticmethod async def _create_conversation_callback(new_turn_context) -> tuple: new_activity_id = new_turn_context.activity.id - conversation_reference = TurnContext.get_conversation_reference(new_turn_context.activity) + conversation_reference = TurnContext.get_conversation_reference( + new_turn_context.activity + ) return (conversation_reference, new_activity_id) @staticmethod From b54abc60abb37cbac3e8f7da361d1b01ac07cbdb Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Wed, 12 Feb 2020 10:54:50 -0800 Subject: [PATCH 5/8] fixing imports and PR feedback --- .../botbuilder/adapters/slack/slack_client.py | 5 +++-- .../botbuilder/adapters/slack/slack_helper.py | 3 ++- .../botbuilder/adapters/slack/slack_payload.py | 3 +-- .../botbuilder/core/teams/teams_info.py | 10 ++++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_client.py b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_client.py index d5e645f3f..42fb96e81 100644 --- a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_client.py +++ b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_client.py @@ -9,13 +9,14 @@ import aiohttp from aiohttp.web_request import Request -from slack.web.client import WebClient -from slack.web.slack_response import SlackResponse from botbuilder.schema import Activity from botbuilder.adapters.slack import SlackAdapterOptions from botbuilder.adapters.slack.slack_message import SlackMessage +from slack.web.client import WebClient +from slack.web.slack_response import SlackResponse + POST_MESSAGE_URL = "https://slack.com/api/chat.postMessage" POST_EPHEMERAL_MESSAGE_URL = "https://slack.com/api/chat.postEphemeral" diff --git a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_helper.py b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_helper.py index bc5e471a3..e15604442 100644 --- a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_helper.py +++ b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_helper.py @@ -6,7 +6,6 @@ from aiohttp.web_request import Request from aiohttp.web_response import Response -from slack.web.classes.attachments import Attachment from botbuilder.schema import ( Activity, @@ -15,6 +14,8 @@ ActivityTypes, ) +from slack.web.classes.attachments import Attachment + from .slack_message import SlackMessage from .slack_client import SlackClient from .slack_event import SlackEvent diff --git a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py index 5a8fd90eb..a058af442 100644 --- a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py +++ b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py @@ -3,10 +3,9 @@ from typing import Optional, List -from slack.web.classes.actions import Action - from botbuilder.adapters.slack.slack_message import SlackMessage +from slack.web.classes.actions import Action class SlackPayload: def __init__(self, **kwargs): diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index c2f552627..0395b4945 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -1,8 +1,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -from typing import List -from botbuilder.schema import ConversationParameters +from typing import List, Tuple +from botbuilder.schema import ConversationParameters, ConversationReference from botbuilder.core.turn_context import Activity, TurnContext from botbuilder.schema.teams import ( ChannelInfo, @@ -18,7 +18,7 @@ class TeamsInfo: @staticmethod async def send_message_to_teams_channel( turn_context: TurnContext, activity: Activity, teams_channel_id: str - ) -> tuple: + ) -> Tuple[ConversationReference, str]: if not turn_context: raise ValueError("The turn_context cannot be None") if not turn_context.activity: @@ -39,7 +39,9 @@ async def send_message_to_teams_channel( return (result[0], result[1]) @staticmethod - async def _create_conversation_callback(new_turn_context) -> tuple: + async def _create_conversation_callback( + new_turn_context, + ) -> Tuple[ConversationReference, str]: new_activity_id = new_turn_context.activity.id conversation_reference = TurnContext.get_conversation_reference( new_turn_context.activity From 6281af1c5efa6747f5bf1c1c30a3276b2a2dac5b Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Wed, 12 Feb 2020 10:56:10 -0800 Subject: [PATCH 6/8] saving changes --- .../botbuilder-core/botbuilder/core/teams/teams_info.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 9443aefff..6521c00f7 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -23,11 +23,7 @@ class TeamsInfo: @staticmethod async def send_message_to_teams_channel( turn_context: TurnContext, activity: Activity, teams_channel_id: str -<<<<<<< HEAD ) -> Tuple[ConversationReference, str]: -======= - ) -> tuple: ->>>>>>> 9f1901c313c763fb6ab6dbc884625d6fceac83f0 if not turn_context: raise ValueError("The turn_context cannot be None") if not turn_context.activity: @@ -48,13 +44,9 @@ async def send_message_to_teams_channel( return (result[0], result[1]) @staticmethod -<<<<<<< HEAD async def _create_conversation_callback( new_turn_context, ) -> Tuple[ConversationReference, str]: -======= - async def _create_conversation_callback(new_turn_context) -> tuple: ->>>>>>> 9f1901c313c763fb6ab6dbc884625d6fceac83f0 new_activity_id = new_turn_context.activity.id conversation_reference = TurnContext.get_conversation_reference( new_turn_context.activity From d27b89c0202259ac0137ed11795484703d671955 Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Wed, 12 Feb 2020 17:02:33 -0800 Subject: [PATCH 7/8] removing merge conflict leftover --- .../botbuilder-core/botbuilder/core/teams/teams_info.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 6521c00f7..0395b4945 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -1,13 +1,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -<<<<<<< HEAD from typing import List, Tuple from botbuilder.schema import ConversationParameters, ConversationReference -======= -from typing import List -from botbuilder.schema import ConversationParameters ->>>>>>> 9f1901c313c763fb6ab6dbc884625d6fceac83f0 from botbuilder.core.turn_context import Activity, TurnContext from botbuilder.schema.teams import ( ChannelInfo, From b9317ac2d43e78f22d3f77e8122adfe163562f49 Mon Sep 17 00:00:00 2001 From: virtual-josh Date: Wed, 12 Feb 2020 17:06:05 -0800 Subject: [PATCH 8/8] black --- .../botbuilder/adapters/slack/slack_payload.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py index a058af442..0be8e3666 100644 --- a/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py +++ b/libraries/botbuilder-adapters-slack/botbuilder/adapters/slack/slack_payload.py @@ -7,6 +7,7 @@ from slack.web.classes.actions import Action + class SlackPayload: def __init__(self, **kwargs): self.type: [str] = kwargs.get("type")