8000 get member updates (#839) · itsmokha/botbuilder-python@cb7f7af · GitHub
[go: up one dir, main page]

Skip to content

Commit cb7f7af

Browse files
clearabEric Dahlvangtracyboehrer
authored
get member updates (microsoft#839)
* get member updates * export the new type * typo of doom. * no really * I think this is all necessary? * fix missing metadata * single member working * good * remove unecessary try/catch, update comments Co-authored-by: Eric Dahlvang <v-eridah@microsoft.com> Co-authored-by: tracyboehrer <tracyboehrer@users.noreply.github.com>
1 parent ca0f971 commit cb7f7af

File tree

9 files changed

+577
-22
lines changed

9 files changed

+577
-22
lines changed

libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from botbuilder.schema import (
3535
Activity,
3636
ActivityTypes,
37+
ChannelAccount,
3738
ConversationAccount,
3839
ConversationParameters,
3940
ConversationReference,
@@ -746,30 +747,59 @@ async def get_conversation_members(self, context: TurnContext):
746747
:param context: The context object for the turn
747748
:type context: :class:`botbuilder.core.TurnContext`
748749
749-
:raises: An exception error
750+
:raises: TypeError if missing service_url or conversation.id
750751
751752
:return: List of members of the current conversation
752753
"""
753-
try:
754-
if not context.activity.service_url:
755-
raise TypeError(
756-
"BotFrameworkAdapter.get_conversation_members(): missing service_url"
757-
)
758-
if (
759-
not context.activity.conversation
760-
or not context.activity.conversation.id
761-
):
762-
raise TypeError(
763-
"BotFrameworkAdapter.get_conversation_members(): missing conversation or "
764-
"conversation.id"
765-
)
766754

767-
client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
768-
return await client.conversations.get_conversation_members(
769-
context.activity.conversation.id
755+
if not context.activity.service_url:
756+
raise TypeError(
757+
"BotFrameworkAdapter.get_conversation_members(): missing service_url"
770758
)
771-
except Exception as error:
772-
raise error
759+
if not context.activity.conversation or not context.activity.conversation.id:
760+
raise TypeError(
761+
"BotFrameworkAdapter.get_conversation_members(): missing conversation or "
762+
"conversation.id"
763+
)
764+
765+
client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
766+
return await client.conversations.get_conversation_members(
767+
context.activity.conversation.id
768+
)
769+
770+
async def get_conversation_member(
771+
self, context: TurnContext, member_id: str
772+
) -> ChannelAccount:
773+
"""
774+
Retrieve a member of a current conversation.
775+
776+
:param context: The context object for the turn
777+
:type context: :class:`botbuilder.core.TurnContext`
778+
:param member_id: The member Id
779+
:type member_id: str
780+
781+
:raises: A TypeError if missing member_id, service_url, or conversation.id
782+
783+
:return: A member of the current conversation
784+
"""
785+
if not context.activity.service_url:
786+
raise TypeError(
787+
"BotFrameworkAdapter.get_conversation_member(): missing service_url"
788+
)
789+
if not context.activity.conversation or not context.activity.conversation.id:
790+
raise TypeError(
791+
"BotFrameworkAdapter.get_conversation_member(): missing conversation or "
792+
"conversation.id"
793+
)
794+
if not member_id:
795+
raise TypeError(
796+
"BotFrameworkAdapter.get_conversation_member(): missing memberId"
797+
)
798+
799+
client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
800+
return await client.conversations.get_conversation_member(
801+
context.activity.conversation.id, member_id
802+
)
773803

774804
async def get_conversations(
775805
self,

libraries/botbuilder-core/botbuilder/core/channel_service_handler.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ async def handle_get_conversation_members(
104104
claims_identity = await self._authenticate(auth_header)
105105
return await self.on_get_conversation_members(claims_identity, conversation_id)
106106

107+
async def handle_get_conversation_member(
108+
self, auth_header, conversation_id, member_id
109+
) -> ChannelAccount:
110+
claims_identity = await self._authenticate(auth_header)
111+
return await self.on_get_conversation_member(
112+
claims_identity, conversation_id, member_id
113+
)
114+
107115
async def handle_get_conversation_paged_members(
108116
self,
109117
auth_header,
@@ -343,6 +351,24 @@ async def on_get_conversation_members(
343351
"""
344352
raise BotActionNotImplementedError()
345353

354+
async def on_get_conversation_member(
355+
self, claims_identity: ClaimsIdentity, conversation_id: str, member_id: str,
356+
) -> ChannelAccount:
357+
"""
358+
get_conversation_member() API for Skill.
359+
360+
Enumerate the members of a conversation.
361+
362+
This REST API takes a ConversationId and returns a list of ChannelAccount
363+
objects representing the members of the conversation.
364+
365+
:param claims_identity:
366+
:param conversation_id:
367+
:param member_id:
368+
:return:
369+
"""
370+
raise BotActionNotImplementedError()
371+
346372
async def on_get_conversation_paged_members(
347373
self,
348374
claims_identity: ClaimsIdentity,

libraries/botbuilder-core/botbuilder/core/integration/aiohttp_channel_service.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ async def get_conversation_members(request: Request):
132132

133133
return get_serialized_response(result)
134134

135+
@routes.get(base_url + "/v3/conversations/{conversation_id}/members/{member_id}")
136+
async def get_conversation_member(request: Request):
137+
result = await handler.handle_get_conversation_member(
138+
request.headers.get("Authorization"),
139+
request.match_info["conversation_id", "member_id"],
140+
)
141+
142+
return get_serialized_response(result)
143+
135144
@routes.get(base_url + "/v3/conversations/{conversation_id}/pagedmembers")
136145
async def get_conversation_paged_members(request: Request):
137146
# TODO: continuation token? page size?

libraries/botbuilder-core/botbuilder/core/teams/teams_info.py

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
TeamDetails,
1010
TeamsChannelData,
1111
TeamsChannelAccount,
12+
TeamsPagedMembersResult,
1213
)
1314
from botframework.connector.aio import ConnectorClient
1415
from botframework.connector.teams.teams_connector_client import TeamsConnectorClient
@@ -79,7 +80,9 @@ async def get_team_channels(
7980
return teams_connector.teams.get_teams_channels(team_id).conversations
8081

8182
@staticmethod
82-
async def get_team_members(turn_context: TurnContext, team_id: str = ""):
83+
async def get_team_members(
84+
turn_context: TurnContext, team_id: str = ""
85+
) -> List[TeamsChannelAccount]:
8386
if not team_id:
8487
team_id = TeamsInfo.get_team_id(turn_context)
8588

@@ -103,6 +106,78 @@ async def get_members(turn_context: TurnContext) -> List[TeamsChannelAccount]:
103106

104107
return await TeamsInfo.get_team_members(turn_context, team_id)
105108

109+
@staticmethod
110+
async def get_paged_team_members(
111+
turn_context: TurnContext,
112+
team_id: str = "",
113+
continuation_token: str = None,
114+
page_size: int = None,
115+
) -> List[TeamsPagedMembersResult]:
116+
if not team_id:
117+
team_id = TeamsInfo.get_team_id(turn_context)
118+
119+
if not team_id:
120+
raise TypeError(
121+
"TeamsInfo.get_team_members: method is only valid within the scope of MS Teams Team."
122+
)
123+
124+
connector_client = await TeamsInfo._get_connector_client(turn_context)
125+
return await TeamsInfo._get_paged_members(
126+
connector_client,
127+
turn_context.activity.conversation.id,
128+
continuation_token,
129+
page_size,
130+
)
131+
132+
@staticmethod
133+
async def get_paged_members(
134+
turn_context: TurnContext, continuation_token: str = None, page_size: int = None
135+
) -> List[TeamsPagedMembersResult]:
136+
137+
team_id = TeamsInfo.get_team_id(turn_context)
138+
if not team_id:
139+
conversation_id = turn_context.activity.conversation.id
140+
connector_client = await TeamsInfo._get_connector_client(turn_context)
141+
return await TeamsInfo._get_paged_members(
142+
connector_client, conversation_id, continuation_token, page_size
143+
)
144+
145+
return await TeamsInfo.get_paged_team_members(turn_context, team_id, page_size)
146+
147+
@staticmethod
148+
async def get_team_member(
149+
turn_context: TurnContext, team_id: str = "", member_id: str = None
150+
) -> TeamsChannelAccount:
151+
if not team_id:
152+
team_id = TeamsInfo.get_team_id(turn_context)
153+
154+
if not team_id:
155+
raise TypeError(
156+
"TeamsInfo.get_team_member: method is only valid within the scope of MS Teams Team."
157+
)
158+
159+
if not member_id:
160+
raise TypeError("TeamsInfo.get_team_member: method requires a member_id")
161+
162+
connector_client = await TeamsInfo._get_connector_client(turn_context)
163+
return await TeamsInfo._get_member(
164+
connector_client, turn_context.activity.conversation.id, member_id
165+
)
166+
167+
@staticmethod
168+
async def get_member(
169+
turn_context: TurnContext, member_id: str
170+
) -> TeamsChannelAccount:
171+
team_id = TeamsInfo.get_team_id(turn_context)
172+
if not team_id:
173+
conversation_id = turn_context.activity.conversation.id
174+
connector_client = await TeamsInfo._get_connector_client(turn_context)
175+
return await TeamsInfo._get_member(
176+
connector_client, conversation_id, member_id
177+
)
178+
179+
return await TeamsInfo.get_team_member(turn_context, team_id, member_id)
180+
106181
@staticmethod
107182
async def get_teams_connector_client(
108183
turn_context: TurnContext,
@@ -151,3 +226,45 @@ async def _get_members(
151226
)
152227

153228
return teams_members
229+
230+
@staticmethod
231+
async def _get_paged_members(
232+
connector_client: ConnectorClient,
233+
conversation_id: str,
234+
continuation_token: str = None,
235+
page_size: int = None,
236+
) -> List[TeamsPagedMembersResult]:
237+
if connector_client is None:
238+
raise TypeError(
239+
"TeamsInfo._get_paged_members.connector_client: cannot be None."
240+
)
241+
242+
if not conversation_id:
243+
raise TypeError(
244+
"TeamsInfo._get_paged_members.conversation_id: cannot be empty."
245+
)
246+
247+
return await connector_client.conversations.get_teams_conversation_paged_members(
248+
conversation_id, continuation_token, page_size
249+
)
250+
251+
@staticmethod
252+
async def _get_member(
253+
connector_client: ConnectorClient, conversation_id: str, member_id: str
254+
) -> TeamsChannelAccount:
255+
if connector_client is None:
256+
raise TypeError("TeamsInfo._get_member.connector_client: cannot be None.")
257+
258+
if not conversation_id:
259+
raise TypeError("TeamsInfo._get_member.conversation_id: cannot be empty.")
260+
261+
if not member_id:
262+
raise TypeError("TeamsInfo._get_member.member_id: cannot be empty.")
263+
264+
member: TeamsChannelAccount = await connector_client.conversations.get_conversation_member(
265+
conversation_id, member_id
266+
)
267+
268+
return TeamsChannelAccount().deserialize(
269+
dict(member.serialize(), **member.additional_properties)
270+
)

libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
from ._models_py3 import TeamInfo
6666
from ._models_py3 import TeamsChannelAccount
6767
from ._models_py3 import TeamsChannelData
68+
from ._models_py3 import TeamsPagedMembersResult
6869
from ._models_py3 import TenantInfo
6970
except (SyntaxError, ImportError):
7071
from ._models import AppBasedLinkQuery
@@ -122,6 +123,7 @@
122123
from ._models import TeamInfo
123124
from ._models import TeamsChannelAccount
124125
from ._models import TeamsChannelData
126+
from ._models import TeamsPagedMembersResult
125127
from ._models import TenantInfo
126128

127129
__all__ = [
@@ -180,5 +182,6 @@
180182
"TeamInfo",
181183
"TeamsChannelAccount",
182184
"TeamsChannelData",
185+
"TeamsPagedMembersResult",
183186
"TenantInfo",
184187
]

libraries/botbuilder-schema/botbuilder/schema/teams/_models.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# --------------------------------------------------------------------------
1111

1212
from msrest.serialization import Model
13-
from botbuilder.schema import Activity
13+
from botbuilder.schema import Activity, PagedMembersResult, TeamsChannelAccount
1414

1515

1616
class AppBasedLinkQuery(Model):
@@ -1557,6 +1557,26 @@ def __init__(self, **kwargs):
15571557
self.user_principal_name = kwargs.get("userPrincipalName", None)
15581558

15591559

1560+
class TeamsPagedMembersResult(PagedMembersResult):
1561+
"""Page of members for Teams.
1562+
1563+
:param continuation_token: Paging token
1564+
:type continuation_token: str
1565+
:param members: The Teams Channel Accounts.
1566+
:type members: list[~botframework.connector.models.TeamsChannelAccount]
1567+
"""
1568+
1569+
_attribute_map = {
1570+
"continuation_token": {"key": "continuationToken", "type": "str"},
1571+
"members": {"key": "members", "type": "[TeamsChannelAccount]"},
1572+
}
1573+
1574+
def __init__(self, **kwargs):
1575+
super(TeamsPagedMembersResult, self).__init__(**kwargs)
1576+
self.continuation_token = kwargs.get("continuation_token", None)
1577+
self.members = kwargs.get("members", None)
1578+
1579+
15601580
class TeamsChannelData(Model):
15611581
"""Channel data specific to messages received in Microsoft Teams.
15621582

libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# --------------------------------------------------------------------------
1111

1212
from msrest.serialization import Model
13-
from botbuilder.schema import Activity, Attachment, ChannelAccount
13+
from botbuilder.schema import Activity, Attachment, ChannelAccount, PagedMembersResult
1414

1515

1616
class TaskModuleRequest(Model):
@@ -1834,6 +1834,34 @@ def __init__(
18341834
self.user_principal_name = user_principal_name
18351835

18361836

1837+
class TeamsPagedMembersResult(PagedMembersResult):
1838+
"""Page of members for Teams.
1839+
1840+
:param continuation_token: Paging token
1841+
:type continuation_token: str
1842+
:param members: The Teams Channel Accounts.
1843+
:type members: list[~botframework.connector.models.TeamsChannelAccount]
1844+
"""
1845+
1846+
_attribute_map = {
1847+
"continuation_token": {"key": "continuationToken", "type": "str"},
1848+
"members": {"key": "members", "type": "[TeamsChannelAccount]"},
1849+
}
1850+
1851+
def __init__(
1852+
self,
1853+
*,
1854+
continuation_token: str = None,
1855+
members: [TeamsChannelAccount] = None,
1856+
**kwargs
1857+
) -> None:
1858+
super(TeamsPagedMembersResult, self).__init__(
1859+
continuation_token=continuation_token, members=members, **kwargs
1860+
)
1861+
self.continuation_token = continuation_token
1862+
self.members = members
1863+
1864+
18371865
class TeamsChannelData(Model):
18381866
"""Channel data specific to messages received in Microsoft Teams.
18391867

0 commit comments

Comments
 (0)
0