8000 get member updates by clearab · Pull Request #839 · microsoft/botbuilder-python · GitHub
[go: up one dir, main page]

Skip to content

get member updates #839

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 15 commits into from
Mar 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

8000
Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 49 additions & 19 deletions libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
from botbuilder.schema import (
Activity,
ActivityTypes,
ChannelAccount,
ConversationAccount,
ConversationParameters,
ConversationReference,
Expand Down Expand Up @@ -746,30 +747,59 @@ async def get_conversation_members(self, context: TurnContext):
:param context: The context object for the turn
:type context: :class:`botbuilder.core.TurnContext`

:raises: An exception error
:raises: TypeError if missing service_url or conversation.id

:return: List of members of the current conversation
"""
try:
if not context.activity.service_url:
raise TypeError(
"BotFrameworkAdapter.get_conversation_members(): missing service_url"
)
if (
not context.activity.conversation
or not context.activity.conversation.id
):
raise TypeError(
"BotFrameworkAdapter.get_conversation_members(): missing conversation or "
"conversation.id"
)

client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
return await client.conversations.get_conversation_members(
context.activity.conversation.id
if not context.activity.service_url:
raise TypeError(
"BotFrameworkAdapter.get_conversation_members(): missing service_url"
)
except Exception as error:
raise error
if not context.activity.conversation or not context.activity.conversation.id:
raise TypeError(
"BotFrameworkAdapter.get_conversation_members(): missing conversation or "
"conversation.id"
)

client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
return await client.conversations.get_conversation_members(
context.activity.conversation.id
)

async def get_conversation_member(
self, context: TurnContext, member_id: str
) -> ChannelAccount:
"""
Retrieve a member of a current conversation.

:param context: The context object for the turn
:type context: :class:`botbuilder.core.TurnContext`
:param member_id: The member Id
:type member_id: str

:raises: A TypeError if missing member_id, service_url, or conversation.id

:return: A member of the current conversation
"""
if not context.activity.service_url:
raise TypeError(
"BotFrameworkAdapter.get_conversation_member(): missing service_url"
)
if not context.activity.conversation or not context.activity.conversation.id:
raise TypeError(
"BotFrameworkAdapter.get_conversation_member(): missing conversation or "
"conversation.id"
)
if not member_id:
raise TypeError(
"BotFrameworkAdapter.get_conversation_member(): missing memberId"
)

client = context.turn_state[BotAdapter.BOT_CONNECTOR_CLIENT_KEY]
return await client.conversations.get_conversation_member(
context.activity.conversation.id, member_id
)

async def get_conversations(
self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,14 @@ async def handle_get_conversation_members(
claims_identity = await self._authenticate(auth_header)
return await self.on_get_conversation_members(claims_identity, conversation_id)

async def handle_get_conversation_member(
self, auth_header, conversation_id, member_id
) -> ChannelAccount:
claims_identity = await self._authenticate(auth_header)
return await self.on_get_conversation_member(
claims_identity, conversation_id, member_id
)

async def handle_get_conversation_paged_members(
self,
auth_header,
Expand Down Expand Up @@ -343,6 +351,24 @@ async def on_get_conversation_members(
"""
raise BotActionNotImplementedError()

async def on_get_conversation_member(
self, claims_identity: ClaimsIdentity, conversation_id: str, member_id: str,
) -> ChannelAccount:
"""
get_conversation_member() API for Skill.

Enumerate the members of a conversation.

This REST API takes a ConversationId and returns a list of ChannelAccount
objects representing the members of the conversation.

:param claims_identity:
:param conversation_id:
:param member_id:
:return:
"""
raise BotActionNotImplementedError()

async def on_get_conversation_paged_members(
self,
claims_identity: ClaimsIdentity,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,15 @@ async def get_conversation_members(request: Request):

return get_serialized_response(result)

@routes.get(base_url + "/v3/conversations/{conversation_id}/members/{member_id}")
async def get_conversation_member(request: Request):
result = await handler.handle_get_conversation_member(
request.headers.get("Authorization"),
request.match_info["conversation_id", "member_id"],
)

return get_serialized_response(result)

@routes.get(base_url + "/v3/conversations/{conversation_id}/pagedmembers")
async def get_conversation_paged_members(request: Request):
# TODO: continuation token? page size?
Expand Down
119 changes: 118 additions & 1 deletion libraries/botbuilder-core/botbuilder/core/teams/teams_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
TeamDetails,
TeamsChannelData,
TeamsChannelAccount,
TeamsPagedMembersResult,
)
from botframework.connector.aio import ConnectorClient
from botframework.connector.teams.teams_connector_client import TeamsConnectorClient
Expand Down Expand Up @@ -79,7 +80,9 @@ async def get_team_channels(
return teams_connector.teams.get_teams_channels(team_id).conversations

@staticmethod
async def get_team_members(turn_context: TurnContext, team_id: str = ""):
async def get_team_members(
turn_context: TurnContext, team_id: str = ""
) -> List[TeamsChannelAccount]:
if not team_id:
team_id = TeamsInfo.get_team_id(turn_context)

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

return await TeamsInfo.get_team_members(turn_context, team_id)

@staticmethod
async def get_paged_team_members(
turn_context: TurnContext,
team_id: str = "",
continuation_token: str = None,
page_size: int = None,
) -> List[TeamsPagedMembersResult]:
if not team_id:
team_id = TeamsInfo.get_team_id(turn_context)

if not team_id:
raise TypeError(
"TeamsInfo.get_team_members: method is only valid within the scope of MS Teams Team."
)

connector_client = await TeamsInfo._get_connector_client(turn_context)
return await TeamsInfo._get_paged_members(
connector_client,
turn_context.activity.conversation.id,
continuation_token,
page_size,
)

@staticmethod
async def get_paged_members(
turn_context: TurnContext, continuation_token: str = None, page_size: int = None
) -> List[TeamsPagedMembersResult]:

team_id = TeamsInfo.get_team_id(turn_context)
if not team_id:
conversation_id = turn_context.activity.conversation.id
connector_client = await TeamsInfo._get_connector_client(turn_context)
return await TeamsInfo._get_paged_members(
connector_client, conversation_id, continuation_token, page_size
)

return await TeamsInfo.get_paged_team_members(turn_context, team_id, page_size)

@staticmethod
async def get_team_member(
turn_context: TurnContext, team_id: str = "", member_id: str = None
) -> TeamsChannelAccount:
if not team_id:
team_id = TeamsInfo.get_team_id(turn_context)

if not team_id:
raise TypeError(
"TeamsInfo.get_team_member: method is only valid within the scope of MS Teams Team."
)

if not member_id:
raise TypeError("TeamsInfo.get_team_member: method requires a member_id")

connector_client = await TeamsInfo._get_connector_client(turn_context)
return await TeamsInfo._get_member(
connector_client, turn_context.activity.conversation.id, member_id
)

@staticmethod
async def get_member(
turn_context: TurnContext, member_id: str
) -> TeamsChannelAccount:
team_id = TeamsInfo.get_team_id(turn_context)
if not team_id:
conversation_id = turn_context.activity.conversation.id
connector_client = await TeamsInfo._get_connector_client(turn_context)
return await TeamsInfo._get_member(
connector_client, conversation_id, member_id
)

return await TeamsInfo.get_team_member(turn_context, team_id, member_id)

@staticmethod
async def get_teams_connector_client(
turn_context: TurnContext,
Expand Down Expand Up @@ -151,3 +226,45 @@ async def _get_members(
)

return teams_members

@staticmethod
async def _get_paged_members(
connector_client: ConnectorClient,
conversation_id: str,
continuation_token: str = None,
page_size: int = None,
) -> List[TeamsPagedMembersResult]:
if connector_client is None:
raise TypeError(
"TeamsInfo._get_paged_members.connector_client: cannot be None."
)

if not conversation_id:
raise TypeError(
"TeamsInfo._get_paged_members.conversation_id: cannot be empty."
)

return await connector_client.conversations.get_teams_conversation_paged_members(
conversation_id, continuation_token, page_size
)

@staticmethod
async def _get_member(
connector_client: ConnectorClient, conversation_id: str, member_id: str
) -> TeamsChannelAccount:
if connector_client is None:
raise TypeError("TeamsInfo._get_member.connector_client: cannot be None.")

if not conversation_id:
raise TypeError("TeamsInfo._get_member.conversation_id: cannot be empty.")

if not member_id:
raise TypeError("TeamsInfo._get_member.member_id: cannot be empty.")

member: TeamsChannelAccount = await connector_client.conversations.get_conversation_member(
conversation_id, member_id
)

return TeamsChannelAccount().deserialize(
dict(member.serialize(), **member.additional_properties)
)
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
from ._models_py3 import TeamInfo
from ._models_py3 import TeamsChannelAccount
from ._models_py3 import TeamsChannelData
from ._models_py3 import TeamsPagedMembersResult
from ._models_py3 import TenantInfo
except (SyntaxError, ImportError):
from ._models import AppBasedLinkQuery
Expand Down Expand Up @@ -122,6 +123,7 @@
from ._models import TeamInfo
from ._models import TeamsChannelAccount
from ._models import TeamsChannelData
from ._models import TeamsPagedMembersResult
from ._models import TenantInfo

__all__ = [
Expand Down Expand Up @@ -180,5 +182,6 @@
"TeamInfo",
"TeamsChannelAccount",
"TeamsChannelData",
"TeamsPagedMembersResult",
"TenantInfo",
]
22 changes: 21 additions & 1 deletion libraries/botbuilder-schema/botbuilder/schema/teams/_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
# --------------------------------------------------------------------------

from msrest.serialization import Model
from botbuilder.schema import Activity
from botbuilder.schema import Activity, PagedMembersResult, TeamsChannelAccount


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


class TeamsPagedMembersResult(PagedMembersResult):
"""Page of members for Teams.

:param continuation_token: Paging token
:type continuation_token: str
:param members: The Teams Channel Accounts.
:type members: list[~botframework.connector.models.TeamsChannelAccount]
"""

_attribute_map = {
"continuation_token": {"key": "continuationToken", "type": "str"},
"members": {"key": "members", "type": "[TeamsChannelAccount]"},
}

def __init__(self, **kwargs):
super(TeamsPagedMembersResult, self).__init__(**kwargs)
self.continuation_token = kwargs.get("continuation_token", None)
self.members = kwargs.get("members", None)


class TeamsChannelData(Model):
"""Channel data specific to messages received in Microsoft Teams.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
# --------------------------------------------------------------------------

from msrest.serialization import Model
from botbuilder.schema import Activity, Attachment, ChannelAccount
from botbuilder.schema import Activity, Attachment, ChannelAccount, PagedMembersResult


class TaskModuleRequest(Model):
Expand Down Expand Up @@ -1834,6 +1834,34 @@ def __init__(
self.user_principal_name = user_principal_name


class TeamsPagedMembersResult(PagedMembersResult):
"""Page of members for Teams.

:param continuation_token: Paging token
:type continuation_token: str
:param members: The Teams Channel Accounts.
:type members: list[~botframework.connector.models.TeamsChannelAccount]
"""

_attribute_map = {
"continuation_token": {"key": "continuationToken", "type": "str"},
"members": {"key": "members", "type": "[TeamsChannelAccount]"},
}

def __init__(
self,
*,
continuation_token: str = None,
members: [TeamsChannelAccount] = None,
**kwargs
) -> None:
super(TeamsPagedMembersResult, self).__init__(
continuation_token=continuation_token, members=members, **kwargs
)
self.continuation_token = continuation_token
self.members = members


class TeamsChannelData(Model):
"""Channel data specific to messages received in Microsoft Teams.

Expand Down
Loading
0