/// <summary> /// This method is used to send notifications to LnD team. /// </summary> /// <param name="team">The team to which notification need to send.</param> /// <param name="card">The notification card that to be send.</param> /// <param name="updateCard">Boolean indicating whether existing card needs to be updated.</param> /// <param name="activityId">Existing card activity Id required for updating card.</param> /// <returns>Task indicating result of asynchronous operation.</returns> public async Task <string> SendNotificationInTeamAsync(LnDTeam team, Attachment card, bool updateCard = false, string activityId = null) { team = team ?? throw new ArgumentNullException(nameof(team), "Team details cannot be null"); card = card ?? throw new ArgumentNullException(nameof(card), "Card attachment cannot be null"); if (updateCard && string.IsNullOrEmpty(activityId)) { throw new ArgumentNullException(nameof(activityId), "Activity Id cannot be null in case of updating an existing card"); } string serviceUrl = team.ServiceUrl; MicrosoftAppCredentials.TrustServiceUrl(serviceUrl); string teamsChannelId = team.TeamId; var conversationReference = new ConversationReference() { ChannelId = Constants.TeamsBotFrameworkChannelId, Bot = new ChannelAccount() { Id = this.microsoftAppCredentials.MicrosoftAppId }, ServiceUrl = serviceUrl, Conversation = new ConversationAccount() { ConversationType = ConversationTypes.Channel, IsGroup = true, Id = teamsChannelId }, }; try { ResourceResponse resourceResponse = null; await((BotFrameworkAdapter)this.botFrameworkHttpAdapter).ContinueConversationAsync( this.microsoftAppCredentials.MicrosoftAppId, conversationReference, async(conversationTurnContext, conversationCancellationToken) => { if (updateCard) { var activity = MessageFactory.Attachment(card); activity.Id = activityId; resourceResponse = await conversationTurnContext.UpdateActivityAsync(activity); } else { resourceResponse = await conversationTurnContext.SendActivityAsync(MessageFactory.Attachment(card)); } }, CancellationToken.None); return(resourceResponse.Id); } #pragma warning disable CA1031 // Catching general exception to continue sending notifications catch #pragma warning restore CA1031 // Catching general exception to continue sending notifications { return(null); } }
/// <summary> /// Delete LnD team configuration details when LnD team uninstalls a Bot /// </summary> /// <param name="teamDetails">The LnD team details which needs to be deleted.</param> /// <returns>Returns true if configuration details deleted successfully. Else returns false.</returns> public async Task <bool> DeleteLnDTeamConfigurationsAsync(LnDTeam teamDetails) { if (teamDetails == null) { throw new ArgumentNullException(nameof(teamDetails), "The team Id should have a valid value"); } this.lnDTeams.Remove(teamDetails); return(await Task.Run(() => true)); }
/// <summary> /// Insert a new LnD team configuration details when LnD team installs a Bot /// </summary> /// <param name="teamDetails">The LnD team configuration details</param> /// <returns>Returns true if configuration details inserted successfully. Else returns false.</returns> public async Task <bool> InsertLnDTeamConfigurationAsync(LnDTeam teamDetails) { if (teamDetails == null) { throw new ArgumentNullException(nameof(teamDetails), "The team details should be provided"); } this.lnDTeams.Add(teamDetails); return(await Task.Run(() => true)); }
/// <summary> /// Send a welcome card if bot is installed in Team scope. /// </summary> /// <param name="turnContext">Provides context for a turn in a bot.</param> /// <returns>A task that represents a response.</returns> public async Task OnBotInstalledInTeamAsync(ITurnContext <IConversationUpdateActivity> turnContext) { turnContext = turnContext ?? throw new ArgumentNullException(nameof(turnContext)); // If bot added to team, add team tab configuration with service URL. await this.SendWelcomeCardInChannelAsync(turnContext); var activity = turnContext.Activity; // Storing team information to storage. var teamsDetails = activity.TeamsGetTeamInfo(); if (teamsDetails == null) { this.logger.LogInformation($"Unable to store bot installation state for team {teamsDetails.Id} in storage. Team details is null."); } else { this.logger.LogInformation($"Bot added in team {teamsDetails.Id}"); LnDTeam teamEntity = new LnDTeam { TeamId = teamsDetails.Id, BotInstalledOn = DateTime.UtcNow, ServiceUrl = activity.ServiceUrl, }; bool operationStatus = await this.teamConfigurationRepository.InsertLnDTeamConfigurationAsync(teamEntity); if (operationStatus) { this.logger.LogInformation($"Successfully stored bot installation state for team {teamsDetails.Id} in storage."); } else { this.logger.LogInformation($"Unable to store bot installation state for team {teamsDetails.Id} in storage."); } } }
static EventWorkflowHelperData() { eventEntity = new EventEntity { EventId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2baz-1234-2345", TeamId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2baz-1234", Audience = 3, CategoryId = "088ddf0d-4deb-4e95-b1f3-907fc4511b02", AutoRegisteredAttendees = "", CategoryName = "Test_Category", CreatedBy = "Jack", CreatedOn = new DateTime(2020, 09, 24), Description = "Teams Event", EndDate = new DateTime(2020, 09, 25), EndTime = new DateTime(2020, 09, 25), ETag = "", GraphEventId = "088ddf0d-4deb-4e95-b1f3-907fc4511b02g", IsAutoRegister = false, IsRegistrationClosed = false, IsRemoved = false, MandatoryAttendees = "", MaximumNumberOfParticipants = 10, MeetingLink = "", Name = "Mandaotory Training Event", NumberOfOccurrences = 1, OptionalAttendees = "", Photo = "https://testurl/img.png", StartDate = new DateTime(2020, 09, 25), StartTime = new DateTime(2020, 09, 25), UpdatedBy = "Jack", Venue = "", SelectedUserOrGroupListJSON = "", RegisteredAttendeesCount = 0, Type = 0, RegisteredAttendees = "" }; validEventEntity = new EventEntity { EventId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2baz-1234-2345", TeamId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2baz-1234", Audience = 1, CategoryId = "088ddf0d-4deb-4e95-b1f3-907fc4511b02", AutoRegisteredAttendees = "", CategoryName = "Test_Category", CreatedBy = "Jack", CreatedOn = DateTime.UtcNow, Description = "Teams Event", EndDate = DateTime.UtcNow.AddDays(4).Date, EndTime = DateTime.UtcNow.AddDays(4).Date, ETag = "", GraphEventId = "088ddf0d-4deb-4e95-b1f3-907fc4511b02g", IsAutoRegister = false, IsRegistrationClosed = false, IsRemoved = false, MandatoryAttendees = "", MaximumNumberOfParticipants = 10, MeetingLink = "", Name = "Mandaotory Training Event", NumberOfOccurrences = 1, OptionalAttendees = "", Photo = "https://www.testurl.com/img.png", StartDate = DateTime.UtcNow.AddDays(2).Date, StartTime = DateTime.UtcNow.AddDays(2).Date, UpdatedBy = "Jack", Venue = "", SelectedUserOrGroupListJSON = "", RegisteredAttendeesCount = 0, Type = 2, RegisteredAttendees = "" }; eventEntities = new List <EventEntity>() { new EventEntity { EventId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-888", CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba", CategoryName = "" }, new EventEntity { EventId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999", CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac3ba", CategoryName = "" } }; category = new Category { CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba", Name = "Test_Category_1", Description = "Description", CreatedBy = "ad4b2b43-1cb5-408d-ab8a-17e28edacabc", CreatedOn = DateTime.UtcNow, UpdatedOn = DateTime.UtcNow, }; categoryList = new List <Category> { new Category { CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac1ba", Name = "Test_Category_1", Description = "Description", CreatedBy = "ad4b2b43-1cb5-408d-ab8a-17e28edacabc", CreatedOn = DateTime.UtcNow, UpdatedOn = DateTime.UtcNow, IsInUse = false, }, new Category { CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba", Name = "Test_Category_1", Description = "Description", CreatedBy = "ad4b2b43-1cb5-408d-ab8a-17e28edacabc", CreatedOn = DateTime.UtcNow, UpdatedOn = DateTime.UtcNow, IsInUse = false, }, new Category { CategoryId = "ad4b2b43-1cb5-408d-ab8a-17e28edac3ba", Name = "Test_Category_1", Description = "Description", CreatedBy = "ad4b2b43-1cb5-408d-ab8a-17e28edacabc", CreatedOn = DateTime.UtcNow, UpdatedOn = DateTime.UtcNow, IsInUse = false, } }; teamEvent = new Event { Subject = "Teams Event", Body = new ItemBody { ContentType = BodyType.Html, Content = eventEntity.Type == (int)EventType.LiveEvent ? $"{eventEntity.Description}<br/><br/><a href='{eventEntity.MeetingLink}'>{eventEntity.MeetingLink}</a>" : eventEntity.Description, }, Attendees = new List <Attendee>(), OnlineMeetingUrl = eventEntity.Type == (int)EventType.LiveEvent ? eventEntity.MeetingLink : null, IsReminderOn = true, Location = eventEntity.Type == (int)EventType.InPerson ? new Location { Address = new PhysicalAddress { Street = eventEntity.Venue }, } : null, AllowNewTimeProposals = false, IsOnlineMeeting = true, OnlineMeetingProvider = OnlineMeetingProviderType.TeamsForBusiness, Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-rrtyy" }; lndTeam = new LnDTeam { ETag = "", PartitionKey = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999", TeamId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-000", RowKey = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-000" }; graphUser = new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }; graphUsers = new List <Graph.User>() { new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }, new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002", Mail = "*****@*****.**" }, new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003", Mail = "*****@*****.**" } }; graphGroups = new List <Graph.Group>() { new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }, new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002", Mail = "*****@*****.**" }, new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003", Mail = "*****@*****.**" } }; graphGroupDirectoryObject = new List <Graph.DirectoryObject>() { new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001" }, new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002" }, new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003" } }; fileInfo = new FormFile(new MemoryStream(), 1, 1, "sample.jpeg", "sample.jpeg"); teamsChannelAccount = new List <TeamsChannelAccount>() { new TeamsChannelAccount { GivenName = "sam", UserPrincipalName = "s" }, new TeamsChannelAccount { GivenName = "jack", UserPrincipalName = "j" } }; teamEvent = new Event { Subject = "Teams Event", Body = new ItemBody { ContentType = BodyType.Html, Content = eventEntity.Type == (int)EventType.LiveEvent ? $"{eventEntity.Description}<br/><br/><a href='{eventEntity.MeetingLink}'>{eventEntity.MeetingLink}</a>" : eventEntity.Description, }, Attendees = new List <Attendee>(), OnlineMeetingUrl = eventEntity.Type == (int)EventType.LiveEvent ? eventEntity.MeetingLink : null, IsReminderOn = true, Location = eventEntity.Type == (int)EventType.InPerson ? new Location { Address = new PhysicalAddress { Street = eventEntity.Venue }, } : null, AllowNewTimeProposals = false, IsOnlineMeeting = true, OnlineMeetingProvider = OnlineMeetingProviderType.TeamsForBusiness, Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-rrtyy" }; lndTeam = new LnDTeam { ETag = "", PartitionKey = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999", TeamId = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-000", RowKey = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-000" }; graphUser = new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }; graphUsers = new List <Graph.User>() { new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }, new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002", Mail = "*****@*****.**" }, new Graph.User { DisplayName = "Jack", UserPrincipalName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003", Mail = "*****@*****.**" } }; graphGroups = new List <Graph.Group>() { new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001", Mail = "*****@*****.**" }, new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002", Mail = "*****@*****.**" }, new Graph.Group { DisplayName = "Jack", Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003", Mail = "*****@*****.**" } }; graphGroupDirectoryObject = new List <Graph.DirectoryObject>() { new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-001" }, new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-002" }, new Graph.DirectoryObject { Id = "ad4b2b43-1cb5-408d-ab8a-17e28edac2ba-445567-999-003" } }; fileInfo = new FormFile(new MemoryStream(), 1, 1, "sample.jpeg", "sample.jpeg"); teamsChannelAccount = new List <TeamsChannelAccount>() { new TeamsChannelAccount { GivenName = "sam", UserPrincipalName = "s" }, new TeamsChannelAccount { GivenName = "jack", UserPrincipalName = "j" } }; }