8000 adding teams activity handler, team info, and teams channel account c… · yosshy/botbuilder-python@140372d · GitHub
[go: up one dir, main page]

Skip to content

Commit 140372d

Browse files
committed
adding teams activity handler, team info, and teams channel account classes
1 parent 1b60528 commit 140372d

File tree

3 files changed

+292
-0
lines changed

3 files changed

+292
-0
lines changed
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from typing import List
5+
6+
from botbuilder.schema import ActivityTypes, ChannelAccount, MessageReaction
7+
from botbuilder.schema.teams import TeamInfo
8+
from .turn_context import TurnContext
9+
from activity_handler import ActivityHandler
10+
from botframework.connector import Channels
11+
from http import HTTPStatus
12+
from botbuilder.core import InvokeResponse
13+
14+
15+
class TeamsActivityHandler(ActivityHandler):
16+
async def on_turn(self, turn_context: TurnContext):
17+
if turn_context is None:
18+
raise TypeError("ActivityHandler.on_turn(): turn_context cannot be None.")
19+
20+
if hasattr(turn_context, "activity") and turn_context.activity is None:
21+
raise TypeError(
22+
"ActivityHandler.on_turn(): turn_context must have a non-None activity."
23+
)
24+
25+
if (
26+
hasattr(turn_context.activity, "type")
27+
and turn_context.activity.type is None
28+
):
29+
raise TypeError(
30+
"ActivityHandler.on_turn(): turn_context activity must have a non-None type."
31+
)
32+
33+
if turn_context.activity.type == ActivityTypes.Invoke:
34+
pass
35+
else:
36+
await super(on_turn(turn_context))
37+
38+
return
39+
40+
async def on_invoke_activity_async(self, turn_context: TurnContext):
41+
try:
42+
if turn_context.activity.name == None and turn_context.activity.channel_id == Channels.ms_teams:
43+
return await on_teams_card_action_invoke(turn_context)
44+
else:
45+
if turn_context.activity.name == "signin/verifyState":
46+
await on_teams_signin_verify_state_async(turn_context)
47+
return _create_invoke_response()
48+
elif turn_context.activity.name == "fileConsent/invoke":
49+
await on_teams_file_concent_async(turn_context, turn_context.activity.value)
50+
return _create_invoke_response()
51+
elif turn_context.activity.name == "actionableMessage/executeAction":
52+
await on_teams_o365_connector_card_action_async(turn_context, turn_context.activity.value)
53+
return _create_invoke_response()
54+
elif turn_context.activity.name == "composeExtension/queryLink":
55+
return createInvokeResponse(await on_teams_app_based_link_query_async(turn_context, turn_context.activity.value))
56+
elif turn_context.activity.name == "composeExtension/query":
57+
return _create_invoke_response(await on_teams_messaging_extension_query_async(turn_context, turn_context.activity.value))
58+
elif turn_context.activity.name == "composeExtension/selectItem":
59+
return _create_invoke_response(await on_teams_messaging_extension_select_item_async(turn_context, turn_context.activity.value))
60+
elif turn_context.activity.name == "composeExtension/submitAction":
61+
return _create_invoke_response(await on_teams_messaging_extension_submit_action_dispatch_async(turn_context, turn_context.activity.value))
62+
elif turn_context.activity.name == "composeExtension/fetchTask":
63+
return _create_invoke_response(await on_teams_messaging_extension_fetch_task_async(turn_context, turn_context.activity.value))
64+
elif turn_context.activity.name == "composeExtension/querySettingUrl":
65+
return _create_invoke_response(await on_teams_messaging_extension_configuration_query_settings_url_async(turn_context, turn_context.activity.value))
66+
elif turn_context.acitivity.name == "composseExtension/settings":
67+
await on_teams_messaging_extension_configuration_settings_async(turn_context, turn_context.activity.value)
68+
return _create_invoke_response()
69+
elif turn_context.acitivity.name == "composeExtension/onCardButtonClicked":
70+
await on_teams_messaging_extension_card_button_clicked_async(turn_context, turn_context.acitivity.value)
71+
return _create_invoke_response()
72+
elif turn_context.acitivity.name == "task/fetch":
73+
return _create_invoke_response(await on_teams_task_module_fetch_async(turn_context, turn_context.activity.value))
74+
elif turn_context.acitivity.name == "task/submit":
75+
return _create_invoke_response(await on_teams_task_module_submit_async(turn_context, turn_context.activity.value))
76+
else:
77+
raise invoke_response_exception(HTTPStatus.NOT_IMPLEMENTED)
78+
except InvokeResponseException as e:
79+
return e.CreateInvokeResponse()
80+
81+
async def on_teams_card_action_invoke_async(self, turn_context: TurnContext):
82+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
83+
84+
async def on_teams_singin_verify_state_async(self, turn_context: TurnContext):
85+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
86+
87+
async def on_teams_file_concent_async(self, turn_context: TurnContext, file_consent_card_response: FileConcentCardResponse):
88+
if file_consent_card_response.action == "accept":
89+
await file_consent_card_response(turn_context, file_consent_card_response)
90+
return _create_invoke_response()
91+
elif file_consent_card_response.action == "decline":
92+
await on_teams_file_consent_decline_async(turn_context, file_consent_card_response)
93+
return _create_invoke_response()
94+
else:
95+
raise _InvokeResponseException(HTTPStatus.BAD_REQUEST, ("%s is not a supported action" % file_consent_card_response))
96+
97+
async def on_teams_file_consent_accept_async(self, turn_context: TurnContext, file_consent_card_response: FileConsentCardResponse):
98+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLMENENTED)
99+
100+
async def on_teams_file_consent_decline_async(self, turn_context: TurnContext, file_consent_card_response: FileConsentCardResponse):
101+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLMENENTED)
102+
103+
async def on_teams_messaging_extension_query_async(self, turn_context: TurnContext, query: MessagingExtensionQuery):
104+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLMENENTED)
105+
106+
async def on_teams_o365_connector_card_action_async(self, turn_context: TurnContext, query: O365ConnectorCardActionQuery):
107+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
108+
109+
async def on_teams_app_based_link_query_async(self, turn_context: TurnContext, query: AppBasedLinkQuery):
110+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
111+
112+
async def on_teams_messaging_extension_select_item_async(self, turn_context: TurnContext, query: JObject):
113+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
114+
115+
async def on_teams_messaging_extension_fetch_task_async(self, turn_context: TurnContext, action: MessagingExtensionAction):
116+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
117+
118+
async def on_teams_messaging_extension_submit_action_dispatch_async(self, turn_context: TurnContext, action, MessagingExtensionAction):
119+
if action.BotMessagePreviewAction != None:
120+
if action.BotMessagePreviewAction == "edit":
121+
return await on_teams_messaging_extension_bot_message_preview_edit_async(turn_context, action)
122+
elif action.BotMessagePreview == "send":
123+
return await on_teams_messaging_extension_bot_message_preview_send_async(turn_context, action)
124+
else:
125+
raise _InvokeResponseException(HTTPStatus.BAD_REQUEST,
126+
("%s is not a supported BotMessagePreviewAction" % action.BotMessagePreviewAction))
127+
else:
128+
return await on_teams_messaging_extension_submit_action_async(turn_context, action)
129+
130+
async def on_teams_messaging_extension_submit_action_async(self, turn_context: TurnContext, action: MEssagingExtensionAction):
131+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
132+
133+
async def on_teams_messaging_extension_bot_message_preview_edit_async(self, turn_context: TurnContext, action: MessagingExtensionAction):
134+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
135+
136+
async def on_teams_messaging_extension_bot_message_preview_send_async(self, turn_context: TurnContext, action: MessagingExtensionAction):
137+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
138+
139+
async def on_teams_messaging_extension_configuration_query_setting_url_async(self, turn_context: TurnContext, query: MessagingExtensionQuery):
140+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
141+
142+
async def on_teams_messaging_extension_configuration_setting_async(self, turn_context: TurnContext, settings: JObject):
143+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
144+
145+
async def on_teams_messaging_extension_card_button_clicked_async(self, turn_context: TurnContext, cardData: JObject):
146+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
147+
148+
async def on_teams_task_module_fetch_async(self, turn_context: TurnContext, taskModuleRequest: TaskModuleRequest):
149+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
150+
151+
async def on_teams_task_module_submit_async(self, turn_context: TurnContext, task_module_request: TaskModuleRequest):
152+
raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
153+
154+
async def on_conversation_update_activity_async(self, turn_context: TurnContext):
155+
if turn_context.activity.channel_id == Channels.Msteams:
156+
channel_data = turn_context.activity.get_channel_data()
157+
if turn_context.activity.members_added != None:
158+
return on_teams_members_added_dispatch_async(turn_context.activity.members_added, channel_data.team)
159+
160+
if turn_context.activity.members_added != None:
161+
return on_teams_members_removed_dispatched_async(turn_context.acitivity.members_removed, channel_data.team)
162+
163+
if channel_data != None:
164+
if channel_data.event_type == "channelCreated":
165+
return on_teams_channel_created_async(channel_data.channel, channel_data.team, turn_context)
166+
elif channel_data.event_type == "channelDeleted":
167+
return on_teams_channel_deleted_async(channel_data.channel, channel_data.team, turn_context)
168+
elif channel_data.event_type == "channelRenamed":
169+
return on_teams_channel_renamed(channel_data.channel, channel_data.team, turn_context)
170+
elif channel_data.event_type == "teamRenamed":
171+
return self.on_teams_team_renamed_async(channel_data.team, turn_context)
172+
else:
173+
return super().on_conversation_update_activity(turn_context)
174+
175+
return super().on_conversation_update_activity(turn_context)
176+
177+
async def on_teams_member_added_dispatch(self, members_added: List, team_info: TeamInfo, turn_context: TurnContext):
178+
team_members = {}
179+
team_members_added = []
180+
for member_added in members_added:
181+
if member_added.properties != None:
182+
team_members_added.append(TeamsChannelAccount(member_added))
183+
else:
184+
if team_members == {}:
185+
result = await TeamInfo.get_members_async(turn_context)
186+
team_members = { i.id : i for i in result }
187+
188+
if member_added.id in team_members:
189+
team_members_added.append(member_added)
190+
else:
191+
newTeamsChannelAccount = TeamsChannelAccount(
192+
id=member_added.id,
193+
name = member_added.name,
194+
aad_object_id = member_added.aad_object_id,
195+
role = member_added.role
196+
)
197+
team_members_added.append(newTeamsChannelAccount)
198+
199+
await self.on_teams_members_added_async(teams_members_added, team_info, turn_context)
200+
201+
async def on_teams_members_removed_dispatch_async(self, membersRemoved: List, teamInfo: TeamInfo, turn_context: TurnContext):
202+
teams_members_removed = []
203+
for member_removed in membersRemoved:
204+
teams_members_removed.append(TeamsChannelAccount(member_removed))
205+
206+
return self.on_teams_members_removed_async(teams_members_removed, team_info, turn_context)
207+
208+
async def on_teams_members_added_async(self, teams_members_added: List, team_info: TeamInfo, turn_context: TurnContext):
209+
members_added = [ ChannelAccount(i) for i in teams_members_added ]
210+
return super().on_members_added_activity(members_added, turn_context)
211+
212+
async def on_teams_members_removed_async(self, teams_members_removed: List, team_info: TeamInfo, turn_context: TurnContext):
213+
members_removed = [ ChannelAccount(i) for i in teams_members_removed ]
214+
return super().on_members_removed_activity(members_removed, turn_context)
215+
216+
async def on_teams_channel_created_async(self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context, TurnContext):
217+
return #Task.CompleteTask
218+
219+
async def on_teams_channel_deleted_async(self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext):
220+
return #Task.CompleteTask
221+
222+
async def on_teams_channel_renamed_async(self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext):
223+
return #Task.CompleteTask
224+
225+
async def on_teams_team_reanamed_async(self, teamInfo: TeamInfo, turn_context: TurnContext):
226+
return #Task.CompleteTask
227+
228+
@staticmethod
229+
def _create_invoke_response(body: object = None) -> InvokeResponse:
230+
return InvokeResponse(status = int(HTTPStatus.OK), body = body)
231+
232+
class _InvokeResponseException(Exception):
233+
def __init__(self, status_code: HTTPStatus, body: object = None):
234+
self._statusCode = status_code
235+
self._body = body
236+
237+
def create_invoke_response() -> InvokeResponse:
238+
return InvokeResponse(status= int(self._statusCode), body = self._body)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License. See License.txt in the project root for
3+
# license information.
4+
#
5+
# Code generated by Microsoft (R) AutoRest Code Generator.
6+
# Changes may cause incorrect behavior and will be lost if the code is
7+
# regenerated.
8+
9+
class TeamInfo:
10+
def __init__(self, id: string = "", name: string = ""):
11+
self.id = id
12+
self.name = name
13+
14+
@property
15+
def id():
16+
return self.id
17+
18+
@property
19+
def name():
20+
return self.name
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License. See License.txt in the project root for
3+
# license information.
4+
#
5+
# Code generated by Microsoft (R) AutoRest Code Generator.
6+
# Changes may cause incorrect behavior and will be lost if the code is
7+
# regenerated.
8+
9+
from botbuilder.schema import ChannelAccount
10+
11+
class TeamsChannelAccount(ChanelAccount):
12+
def __init__(self, id: string = "", name: string = "", given_name: string = "", surname: string = "", email: string = "", user_principal_name: string = ""):
13+
self.id = id
14+
self.name = name
15+
self.given_name = given_name
16+
self.surname = surname
17+
self.email = email
18+
self.user_principal_name = user_principal_name
19+
20+
@property
21+
def given_name():
22+
return self.given_name
23+
24+
@property
25+
def surname():
26+
return self.surname
27+
28+
@property
29+
def email():
30+
return self.email
31+
32+
@property
33+
def user_principal_name():
34+
return self.user_principal_name

0 commit comments

Comments
 (0)
0