Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.

Commit e0c249b

Browse files
authored
Merge pull request #514 from microsoft/eric/updateTeamsMembersAdded
Update teams members added to use TeamsInfo.getMember()
2 parents 3138c7a + 00f8878 commit e0c249b

File tree

3 files changed

+66
-64
lines changed

3 files changed

+66
-64
lines changed

libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import com.microsoft.bot.builder.ActivityHandler;
1010
import com.microsoft.bot.builder.InvokeResponse;
1111
import com.microsoft.bot.builder.TurnContext;
12+
import com.microsoft.bot.connector.rest.ErrorResponseException;
1213
import com.microsoft.bot.schema.ChannelAccount;
14+
import com.microsoft.bot.schema.Error;
15+
import com.microsoft.bot.schema.ErrorResponse;
1316
import com.microsoft.bot.schema.ResultPair;
1417
import com.microsoft.bot.schema.Serialization;
1518
import com.microsoft.bot.schema.teams.AppBasedLinkQuery;
@@ -30,10 +33,8 @@
3033
import java.net.HttpURLConnection;
3134
import java.util.ArrayList;
3235
import java.util.List;
33-
import java.util.Map;
3436
import java.util.concurrent.CompletableFuture;
3537
import java.util.concurrent.CompletionException;
36-
import java.util.stream.Collectors;
3738

