@microsoft/teamsapp-cli
Version:
Teams Toolkit CLI is a text-based command line interface that can help scaffold, validate, and deploy applications for Microsoft Teams from the terminal or a CI/CD process.
85 lines (73 loc) • 2.9 kB
text/typescript
import { TeamsActivityHandler, CardFactory, TurnContext } from "botbuilder";
import {
MessageExtensionTokenResponse,
handleMessageExtensionQueryWithSSO,
OnBehalfOfCredentialAuthConfig,
OnBehalfOfUserCredential,
} from "@microsoft/teamsfx";
import { Client } from "@microsoft/microsoft-graph-client";
import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
import "isomorphic-fetch";
const oboAuthConfig: OnBehalfOfCredentialAuthConfig = {
authorityHost: process.env.M365_AUTHORITY_HOST,
clientId: process.env.M365_CLIENT_ID,
tenantId: process.env.M365_TENANT_ID,
clientSecret: process.env.M365_CLIENT_SECRET,
};
const initialLoginEndpoint = process.env.INITIATE_LOGIN_ENDPOINT;
export class TeamsBot extends TeamsActivityHandler {
constructor() {
super();
}
public async handleTeamsMessagingExtensionQuery(context: TurnContext, query: any): Promise<any> {
// eslint-disable-next-line no-secrets/no-secrets
/**
* User Code Here.
* If query without token, no need to implement handleMessageExtensionQueryWithSSO;
* Otherwise, just follow the sample code below to modify the user code.
*/
return await handleMessageExtensionQueryWithSSO(
context,
oboAuthConfig,
initialLoginEndpoint,
"User.Read",
async (token: MessageExtensionTokenResponse) => {
// User Code
// Init OnBehalfOfUserCredential instance with SSO token
const credential = new OnBehalfOfUserCredential(token.ssoToken, oboAuthConfig);
// Create an instance of the TokenCredentialAuthenticationProvider by passing the tokenCredential instance and options to the constructor
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
scopes: ["User.Read"],
});
// Initialize Graph client instance with authProvider
const graphClient = Client.initWithMiddleware({
authProvider: authProvider,
});
// Call graph api use `graph` instance to get user profile information.
const profile = await graphClient.api("/me").get();
// Organize thumbnailCard to display User's profile info.
const thumbnailCard = CardFactory.thumbnailCard(profile.displayName, profile.mail);
// Message Extension return the user profile info to user.
return {
composeExtension: {
type: "result",
attachmentLayout: "list",
attachments: [thumbnailCard],
},
};
}
);
}
public async handleTeamsMessagingExtensionSelectItem(
context: TurnContext,
obj: any
): Promise<any> {
return {
composeExtension: {
type: "result",
attachmentLayout: "list",
attachments: [CardFactory.heroCard(obj.name, obj.description)],
},
};
}
}