/// <summary> /// Overriding to send card when award admin member is removed from team. /// </summary> /// <param name="membersRemoved">A member removed from team, as described by the conversation update activity.</param> /// <param name="turnContext">Provides context for a turn of a bot.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> /// <returns>Notification card when bot or member is removed from team.</returns> protected override async Task OnMembersRemovedAsync(IList <ChannelAccount> membersRemoved, ITurnContext <IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { turnContext = turnContext ?? throw new ArgumentNullException(nameof(turnContext)); var activity = turnContext.Activity; this.logger.LogInformation($"conversationType: {activity.Conversation?.ConversationType}, membersRemoved: {membersRemoved?.Count}"); if (activity.Conversation.ConversationType == ChannelConversationType) { var teamsDetails = turnContext.Activity.TeamsGetTeamInfo(); var admin = await this.configureAdminStorageProvider.GetAdminDetailAsync(teamsDetails.Id); // In application, there is a persona named 'Champion' who is the only person in team to create reward cycle, add awards and publish results. // In case if the Champion is removed from team, then the bot sends a new card to set up new Champion. if (membersRemoved.Any(member => member.AadObjectId == admin.AdminObjectId)) { this.logger.LogInformation($"Award captain is removed from team. {activity.Conversation.Id}"); await turnContext.SendActivityAsync(MessageFactory.Attachment(WelcomeCard.ConfigureNewAdminCard(this.localizer)), cancellationToken); } // Deleting team information from storage when bot is uninstalled from a team. else if (membersRemoved.Any(member => member.Id == activity.Recipient.Id)) { this.logger.LogInformation($"Bot removed {activity.Conversation.Id}"); var teamEntity = await this.teamStorageProvider.GetTeamDetailAsync(teamsDetails.Id); bool operationStatus = await this.teamStorageProvider.DeleteTeamDetailAsync(teamEntity); if (!operationStatus) { this.logger.LogInformation($"Unable to remove team details from table storage."); } } } }