3839
/**
3940
* A Teams implementation of the Bot interface intended for further subclassing.
@@ -439,44 +440,46 @@ protected CompletableFuture<Void> onTeamsMembersAddedDispatch(
439440
ObjectMapper mapper = new ObjectMapper();
440441
mapper.findAndRegisterModules();
441442

442-
Map<String, TeamsChannelAccount> teamMembers = null;
443-
444443
List<TeamsChannelAccount> teamsMembersAdded = new ArrayList<>();
445444
for (ChannelAccount memberAdded : membersAdded) {
446445
if (!memberAdded.getProperties().isEmpty()) {
446+
// when the ChannelAccount object is fully a TeamsChannelAccount
447+
// (when Teams changes the service to return the full details)
447448
try {
448449
JsonNode node = mapper.valueToTree(memberAdded);
449450
teamsMembersAdded.add(mapper.treeToValue(node, TeamsChannelAccount.class));
450451
} catch (JsonProcessingException jpe) {
451452
return withException(jpe);
452453
}
453454
} else {
454-
// this code path is intended to be temporary and should be removed in 4.7/4.8
455-
// or whenever Teams is updated
456-
457-
// we have a simple ChannelAccount so will try to flesh out the details using
458-
// the getMembers call
459-
if (teamMembers == null) {
460-
List<TeamsChannelAccount> result = TeamsInfo.getMembers(turnContext).join();
461-
teamMembers = result.stream().collect(
462-
Collectors.toMap(ChannelAccount::getId, item -> item)
463-
);
455+
TeamsChannelAccount teamsChannelAccount = null;
456+
try {
457+
teamsChannelAccount = TeamsInfo.getMember(turnContext, memberAdded.getId()).join();
458+
} catch (CompletionException ex) {
459+
Throwable causeException = ex.getCause();
460+
if (causeException instanceof ErrorResponseException) {
461+
ErrorResponse response = ((ErrorResponseException) causeException).body();
462+
if (response != null) {
463+
Error error = response.getError();
464+
if (error != null && !error.getCode().equals("ConversationNotFound")) {
465+
throw ex;
466+
}
467+
}
468+
} else {
469+
throw ex;
470+
}
464471
}
465472

466-
if (teamMembers.containsKey(memberAdded.getId())) {
467-
teamsMembersAdded.add(teamMembers.get(memberAdded.getId()));
468-
} else {
469-
// unable to find the member added in ConversationUpdate Activity in the
470-
// response from
471-
// the getMembers call
472-
TeamsChannelAccount newTeamsChannelAccount = new TeamsChannelAccount();
473-
newTeamsChannelAccount.setId(memberAdded.getId());
474-
newTeamsChannelAccount.setName(memberAdded.getName());
475-
newTeamsChannelAccount.setAadObjectId(memberAdded.getAadObjectId());
476-
newTeamsChannelAccount.setRole(memberAdded.getRole());
477-
478-
teamsMembersAdded.add(newTeamsChannelAccount);
473+
if (teamsChannelAccount == null) {
474+
// unable to find the member added in ConversationUpdate Activity in the response from the
475+
// getMember call
476+
teamsChannelAccount = new TeamsChannelAccount();
477+
teamsChannelAccount.setId(memberAdded.getId());
478+
teamsChannelAccount.setName(memberAdded.getName());
479+
teamsChannelAccount.setAadObjectId(memberAdded.getAadObjectId());
480+
teamsChannelAccount.setRole(memberAdded.getRole());
479481
}
482+
teamsMembersAdded.add(teamsChannelAccount);
480483
}
481484
}
482485

libraries/bot-connector/src/main/java/com/microsoft/bot/connector/rest/RestConversations.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.microsoft.bot.connector.rest;
88

9+
import com.microsoft.bot.azure.AzureResponseBuilder;
910
import com.microsoft.bot.schema.Activity;
1011
import com.microsoft.bot.schema.AttachmentData;
1112
import com.microsoft.bot.schema.ChannelAccount;
@@ -606,12 +607,13 @@ private ServiceResponse<ChannelAccount> getConversationMemberDelegate(
606607
Response<ResponseBody> response
607608
) throws ErrorResponseException, IOException, IllegalArgumentException {
608609

609-
return client.restClient()
610+
return ((AzureResponseBuilder<ChannelAccount, ErrorResponseException>) client.restClient()
610611
.responseBuilderFactory()
611612
.<ChannelAccount, ErrorResponseException>newInstance(client.serializerAdapter())
612613
.register(HttpURLConnection.HTTP_OK, new TypeToken<ChannelAccount>() {
613614
}.getType())
614-
.registerError(ErrorResponseException.class)
615+
.registerError(ErrorResponseException.class))
616+
.withThrowOnGet404(true)
615617
.build(response);
616618
}
617619

samples/57.teams-conversation-bot/src/main/java/com/microsoft/bot/sample/teamsconversation/TeamsConversationBot.java

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,7 @@ protected CompletableFuture<Void> onMessageActivity(TurnContext turnContext) {
7878
{
7979
setTitle("Welcome Card");
8080
setText("Click the buttons below to update this card");
81-
setButtons(Arrays.asList(new CardAction() {
82-
{
83-
setType(ActionTypes.MESSAGE_BACK);
84-
setTitle("Update Card");
85-
setText("UpdateCardAction");
86-
setValue(value);
87-
}
88-
}, new CardAction() {
89-
{
90-
setType(ActionTypes.MESSAGE_BACK);
91-
setTitle("Message All Members");
92-
setText("MessageAllMembers");
93-
}
94-
}));
81+
setButtons(getHeroCardButtons(value));
9582
}
9683
};
9784

@@ -189,26 +176,7 @@ private CompletableFuture<Void> updateCardActivity(TurnContext turnContext) {
189176
{
190177
setTitle("Welcome Card");
191178
setText("Update count - " + data.get("count"));
192-
setButtons(Arrays.asList(new CardAction() {
193-
{
194-
setType(ActionTypes.MESSAGE_BACK);
195-
setTitle("Update Card");
196-
setText("UpdateCardAction");
197-
setValue(data);
198-
}
199-
}, new CardAction() {
200-
{
201-
setType(ActionTypes.MESSAGE_BACK);
202-
setTitle("Message All Members");
203-
setText("MessageAllMembers");
204-
}
205-
}, new CardAction() {
206-
{
207-
setType(ActionTypes.MESSAGE_BACK);
208-
setTitle("Delete card");
209-
setText("Delete");
210-
}
211-
}));
179+
setButtons(getHeroCardButtons(data));
212180
}
213181
};
214182

@@ -218,14 +186,43 @@ private CompletableFuture<Void> updateCardActivity(TurnContext turnContext) {
218186
return turnContext.updateActivity(updatedActivity).thenApply(resourceResponse -> null);
219187
}
220188

189+
private List<CardAction> getHeroCardButtons(Object value) {
190+
return Arrays.asList(new CardAction() {
191+
{
192+
setType(ActionTypes.MESSAGE_BACK);
193+
setTitle("Update Card");
194+
setText("UpdateCardAction");
195+
setValue(value);
196+
}
197+
}, new CardAction() {
198+
{
199+
setType(ActionTypes.MESSAGE_BACK);
200+
setTitle("Message All Members");
201+
setText("MessageAllMembers");
202+
}
203+
}, new CardAction() {
204+
{
205+
setType(ActionTypes.MESSAGE_BACK);
206+
setTitle("Delete card");
207+
setText("Delete");
208+
}
209+
}, new CardAction() {
210+
{
211+
setType(ActionTypes.MESSAGE_BACK);
212+
setTitle("Who am I?");
213+
setText("MentionMe");
214+
}
215+
});
216+
}
217+
221218
private CompletableFuture<Void> mentionActivity(TurnContext turnContext) {
222219
Mention mention = new Mention();
223220
mention.setMentioned(turnContext.getActivity().getFrom());
224221
mention.setText(
225222
"<at>" + URLEncoder.encode(turnContext.getActivity().getFrom().getName()) + "</at>"
226223
);
227224

228-
Activity replyActivity = MessageFactory.text("Hello " + mention.getText() + ".'");
225+
Activity replyActivity = MessageFactory.text("Hello " + mention.getText() + ".");
229226
replyActivity.setMentions(Collections.singletonList(mention));
230227

231228
return turnContext.sendActivity(replyActivity).thenApply(resourceResponse -> null);

0 commit comments

Comments
 (0)