Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 43 additions & 47 deletions libraries/botbuilder/src/teamsActivityHandler.ts

Large diffs are not rendered by default.

38 changes: 23 additions & 15 deletions libraries/botbuilder/src/teamsInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

import {
ChannelAccount,
ChannelInfo,
ConversationList,
TeamsChannelAccount,
Expand All @@ -19,45 +20,52 @@ import { ConnectorClient, TeamsConnectorClient } from 'botframework-connector';
import { BotFrameworkAdapter } from './botFrameworkAdapter';

export class TeamsInfo {
static async getTeamDetails(context: TurnContext): Promise<TeamDetails> {
const teamId = this.getTeamId(context);
if (!teamId) {
public static async getTeamDetails(context: TurnContext, teamId?: string): Promise<TeamDetails> {
const t = teamId || this.getTeamId(context);
if (!t) {
throw new Error('This method is only valid within the scope of a MS Teams Team.');
}

return await this.getTeamsConnectorClient(context).teams.fetchTeamDetails(teamId);
return await this.getTeamsConnectorClient(context).teams.fetchTeamDetails(t);
}

static async getChannels(context: TurnContext): Promise<ChannelInfo[]> {
const teamId = this.getTeamId(context);
if (!teamId) {
public static async getTeamChannels(context: TurnContext, teamId?: string): Promise<ChannelInfo[]> {
const t = teamId || this.getTeamId(context);
if (!t) {
throw new Error('This method is only valid within the scope of a MS Teams Team.');
}

const channelList: ConversationList = await this.getTeamsConnectorClient(context).teams.fetchChannelList(teamId);
const channelList: ConversationList = await this.getTeamsConnectorClient(context).teams.fetchChannelList(t);
return channelList.conversations;
}

static async getMembers(context: TurnContext): Promise<TeamsChannelAccount[]> {
const connectorClient = this.getConnectorClient(context);
public static async getMembers(context: TurnContext): Promise<TeamsChannelAccount[]> {
const teamId = this.getTeamId(context);
if (teamId) {
return await this.getMembersInternal(connectorClient, teamId);
return await this.getTeamMembers(context, teamId);
} else {
const conversation = context.activity.conversation;
const conversationId = conversation && conversation.id ? conversation.id : undefined;
return await this.getMembersInternal(connectorClient, conversationId);
return await this.getMembersInternal(this.getConnectorClient(context), conversationId);
}
}

public static async getTeamMembers(context: TurnContext, teamId?: string): Promise<TeamsChannelAccount[]> {
const t = teamId || this.getTeamId(context);
if (!t) {
throw new Error('This method is only valid within the scope of a MS Teams Team.');
}
return this.getMembersInternal(this.getConnectorClient(context), t);
}

private static async getMembersInternal(connectorClient: ConnectorClient, conversationId: string): Promise<TeamsChannelAccount[]> {
if (!conversationId) {
throw new Error('The getMembers operation needs a valid conversationId.');
}

const teamMembers = await connectorClient.conversations.getConversationMembers(conversationId);
teamMembers.forEach((member:any) => {
member.aadObjectId = member.objectId;
const teamMembers: ChannelAccount[] = await connectorClient.conversations.getConversationMembers(conversationId);
teamMembers.forEach((member): void => {
member.aadObjectId = (member as any).objectId;
});

return teamMembers as TeamsChannelAccount[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,19 @@ export class ActionBasedMessagingExtensionFetchTaskBot extends TeamsActivityHand
});
}

protected async onTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const response = AdaptiveCardHelper.createTaskModuleAdaptiveCardResponse();
return response;
}

protected async onTeamsMessagingExtensionSubmitAction(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionSubmitAction(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const submittedData = action.data as SubmitExampleData;
const adaptiveCard = AdaptiveCardHelper.toAdaptiveCardAttachment(submittedData);
const response = CardResponseHelpers.toMessagingExtensionBotMessagePreviewResponse(adaptiveCard);
return response;
}

protected async onTeamsMessagingExtensionBotMessagePreviewEdit(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionBotMessagePreviewEdit(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const submitData = AdaptiveCardHelper.toSubmitExampleData(action);
const response = AdaptiveCardHelper.createTaskModuleAdaptiveCardResponse(
submitData.Question,
Expand All @@ -57,7 +57,7 @@ export class ActionBasedMessagingExtensionFetchTaskBot extends TeamsActivityHand
return response;
}

protected async onTeamsMessagingExtensionBotMessagePreviewSend(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionBotMessagePreviewSend(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const submitData: SubmitExampleData = AdaptiveCardHelper.toSubmitExampleData(action);
const adaptiveCard: Attachment = AdaptiveCardHelper.toAdaptiveCardAttachment(submitData);

Expand All @@ -79,8 +79,8 @@ export class ActionBasedMessagingExtensionFetchTaskBot extends TeamsActivityHand
return response;
}

protected async onTeamsMessagingExtensionCardButtonClicked(context: TurnContext, obj) {
const reply = MessageFactory.text('onTeamsMessagingExtensionCardButtonClicked Value: ' + JSON.stringify(context.activity.value));
protected async handleTeamsMessagingExtensionCardButtonClicked(context: TurnContext, obj) {
const reply = MessageFactory.text('handleTeamsMessagingExtensionCardButtonClicked Value: ' + JSON.stringify(context.activity.value));
await context.sendActivity(reply);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export class ActionBasedMessagingExtensionBot extends TeamsActivityHandler {
});
}

protected async onTeamsMessagingExtensionSubmitAction(context, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionSubmitAction(context, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const data = action.data;
let body: MessagingExtensionActionResponse;
if (data && data.done) {
Expand Down Expand Up @@ -82,13 +82,13 @@ export class ActionBasedMessagingExtensionBot extends TeamsActivityHandler {

// This method fires when an user uses an Action-based Messaging Extension from the Teams Client.
// It should send back the tab or task module for the user to interact with.
protected async onTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
return {
task: this.taskModuleResponse(query, false)
task: this.taskModuleResponse(action, false)
};
}

protected async onTeamsBotMessagePreviewSend(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionBotMessagePreviewSend(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
let body: MessagingExtensionActionResponse;
const card = this.getCardFromPreviewMessage(action);
if (!card) {
Expand All @@ -106,7 +106,7 @@ export class ActionBasedMessagingExtensionBot extends TeamsActivityHandler {
return body;
}

protected async onTeamsBotMessagePreviewEdit(context, value: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionBotMessagePreviewEdit(context, value: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const card = this.getCardFromPreviewMessage(value);
let body: MessagingExtensionActionResponse;
if (!card) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ export class AdaptiveCardsBot extends TeamsActivityHandler {
});
}

protected async onTeamsTaskModuleFetch(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
await context.sendActivity(MessageFactory.text(`OnTeamsTaskModuleFetchAsync TaskModuleRequest: ${JSON.stringify(taskModuleRequest)}`));
protected async handleTeamsTaskModuleFetch(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
await context.sendActivity(MessageFactory.text(`handleTeamsTaskModuleFetchAsync TaskModuleRequest: ${JSON.stringify(taskModuleRequest)}`));

/**
* The following line disables the lint rules for the Adaptive Card so that users can
Expand Down Expand Up @@ -110,8 +110,8 @@ export class AdaptiveCardsBot extends TeamsActivityHandler {
} as TaskModuleResponse;
}

protected async onTeamsTaskModuleSubmit(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
await context.sendActivity(MessageFactory.text(`OnTeamsTaskModuleSubmit value: ${JSON.stringify(taskModuleRequest)}`));
protected async handleTeamsTaskModuleSubmit(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
await context.sendActivity(MessageFactory.text(`handleTeamsTaskModuleSubmit value: ${JSON.stringify(taskModuleRequest)}`));

return {
task: {
Expand All @@ -121,8 +121,8 @@ export class AdaptiveCardsBot extends TeamsActivityHandler {
} as TaskModuleResponse;
}

protected async onTeamsCardActionInvoke(context: TurnContext): Promise<InvokeResponse> {
await context.sendActivity(MessageFactory.text(`OnTeamsCardActionInvoke value: ${JSON.stringify(context.activity.value)}`));
protected async handleTeamsCardActionInvoke(context: TurnContext): Promise<InvokeResponse> {
await context.sendActivity(MessageFactory.text(`handleTeamsCardActionInvoke value: ${JSON.stringify(context.activity.value)}`));
return { status: 200 } as InvokeResponse;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export class FileUploadBot extends TeamsActivityHandler {
});
}

protected async onTeamsFileConsentAccept(context: TurnContext, fileConsentCardResponse: FileConsentCardResponse): Promise<void> {
protected async handleTeamsFileConsentAccept(context: TurnContext, fileConsentCardResponse: FileConsentCardResponse): Promise<void> {
try {
await this.sendFile(fileConsentCardResponse);
await this.fileUploadCompleted(context, fileConsentCardResponse);
Expand All @@ -51,7 +51,7 @@ export class FileUploadBot extends TeamsActivityHandler {
}
}

protected async onTeamsFileConsentDecline(context: TurnContext, fileConsentCardResponse: FileConsentCardResponse): Promise<void> {
protected async handleTeamsFileConsentDecline(context: TurnContext, fileConsentCardResponse: FileConsentCardResponse): Promise<void> {
let reply = this.createReply(context.activity);
reply.textFormat = "xml";
reply.text = `Declined. We won't upload file <b>${fileConsentCardResponse.context["filename"]}</b>.`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class LinkUnfurlingBot extends TeamsActivityHandler {
// https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/messaging-extensions/search-extensions#receive-requests-from-links-inserted-into-the-compose-message-box
// By specifying domains under the messageHandlers section in the manifest, the bot can receive
// events when a user enters in a domain in the compose box.
protected async onTeamsAppBasedLinkQuery(context: TurnContext, query: AppBasedLinkQuery): Promise<MessagingExtensionResponse> {
protected async handleTeamsAppBasedLinkQuery(context: TurnContext, query: AppBasedLinkQuery): Promise<MessagingExtensionResponse> {
const attachment = CardFactory.thumbnailCard('Thumbnail Card', query.url, ["https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png"]);

const result: MessagingExtensionResult = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export class MessagingExtensionAuthBot extends TeamsActivityHandler {
});
}

protected async onTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionFetchTask(context: TurnContext, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
const adapter: IUserTokenProvider = context.adapter as BotFrameworkAdapter;
const userToken = await adapter.getUserToken(context, this.connectionName);
if (!userToken)
Expand Down Expand Up @@ -107,7 +107,7 @@ export class MessagingExtensionAuthBot extends TeamsActivityHandler {
return response;
}

protected async onTeamsTaskModuleFetch(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
protected async handleTeamsTaskModuleFetch(context: TurnContext, taskModuleRequest: TaskModuleRequest): Promise<TaskModuleResponse> {
var data = context.activity.value;
if (data && data.state)
{
Expand All @@ -127,12 +127,12 @@ export class MessagingExtensionAuthBot extends TeamsActivityHandler {
}
else
{
await context.sendActivity("OnTeamsTaskModuleFetchAsync called without 'state' in Activity.Value");
await context.sendActivity("handleTeamsTaskModuleFetchAsync called without 'state' in Activity.Value");
return null;
}
}

protected async onTeamsMessagingExtensionSubmitAction(context, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
protected async handleTeamsMessagingExtensionSubmitAction(context, action: MessagingExtensionAction): Promise<MessagingExtensionActionResponse> {
if (action.data != null && action.data.key && action.data.key == "signout")
{
// User clicked the Sign Out button from a Task Module
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export class MessagingExtensionConfigBot extends TeamsActivityHandler {
});
}

protected async onTeamsMessagingExtensionConfigurationQuerySettingUrl(context: TurnContext, query: MessagingExtensionQuery){
protected async handleTeamsMessagingExtensionConfigurationQuerySettingUrl(context: TurnContext, query: MessagingExtensionQuery){
return <MessagingExtensionActionResponse>
{
composeExtension: <MessagingExtensionResult> {
Expand All @@ -55,7 +55,7 @@ export class MessagingExtensionConfigBot extends TeamsActivityHandler {
}
}

protected async onTeamsMessagingExtensionConfigurationSetting(context: TurnContext, settings){
protected async handleTeamsMessagingExtensionConfigurationSetting(context: TurnContext, settings){
// This event is fired when the settings page is submitted
await context.sendActivity(`onTeamsMessagingExtensionSettings event fired with ${ JSON.stringify(settings) }`);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export class Office365CardsBot extends TeamsActivityHandler {
});
}

protected async onTeamsO365ConnectorCardAction(context: TurnContext, query: O365ConnectorCardActionQuery): Promise<void> {
protected async handleTeamsO365ConnectorCardAction(context: TurnContext, query: O365ConnectorCardActionQuery): Promise<void> {
await context.sendActivity(MessageFactory.text(`O365ConnectorCardActionQuery event value: ${JSON.stringify(query)}`));
}

Expand Down
2 changes: 1 addition & 1 deletion libraries/botbuilder/tests/teams/roster/src/rosterBot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export class RosterBot extends TeamsActivityHandler {
}

private async showChannels(context: TurnContext): Promise<void> {
let channels = await TeamsInfo.getChannels(context);
let channels = await TeamsInfo.getTeamChannels(context);
await context.sendActivity(MessageFactory.text(`Total of ${channels.length} channels are currently in team`));
let messages = channels.map(function(channel) {
return `${channel.id} --> ${channel.name ? channel.name : 'General'}`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export class TeamsSearchExtensionBot extends TeamsActivityHandler {
});
}

protected async onTeamsMessagingExtensionQuery(context: TurnContext, query: MessagingExtensionQuery): Promise<MessagingExtensionResponse>{
protected async handleTeamsMessagingExtensionQuery(context: TurnContext, query: MessagingExtensionQuery): Promise<MessagingExtensionResponse>{
const accessor = this.userState.createProperty<{ useHeroCard: boolean }>(RICH_CARD_PROPERTY);
const config = await accessor.get(context, { useHeroCard: true });

Expand Down Expand Up @@ -98,7 +98,7 @@ export class TeamsSearchExtensionBot extends TeamsActivityHandler {
return composeExtensionResponse;
}

protected async onTeamsAppBasedLinkQuery(context: TurnContext, query: AppBasedLinkQuery): Promise<MessagingExtensionResponse>{
protected async handleTeamsAppBasedLinkQuery(context: TurnContext, query: AppBasedLinkQuery): Promise<MessagingExtensionResponse>{
const accessor = this.userState.createProperty<{ useHeroCard: boolean }>(RICH_CARD_PROPERTY);
const config = await accessor.get(context, { useHeroCard: true });

Expand Down Expand Up @@ -140,7 +140,7 @@ export class TeamsSearchExtensionBot extends TeamsActivityHandler {
return composeExtensionResponse;
}

protected async onTeamsMessagingExtensionConfigurationQuerySettingUrl(context: TurnContext, query: MessagingExtensionQuery){
protected async handleTeamsMessagingExtensionConfigurationQuerySettingUrl(context: TurnContext, query: MessagingExtensionQuery){
return <MessagingExtensionActionResponse>
{
composeExtension: <MessagingExtensionResult> {
Expand All @@ -158,7 +158,7 @@ export class TeamsSearchExtensionBot extends TeamsActivityHandler {
}
}

protected async onTeamsMessagingExtensionConfigurationSetting(context: TurnContext, settings: MessagingExtensionQuery){
protected async handleTeamsMessagingExtensionConfigurationSetting(context: TurnContext, settings: MessagingExtensionQuery){
// This event is fired when the settings page is submitted
const accessor = this.userState.createProperty<{ useHeroCard: boolean }>(RICH_CARD_PROPERTY);
const config = await accessor.get(context, { useHeroCard: true });
Expand Down
Loading