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);
            }
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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);
            }
        }