public async Task <IActionResult> SubmitTaskForIOS([FromBody] MeetingViewModel valuesFromTaskModule) { var conversationReference = _conversationReferences[valuesFromTaskModule.UserAdObjectId]; await((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, async(turnContext, cancellationToken) => { var activity = turnContext.Activity; var userConfiguration = await this.userConfigurationStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); if (userConfiguration == null) { this.telemetryClient.TrackTrace("User configuration is null in task module submit action."); await turnContext.SendActivityAsync(Strings.ExceptionResponse).ConfigureAwait(false); return; } var message = valuesFromTaskModule.Text; var replyToId = valuesFromTaskModule.ReplyTo; if (message.Equals(BotCommands.MeetingFromTaskModule, StringComparison.OrdinalIgnoreCase)) { var attachment = SuccessCard.GetSuccessAttachment(valuesFromTaskModule, userConfiguration.WindowsTimezone); var activityFromStorage = await this.activityStorageProvider.GetAsync(activity.From.AadObjectId, replyToId).ConfigureAwait(false); if (!string.IsNullOrEmpty(replyToId)) { var updateCardActivity = new Activity(ActivityTypes.Message) { Id = activityFromStorage.ActivityId, Conversation = activity.Conversation, Attachments = new List <Attachment> { attachment }, }; await turnContext.UpdateActivityAsync(updateCardActivity).ConfigureAwait(false); } await turnContext.SendActivityAsync(MessageFactory.Text(string.Format(CultureInfo.CurrentCulture, Strings.RoomBooked, valuesFromTaskModule.RoomName)), cancellationToken).ConfigureAwait(false); } else { if (!string.IsNullOrEmpty(replyToId)) { await this.UpdateFavouriteCardAsync(turnContext, replyToId).ConfigureAwait(false); } } return; }, default(CancellationToken)); // Let the caller know proactive messages have been sent return(this.Ok()); }
/// <summary> /// Create meeting as per room selection by user. /// </summary> /// <param name="stepContext">Context object passed in to a WaterfallStep.</param> /// <param name="tokenResponse">Token response object containing Active Directory access token.</param> /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param> /// <returns>A task that represents the work queued to execute.</returns> private async Task CreateEventAsync(WaterfallStepContext stepContext, TokenResponse tokenResponse, CancellationToken cancellationToken) { var activity = stepContext.Context.Activity; string available = "Available"; var userConfiguration = await this.userConfigurationStorageProvider.GetAsync(activity.From.AadObjectId).ConfigureAwait(false); if (userConfiguration == null) { this.telemetryClient.TrackTrace("User configuration is null in CreateEventAsync."); await stepContext.Context.SendActivityAsync(Strings.ExceptionResponse).ConfigureAwait(false); return; } var selectedMeetingValues = JsonConvert.DeserializeObject <MeetingViewModel>(activity.Value.ToString()); var startUTCDateTime = DateTime.Parse(selectedMeetingValues.StartDateTime, null, DateTimeStyles.RoundtripKind); var endUTCDateTime = DateTime.Parse(selectedMeetingValues.EndDateTime, null, DateTimeStyles.RoundtripKind); var currentDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); var startDateTime = TimeZoneInfo.ConvertTimeFromUtc(startUTCDateTime, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); var endDateTime = TimeZoneInfo.ConvertTimeFromUtc(endUTCDateTime, TimeZoneInfo.FindSystemTimeZoneById(userConfiguration.WindowsTimezone)); if (currentDateTime.Subtract(startDateTime).TotalMinutes > Constants.DurationGapFromNow.Minutes) { await this.RefreshFavoriteCardAsync(stepContext).ConfigureAwait(false); await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.Expired), cancellationToken).ConfigureAwait(false); } else { if (!selectedMeetingValues.Status.Equals(available, StringComparison.OrdinalIgnoreCase)) { await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.RoomUnavailable), cancellationToken).ConfigureAwait(false); } else { var roomsScheduleResponse = await this.GetRoomsScheduleAsync( startDateTime, endDateTime, localTimeZone : userConfiguration.IanaTimezone, rooms : new List <UserFavoriteRoomEntity> { new UserFavoriteRoomEntity { RowKey = selectedMeetingValues.RoomEmail }, }, tokenResponse.Token).ConfigureAwait(false); if (roomsScheduleResponse.ErrorResponse != null) { // Graph API returned error message. await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.ExceptionResponse)).ConfigureAwait(false); return; } if (roomsScheduleResponse?.Schedules?.FirstOrDefault()?.ScheduleItems?.Count != 0) { await this.RefreshFavoriteCardAsync(stepContext).ConfigureAwait(false); await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.RoomUnavailable), cancellationToken).ConfigureAwait(false); } else { CreateEventRequest request = new CreateEventRequest() { Attendees = new List <Attendee>(), Body = new Body { Content = Strings.MeetingBody, ContentType = "HTML" }, End = new DateTimeAndTimeZone { DateTime = endDateTime, TimeZone = userConfiguration.IanaTimezone }, Start = new DateTimeAndTimeZone { DateTime = startDateTime, TimeZone = userConfiguration.IanaTimezone }, Subject = selectedMeetingValues.Subject, Location = new Location { DisplayName = selectedMeetingValues.RoomName }, }; request.Attendees.Add(new Attendee { EmailAddress = new EmailAddress { Address = selectedMeetingValues.RoomEmail, Name = selectedMeetingValues.RoomName }, Type = "required" }); var meetingResponse = await this.meetingProvider.CreateMeetingAsync(request, tokenResponse.Token).ConfigureAwait(false); if (meetingResponse.ErrorResponse != null) { // Graph API returned error message. await stepContext.Context.SendActivityAsync(MessageFactory.Text(Strings.ExceptionResponse), cancellationToken).ConfigureAwait(false); return; } this.telemetryClient.TrackEvent("Meeting created", new Dictionary <string, string>() { { "User", activity.From.AadObjectId }, { "Room", selectedMeetingValues.RoomEmail } }); var updateCardActivity = new Activity(ActivityTypes.Message) { Id = stepContext.Context.Activity.ReplyToId, Conversation = stepContext.Context.Activity.Conversation, Attachments = new List <Attachment> { SuccessCard.GetSuccessAttachment( new MeetingViewModel { MeetingId = meetingResponse.Id, RoomName = selectedMeetingValues.RoomName, BuildingName = selectedMeetingValues.BuildingName, WebLink = meetingResponse.WebLink, StartDateTime = selectedMeetingValues.StartDateTime, EndDateTime = selectedMeetingValues.EndDateTime, IsFavourite = true, }, userConfiguration.WindowsTimezone), }, }; await stepContext.Context.UpdateActivityAsync(updateCardActivity, cancellationToken).ConfigureAwait(false); await stepContext.Context.SendActivityAsync(MessageFactory.Text(string.Format(CultureInfo.CurrentCulture, Strings.RoomBooked, selectedMeetingValues.RoomName)), cancellationToken).ConfigureAwait(false); } } } }