From 2b87a29e90bc0a743e1bac3b67d410f74c858ba3 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Thu, 30 Apr 2020 12:01:34 -0700 Subject: [PATCH 1/3] Update TeamsMembersAdded to use TeamsInfo.getMember --- .../builder/teams/TeamsActivityHandler.java | 58 ++++++++++--------- .../bot/connector/rest/RestConversations.java | 6 +- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java index fafdb9590..1b7711005 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java @@ -9,7 +9,10 @@ import com.microsoft.bot.builder.ActivityHandler; import com.microsoft.bot.builder.InvokeResponse; import com.microsoft.bot.builder.TurnContext; +import com.microsoft.bot.connector.rest.ErrorResponseException; import com.microsoft.bot.schema.ChannelAccount; +import com.microsoft.bot.schema.Error; +import com.microsoft.bot.schema.ErrorResponse; import com.microsoft.bot.schema.ResultPair; import com.microsoft.bot.schema.Serialization; import com.microsoft.bot.schema.teams.AppBasedLinkQuery; @@ -30,10 +33,8 @@ import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; -import java.util.stream.Collectors; /** * A Teams implementation of the Bot interface intended for further subclassing. @@ -439,11 +440,11 @@ protected CompletableFuture onTeamsMembersAddedDispatch( ObjectMapper mapper = new ObjectMapper(); mapper.findAndRegisterModules(); - Map teamMembers = null; - List teamsMembersAdded = new ArrayList<>(); for (ChannelAccount memberAdded : membersAdded) { if (!memberAdded.getProperties().isEmpty()) { + // when the ChannelAccount object is fully a TeamsChannelAccount + // (when Teams changes the service to return the full details) try { JsonNode node = mapper.valueToTree(memberAdded); teamsMembersAdded.add(mapper.treeToValue(node, TeamsChannelAccount.class)); @@ -451,32 +452,35 @@ protected CompletableFuture onTeamsMembersAddedDispatch( return withException(jpe); } } else { - // this code path is intended to be temporary and should be removed in 4.7/4.8 - // or whenever Teams is updated - - // we have a simple ChannelAccount so will try to flesh out the details using - // the getMembers call - if (teamMembers == null) { - List result = TeamsInfo.getMembers(turnContext).join(); - teamMembers = result.stream().collect( - Collectors.toMap(ChannelAccount::getId, item -> item) - ); + TeamsChannelAccount teamsChannelAccount = null; + try { + teamsChannelAccount = TeamsInfo.getMember(turnContext, memberAdded.getId()).join(); + } catch (CompletionException ex) { + try { + throw ex.getCause(); + } catch (ErrorResponseException erx) { + ErrorResponse response = erx.body(); + if (response != null) { + Error error = response.getError(); + if (error != null && !error.getCode().equals("ConversationNotFound")) { + throw erx; + } + } + } catch (Throwable impossible) { + throw new AssertionError(impossible); + } } - if (teamMembers.containsKey(memberAdded.getId())) { - teamsMembersAdded.add(teamMembers.get(memberAdded.getId())); - } else { - // unable to find the member added in ConversationUpdate Activity in the - // response from - // the getMembers call - TeamsChannelAccount newTeamsChannelAccount = new TeamsChannelAccount(); - newTeamsChannelAccount.setId(memberAdded.getId()); - newTeamsChannelAccount.setName(memberAdded.getName()); - newTeamsChannelAccount.setAadObjectId(memberAdded.getAadObjectId()); - newTeamsChannelAccount.setRole(memberAdded.getRole()); - - teamsMembersAdded.add(newTeamsChannelAccount); + if (teamsChannelAccount == null) { + // unable to find the member added in ConversationUpdate Activity in the response from the + // getMember call + teamsChannelAccount = new TeamsChannelAccount(); + teamsChannelAccount.setId(memberAdded.getId()); + teamsChannelAccount.setName(memberAdded.getName()); + teamsChannelAccount.setAadObjectId(memberAdded.getAadObjectId()); + teamsChannelAccount.setRole(memberAdded.getRole()); } + teamsMembersAdded.add(teamsChannelAccount); } } diff --git a/libraries/bot-connector/src/main/java/com/microsoft/bot/connector/rest/RestConversations.java b/libraries/bot-connector/src/main/java/com/microsoft/bot/connector/rest/RestConversations.java index 4d2d92aab..44a18a432 100644 --- a/libraries/bot-connector/src/main/java/com/microsoft/bot/connector/rest/RestConversations.java +++ b/libraries/bot-connector/src/main/java/com/microsoft/bot/connector/rest/RestConversations.java @@ -6,6 +6,7 @@ package com.microsoft.bot.connector.rest; +import com.microsoft.bot.azure.AzureResponseBuilder; import com.microsoft.bot.schema.Activity; import com.microsoft.bot.schema.AttachmentData; import com.microsoft.bot.schema.ChannelAccount; @@ -606,12 +607,13 @@ private ServiceResponse getConversationMemberDelegate( Response response ) throws ErrorResponseException, IOException, IllegalArgumentException { - return client.restClient() + return ((AzureResponseBuilder) client.restClient() .responseBuilderFactory() .newInstance(client.serializerAdapter()) .register(HttpURLConnection.HTTP_OK, new TypeToken() { }.getType()) - .registerError(ErrorResponseException.class) + .registerError(ErrorResponseException.class)) + .withThrowOnGet404(true) .build(response); } From 178d2662028ea7ac79bfbcf62fbd54074cdc8a16 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Thu, 30 Apr 2020 12:02:11 -0700 Subject: [PATCH 2/3] update TeamsConversationBot --- .../TeamsConversationBot.java | 67 +++++++++---------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/samples/57.teams-conversation-bot/src/main/java/com/microsoft/bot/sample/teamsconversation/TeamsConversationBot.java b/samples/57.teams-conversation-bot/src/main/java/com/microsoft/bot/sample/teamsconversation/TeamsConversationBot.java index cf5ffee0a..fa507b73a 100644 --- a/samples/57.teams-conversation-bot/src/main/java/com/microsoft/bot/sample/teamsconversation/TeamsConversationBot.java +++ b/samples/57.teams-conversation-bot/src/main/java/com/microsoft/bot/sample/teamsconversation/TeamsConversationBot.java @@ -78,20 +78,7 @@ protected CompletableFuture onMessageActivity(TurnContext turnContext) { { setTitle("Welcome Card"); setText("Click the buttons below to update this card"); - setButtons(Arrays.asList(new CardAction() { - { - setType(ActionTypes.MESSAGE_BACK); - setTitle("Update Card"); - setText("UpdateCardAction"); - setValue(value); - } - }, new CardAction() { - { - setType(ActionTypes.MESSAGE_BACK); - setTitle("Message All Members"); - setText("MessageAllMembers"); - } - })); + setButtons(getHeroCardButtons(value)); } }; @@ -189,26 +176,7 @@ private CompletableFuture updateCardActivity(TurnContext turnContext) { { setTitle("Welcome Card"); setText("Update count - " + data.get("count")); - setButtons(Arrays.asList(new CardAction() { - { - setType(ActionTypes.MESSAGE_BACK); - setTitle("Update Card"); - setText("UpdateCardAction"); - setValue(data); - } - }, new CardAction() { - { - setType(ActionTypes.MESSAGE_BACK); - setTitle("Message All Members"); - setText("MessageAllMembers"); - } - }, new CardAction() { - { - setType(ActionTypes.MESSAGE_BACK); - setTitle("Delete card"); - setText("Delete"); - } - })); + setButtons(getHeroCardButtons(data)); } }; @@ -218,6 +186,35 @@ private CompletableFuture updateCardActivity(TurnContext turnContext) { return turnContext.updateActivity(updatedActivity).thenApply(resourceResponse -> null); } + private List getHeroCardButtons(Object value) { + return Arrays.asList(new CardAction() { + { + setType(ActionTypes.MESSAGE_BACK); + setTitle("Update Card"); + setText("UpdateCardAction"); + setValue(value); + } + }, new CardAction() { + { + setType(ActionTypes.MESSAGE_BACK); + setTitle("Message All Members"); + setText("MessageAllMembers"); + } + }, new CardAction() { + { + setType(ActionTypes.MESSAGE_BACK); + setTitle("Delete card"); + setText("Delete"); + } + }, new CardAction() { + { + setType(ActionTypes.MESSAGE_BACK); + setTitle("Who am I?"); + setText("MentionMe"); + } + }); + } + private CompletableFuture mentionActivity(TurnContext turnContext) { Mention mention = new Mention(); mention.setMentioned(turnContext.getActivity().getFrom()); @@ -225,7 +222,7 @@ private CompletableFuture mentionActivity(TurnContext turnContext) { "" + URLEncoder.encode(turnContext.getActivity().getFrom().getName()) + "" ); - Activity replyActivity = MessageFactory.text("Hello " + mention.getText() + ".'"); + Activity replyActivity = MessageFactory.text("Hello " + mention.getText() + "."); replyActivity.setMentions(Collections.singletonList(mention)); return turnContext.sendActivity(replyActivity).thenApply(resourceResponse -> null); From 00f8878c2419453e9e01fee23cc157ad2521e279 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Thu, 30 Apr 2020 12:34:57 -0700 Subject: [PATCH 3/3] address some Tracy's feedback --- .../bot/builder/teams/TeamsActivityHandler.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java index 1b7711005..367ac58ed 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java @@ -456,18 +456,17 @@ protected CompletableFuture onTeamsMembersAddedDispatch( try { teamsChannelAccount = TeamsInfo.getMember(turnContext, memberAdded.getId()).join(); } catch (CompletionException ex) { - try { - throw ex.getCause(); - } catch (ErrorResponseException erx) { - ErrorResponse response = erx.body(); + Throwable causeException = ex.getCause(); + if (causeException instanceof ErrorResponseException) { + ErrorResponse response = ((ErrorResponseException) causeException).body(); if (response != null) { Error error = response.getError(); if (error != null && !error.getCode().equals("ConversationNotFound")) { - throw erx; + throw ex; } } - } catch (Throwable impossible) { - throw new AssertionError(impossible); + } else { + throw ex; } }