private async Task SendAndUpdateCardAsync(ITurnContext turnContext, IList <UserFavoriteRoomEntity> rooms, RoomScheduleResponse scheduleResponse, string activityReferenceId) { var activity = turnContext.Activity; var startUTCTime = DateTime.UtcNow.AddMinutes(Constants.DurationGapFromNow.Minutes); var endUTCTime = startUTCTime.AddMinutes(Constants.DefaultMeetingDuration.Minutes); var userConfiguration = await this.userConfigurationStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); if (userConfiguration == null) { this.telemetryClient.TrackTrace("User configuration is null in SendAndUpdateCardAsync."); await turnContext.SendActivityAsync(Strings.ExceptionResponse).ConfigureAwait(false); return; } var startTime = TimeZoneInfo.ConvertTimeFromUtc(startUTCTime, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); foreach (var room in scheduleResponse.Schedules) { var searchedRoom = rooms.Where(favoriteRoom => favoriteRoom.RowKey == room.ScheduleId).FirstOrDefault(); room.RoomName = searchedRoom?.RoomName; room.BuildingName = searchedRoom?.BuildingName; } var activityFromStorage = await this.activityStorageProvider.GetAsync(turnContext.Activity.From.AadObjectId, activityReferenceId).ConfigureAwait(false); if (activityFromStorage != null) { var attachment = FavoriteRoomsListCard.GetFavoriteRoomsListAttachment(scheduleResponse, startUTCTime, endUTCTime, userConfiguration.WindowsTimezone, activityReferenceId); var updateCardActivity = new Activity(ActivityTypes.Message) { Id = activityFromStorage.ActivityId, Conversation = turnContext.Activity.Conversation, Attachments = new List <Attachment> { attachment }, }; var activityResponse = await turnContext.UpdateActivityAsync(updateCardActivity).ConfigureAwait(false); Models.TableEntities.ActivityEntity newActivity = new Models.TableEntities.ActivityEntity { ActivityId = activityResponse.Id, PartitionKey = turnContext.Activity.From.AadObjectId, RowKey = activityReferenceId }; await this.activityStorageProvider.AddAsync(newActivity).ConfigureAwait(false); } else { await turnContext.SendActivityAsync(MessageFactory.Text(Strings.FavoriteRoomsModified)).ConfigureAwait(false); } }
/// <summary> /// Update favorite list after task module close. /// </summary> /// <param name="stepContext">Context object passed in to a WaterfallStep.</param> /// <returns>A task that represents the work queued to execute.</returns> private async Task RefreshFavoriteCardAsync(WaterfallStepContext stepContext) { var activity = stepContext.Context.Activity; var userToken = await this.tokenHelper.GetUserTokenAsync(activity.From.Id).ConfigureAwait(false); var rooms = await this.favoriteStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); var activityReferenceId = Guid.NewGuid().ToString(); var startUTCTime = DateTime.UtcNow.AddMinutes(Constants.DurationGapFromNow.Minutes); var endUTCTime = startUTCTime.AddMinutes(Constants.DefaultMeetingDuration.Minutes); var userConfiguration = await this.userConfigurationStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); if (userConfiguration == null) { this.telemetryClient.TrackTrace("User configuration is null in RefreshFavoriteCardAsync."); await stepContext.Context.SendActivityAsync(Strings.ExceptionResponse).ConfigureAwait(false); return; } var startTime = TimeZoneInfo.ConvertTimeFromUtc(startUTCTime, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); var endTime = startTime.AddMinutes(Constants.DefaultMeetingDuration.Minutes); rooms = await this.meetingHelper.FilterFavoriteRoomsAsync(rooms?.ToList()).ConfigureAwait(false); if (rooms?.Count > 0) { var roomsScheduleResponse = await this.GetRoomsScheduleAsync(startTime, endTime, localTimeZone : userConfiguration.IanaTimezone, rooms, userToken).ConfigureAwait(false); if (roomsScheduleResponse.ErrorResponse != null) { // Graph API returned error message. await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.ExceptionResponse)).ConfigureAwait(false); return; } foreach (var room in roomsScheduleResponse?.Schedules) { var searchedRoom = rooms.Where(favoriteRoom => favoriteRoom.RowKey == room.ScheduleId).FirstOrDefault(); room.RoomName = searchedRoom.RoomName; room.BuildingName = searchedRoom.BuildingName; } var attachment = FavoriteRoomsListCard.GetFavoriteRoomsListAttachment(roomsScheduleResponse, startUTCTime, endUTCTime, userConfiguration.WindowsTimezone, activityReferenceId); var updateCardActivity = new Activity(ActivityTypes.Message) { Id = stepContext.Context.Activity.ReplyToId, Conversation = stepContext.Context.Activity.Conversation, Attachments = new List <Attachment> { attachment }, }; var replyActivity = await stepContext.Context.UpdateActivityAsync(updateCardActivity).ConfigureAwait(false); Models.TableEntities.ActivityEntity newActivity = new Models.TableEntities.ActivityEntity { ActivityId = replyActivity.Id, PartitionKey = activity.From.AadObjectId, RowKey = activityReferenceId }; await this.activityStorageProvider.AddAsync(newActivity).ConfigureAwait(false); } else { RoomScheduleResponse scheduleResponse = new RoomScheduleResponse { Schedules = new List <Schedule>() }; var attchment = FavoriteRoomsListCard.GetFavoriteRoomsListAttachment(scheduleResponse, startUTCTime, endUTCTime, userConfiguration.WindowsTimezone, activityReferenceId); var updateCardActivity = new Activity(ActivityTypes.Message) { Id = stepContext.Context.Activity.ReplyToId, Conversation = stepContext.Context.Activity.Conversation, Attachments = new List <Attachment> { attchment }, }; var replyActivity = await stepContext.Context.UpdateActivityAsync(updateCardActivity).ConfigureAwait(false); Models.TableEntities.ActivityEntity newActivity = new Models.TableEntities.ActivityEntity { ActivityId = replyActivity.Id, PartitionKey = activity.From.AadObjectId, RowKey = activityReferenceId }; await this.activityStorageProvider.AddAsync(newActivity).ConfigureAwait(false); } }
/// <summary> /// Display favorite rooms. /// </summary> /// <param name="stepContext">Context object passed in to a WaterfallStep.</param> /// <param name="tokenResponse">TokenResponse object containing user AAD token.</param> /// <param name="refresh">Boolean indicating whether call is for refreshing list.</param> /// <returns>A task that represents the work queued to execute.</returns> private async Task ShowRoomsAsync(WaterfallStepContext stepContext, TokenResponse tokenResponse, bool refresh) { var activity = stepContext.Context.Activity; var startUTCTime = DateTime.UtcNow.AddMinutes(Constants.DurationGapFromNow.Minutes); var endUTCTime = startUTCTime.AddMinutes(Constants.DefaultMeetingDuration.Minutes); var userFavorites = await this.favoriteStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); RoomScheduleResponse roomsScheduleResponse = new RoomScheduleResponse { Schedules = new List <Schedule>(), }; var userConfiguration = await this.userConfigurationStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); if (userConfiguration == null) { this.telemetryClient.TrackTrace("User configuration is null in ShowRoomsAsync."); // Received empty user configuration but user has rooms in favorites table then show generic exception response and // return control back to caller. User must open task module to set time zone. if (userFavorites?.Count != 0) { await stepContext.Context.SendActivityAsync(Strings.ExceptionResponse).ConfigureAwait(false); return; } } userFavorites = await this.meetingHelper.FilterFavoriteRoomsAsync(userFavorites?.ToList()).ConfigureAwait(false); if (userFavorites?.Count > 0) { // Get schedule for favorite rooms. var startTime = TimeZoneInfo.ConvertTimeFromUtc(startUTCTime, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); var endTime = startTime.AddMinutes(Constants.DefaultMeetingDuration.Minutes); roomsScheduleResponse = await this.GetRoomsScheduleAsync(startTime, endTime, userConfiguration.IanaTimezone, userFavorites, tokenResponse.Token).ConfigureAwait(false); if (roomsScheduleResponse.ErrorResponse != null) { // Graph API returned error message. await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.ExceptionResponse)).ConfigureAwait(false); return; } foreach (var room in roomsScheduleResponse?.Schedules) { var searchedRoom = userFavorites.Where(favoriteRoom => favoriteRoom.RowKey == room.ScheduleId).FirstOrDefault(); room.RoomName = searchedRoom.RoomName; room.BuildingName = searchedRoom.BuildingName; } } // If user clicked refresh button. if (refresh) { var activityReferenceId = JObject.Parse(activity.Value.ToString()).SelectToken("activityReferenceId").ToString(); var attachment = FavoriteRoomsListCard.GetFavoriteRoomsListAttachment(roomsScheduleResponse, startUTCTime, endUTCTime, userConfiguration?.WindowsTimezone, activityReferenceId); var updateCardActivity = new Activity(ActivityTypes.Message) { Id = stepContext.Context.Activity.ReplyToId, Conversation = stepContext.Context.Activity.Conversation, Attachments = new List <Attachment> { attachment }, }; var replyActivity = await stepContext.Context.UpdateActivityAsync(updateCardActivity).ConfigureAwait(false); Models.TableEntities.ActivityEntity newActivity = new Models.TableEntities.ActivityEntity { ActivityId = replyActivity.Id, PartitionKey = activity.From.AadObjectId, RowKey = activityReferenceId }; await this.activityStorageProvider.AddAsync(newActivity).ConfigureAwait(false); } else { var activityReferenceId = Guid.NewGuid().ToString(); var attachment = FavoriteRoomsListCard.GetFavoriteRoomsListAttachment(roomsScheduleResponse, startUTCTime, endUTCTime, userConfiguration?.WindowsTimezone, activityReferenceId); var replyActivity = await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(attachment)).ConfigureAwait(false); Models.TableEntities.ActivityEntity newActivity = new Models.TableEntities.ActivityEntity { ActivityId = replyActivity.Id, PartitionKey = activity.From.AadObjectId, RowKey = activityReferenceId }; await this.activityStorageProvider.AddAsync(newActivity).ConfigureAwait(false); } }