protected override async Task OnEventActivityAsync(ITurnContext <IEventActivity> turnContext, CancellationToken cancellationToken) { var ev = turnContext.Activity.AsEventActivity(); var value = ev.Value?.ToString(); ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( turnContext, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); switch (ev.Name) { case ServiceNowEvents.Proactive: { var eventData = JsonConvert.DeserializeObject <ServiceNowNotification>(turnContext.Activity.Value.ToString()); var proactiveSubscriptions = await _subscriptionManager.GetSubscriptionByKey(turnContext, eventData.BusinessRuleName, cancellationToken); // Get list of Conversations to update from SubscriptionManager if (proactiveSubscriptions != null) { foreach (var proactiveSubscription in proactiveSubscriptions.ConversationReferences) { // Send adaptive notificaiton cards await turnContext.Adapter.ContinueConversationAsync(_botSettings.MicrosoftAppId, proactiveSubscription, ContinueConversationCallback(turnContext, eventData, proactiveSubscription), cancellationToken); } } break; } default: { await _dialog.RunAsync(turnContext, _dialogStateAccessor, cancellationToken); break; } } }
protected async Task <DialogTurnResult> CreateSubscriptionTeamsTaskModuleAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { // Send Create Ticket TaskModule Card var reply = sc.Context.Activity.CreateReply(); reply.Attachments = new List <Attachment>() { new Microsoft.Bot.Schema.Attachment() { ContentType = AdaptiveCard.ContentType, Content = SubscriptionTaskModuleAdaptiveCard.GetSubcriptionInputCard(_settings.MicrosoftAppId) } }; // Get ActivityId for purpose of mapping ResourceResponse resourceResponse = await sc.Context.SendActivityAsync(reply, cancellationToken); ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( sc.Context, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); // Store Activity and Thread Id activityReferenceMap[sc.Context.Activity.Conversation.Id] = new ActivityReference { ActivityId = resourceResponse.Id, ThreadId = sc.Context.Activity.Conversation.Id, }; await _activityReferenceMapAccessor.SetAsync(sc.Context, activityReferenceMap).ConfigureAwait(false); // Save Conversation State await _conversationState .SaveChangesAsync(sc.Context); return(await sc.EndDialogAsync()); }
/// <summary> /// Continue the conversation callback. /// </summary> /// <param name="turnContext">Turn context.</param> /// <param name="notification">Activity text.</param> /// <returns>Bot Callback Handler.</returns> private BotCallbackHandler ContinueConversationCallback(ITurnContext turnContext, ServiceNowNotification notification, ConversationReference conversationReference) { // Update Conversation return(async(turnContext, cancellationToken) => { var activity = turnContext.Activity.CreateReply(); activity.Attachments = new List <Attachment> { new Attachment { ContentType = AdaptiveCard.ContentType, Content = notification.ToAdaptiveCard() } }; EnsureActivity(activity); if (turnContext.Activity.ChannelId == Microsoft.Bot.Connector.Channels.Msteams) { // Get Activity ReferenceMap from Proactive State ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( turnContext, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); // Return Added Incident Envelope // Get saved Activity Reference mapping to conversation Id activityReferenceMap.TryGetValue(conversationReference.Conversation.Id + notification.Id, out var activityReference); // if there is no activity mapping to conversation reference // then send a new activity and save activity to activityReferenceMap if (activityReference == null) { var resourceResponse = await turnContext.SendActivityAsync(activity); // Store Activity and Thread Id mapping to ConversationReference and TicketId from eventData activityReferenceMap[conversationReference.Conversation.Id + notification.Id] = new ActivityReference { ActivityId = resourceResponse.Id, ThreadId = conversationReference.Conversation.Id, }; } else { // Update Create Ticket Button with another Adaptive card to Update/Delete Ticket await _teamsTicketUpdateActivity.UpdateTaskModuleActivityAsync( turnContext, activityReference, notification.ToAdaptiveCard(), cancellationToken); } // Save activity reference map state await _activityReferenceMapAccessor.SetAsync(turnContext, activityReferenceMap).ConfigureAwait(false); // Save Conversation State await _proactiveState .SaveChangesAsync(turnContext).ConfigureAwait(false); } else { // Not a TeamsChannel just send a conversation update await turnContext.SendActivityAsync(activity); } }); }
public async Task <TaskModuleContinueResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext context, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(context, () => new SkillState()); var activityValueObject = JObject.FromObject(context.Activity.Value); var isDataObject = activityValueObject.TryGetValue("data", StringComparison.InvariantCultureIgnoreCase, out JToken dataValue); JObject dataObject = null; if (isDataObject) { dataObject = dataValue as JObject; // Get filterUrgency var filterUrgency = dataObject.GetValue("UrgencyFilter"); // Get filterName var filterName = dataObject.GetValue("FilterName"); //// Get NotificationNamespace name var notificationNameSpace = dataObject.GetValue("NotificationNameSpace"); //// Get filterName var postNotificationAPIName = dataObject.GetValue("PostNotificationAPIName"); // Check if this BusinessRule is already created if not create proactivesubscription var isNewSubscription = await _subscriptionManager.AddSubscription(context, filterName.Value <string>(), context.Activity.GetConversationReference(), cancellationToken); // Create Managemenet object if (isNewSubscription) { var management = _serviceManager.CreateManagementForSubscription(_settings, state.AccessTokenResponse, state.ServiceCache); // Create Subscription New RESTAPI for callback from ServiceNow var response = await management.CreateNewRestMessage(notificationNameSpace.Value <string>(), postNotificationAPIName.Value <string>()); // Create Subscription BusinessRule var result = await management.CreateSubscriptionBusinessRule(filterUrgency.Value <string>(), filterName.Value <string>(), notificationNameSpace.Value <string>(), postNotificationAPIName.Value <string>()); if (result == System.Net.HttpStatusCode.OK) { var serviceNowSub = new ServiceNowSubscription { FilterName = filterName.Value <string>(), FilterCondition = "UrgencyChanges, DescriptionChanges, PriorityChanges, AssignedToChanges", NotificationNameSpace = notificationNameSpace.Value <string>(), NotificationApiName = postNotificationAPIName.Value <string>(), }; ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( context, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); // Return Added Incident Envelope // Get saved Activity Reference mapping to conversation Id activityReferenceMap.TryGetValue(context.Activity.Conversation.Id, out var activityReference); // Update Create Ticket Button with another Adaptive card to Update/Delete Ticket await _teamsTicketUpdateActivity.UpdateTaskModuleActivityAsync( context, activityReference, SubscriptionTaskModuleAdaptiveCard.BuildSubscriptionCard(serviceNowSub, _settings.MicrosoftAppId), cancellationToken); } } // Create ProactiveModel // Get Conversation from Activity var conversation = context.Activity.GetConversationReference(); // ProactiveConversationReferenceMap to save list of conversation var proactiveConversationReferenceMap = await _proactiveStateConversationReferenceMapAccessor.GetAsync( context, () => new ConversationReferenceMap(), cancellationToken) .ConfigureAwait(false); // Get Conversations from map proactiveConversationReferenceMap.TryGetValue(filterName.Value <string>(), out var listOfConversationReferences); if (listOfConversationReferences == null) { proactiveConversationReferenceMap[filterName.Value <string>()] = new List <ConversationReference> { conversation }; } else if (!listOfConversationReferences.Contains(conversation)) { listOfConversationReferences.Add(conversation); proactiveConversationReferenceMap[filterName.Value <string>()] = listOfConversationReferences; } // Save ActivityReference and ProactiveState Accessor await _proactiveStateConversationReferenceMapAccessor.SetAsync(context, proactiveConversationReferenceMap).ConfigureAwait(false); // Save Conversation State await _proactiveState.SaveChangesAsync(context, false, cancellationToken); await _conversationState.SaveChangesAsync(context, false, cancellationToken); return(new TaskModuleContinueResponse() { Value = new TaskModuleTaskInfo() { Title = "Subscription", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = SubscriptionTaskModuleAdaptiveCard.SubscriptionResponseCard($"Created Subscription With Business RuleName: {filterName} in ServiceNow") } } }); } return(new TaskModuleContinueResponse() { Value = new TaskModuleTaskInfo() { Title = "Subscription", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = SubscriptionTaskModuleAdaptiveCard.SubscriptionResponseCard("Failed To Create Subscription") } } }); }
public async Task <TaskModuleContinueResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext context, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(context, () => new SkillState()); var taskModuleMetadata = context.Activity.GetTaskModuleMetadata <TaskModuleMetadata>(); var id = taskModuleMetadata.FlowData != null? JsonConvert.DeserializeObject <Dictionary <string, object> >(JsonConvert.SerializeObject(taskModuleMetadata.FlowData)) .GetValueOrDefault("IncidentId") : null; // Convert JObject to Ticket string incidentId = (string)id; if (incidentId != null) { string ticketCloseReason = string.Empty; // Get User Input from AdatptiveCard var activityValueObject = JObject.FromObject(context.Activity.Value); var isDataObject = activityValueObject.TryGetValue("data", StringComparison.InvariantCultureIgnoreCase, out JToken dataValue); JObject dataObject = null; if (isDataObject) { dataObject = dataValue as JObject; // Get TicketCloseReason ticketCloseReason = dataObject.GetValue("IncidentCloseReason").Value <string>(); // Create Managemenet object var management = _serviceManager.CreateManagement(_settings, state.AccessTokenResponse, state.ServiceCache); // Create Ticket var result = await management.CloseTicket(incidentId, ticketCloseReason); if (result.Success) { // TODO: Figure out what should we update the incident with in order ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( context, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); activityReferenceMap.TryGetValue(context.Activity.Conversation.Id, out var activityReference); await _teamsTicketUpdateActivity.UpdateTaskModuleActivityAsync( context, activityReference, ServiceNowIncidentTaskModuleAdaptiveCardHelper.CloseIncidentCard(result.Tickets[0]), cancellationToken); // Return Closed Incident Envelope return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Deleted", Height = "small", Width = 300, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident has been Deleted") } } }); } } } // Failed to Delete Incident return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Delete Failed", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident Delete Failed") } } }); }
// Handle Submit True public async Task <TaskModuleContinueResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext context, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(context, () => new SkillState()); ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( context, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); var activityValueObject = JObject.FromObject(context.Activity.Value); var isDataObject = activityValueObject.TryGetValue("data", StringComparison.InvariantCultureIgnoreCase, out JToken dataValue); JObject dataObject = null; if (isDataObject) { dataObject = dataValue as JObject; // Get Title var title = dataObject.GetValue("IncidentTitle"); // Get Description var description = dataObject.GetValue("IncidentDescription"); // Get Urgency var urgency = dataObject.GetValue("IncidentUrgency"); // Create Managemenet object var management = _serviceManager.CreateManagement(_settings, state.AccessTokenResponse, state.ServiceCache); // Create Ticket var result = await management.CreateTicket(title.Value <string>(), description.Value <string>(), (UrgencyLevel)Enum.Parse(typeof(UrgencyLevel), urgency.Value <string>(), true)); if (result.Success) { // Return Added Incident Envelope // Get saved Activity Reference mapping to conversation Id activityReferenceMap.TryGetValue(context.Activity.Conversation.Id, out var activityReference); // Update Create Ticket Button with another Adaptive card to Update/Delete Ticket await _teamsTicketUpdateActivity.UpdateTaskModuleActivityAsync( context, activityReference, ServiceNowIncidentTaskModuleAdaptiveCardHelper.BuildIncidentCard(result.Tickets.FirstOrDefault(), _settings.MicrosoftAppId), cancellationToken); return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Created", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident has been created") } } }); } } // Failed to create incident return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Create Failed", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident Create Failed") } } }); }
public async Task <TaskModuleContinueResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext context, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(context, () => new SkillState()); var taskModuleMetadata = context.Activity.GetTaskModuleMetadata <TaskModuleMetadata>(); var ticketDetails = taskModuleMetadata.FlowData != null? JsonConvert.DeserializeObject <Dictionary <string, object> >(JsonConvert.SerializeObject(taskModuleMetadata.FlowData)) .GetValueOrDefault("IncidentDetails") : null; // Convert JObject to Ticket Ticket incidentDetails = JsonConvert.DeserializeObject <Ticket>(ticketDetails.ToString()); // If ticket is valid go ahead and update if (incidentDetails != null) { ActivityReferenceMap activityReferenceMap = await _activityReferenceMapAccessor.GetAsync( context, () => new ActivityReferenceMap(), cancellationToken) .ConfigureAwait(false); // Get Activity Id from ActivityReferenceMap activityReferenceMap.TryGetValue(context.Activity.Conversation.Id, out var activityReference); // Get User Input from AdatptiveCard var activityValueObject = JObject.FromObject(context.Activity.Value); var isDataObject = activityValueObject.TryGetValue("data", StringComparison.InvariantCultureIgnoreCase, out JToken dataValue); JObject dataObject = null; if (isDataObject) { dataObject = dataValue as JObject; // Get Title var title = dataObject.GetValue("IncidentTitle"); // Get Description var description = dataObject.GetValue("IncidentDescription"); // Get Urgency var urgency = dataObject.GetValue("IncidentUrgency"); // Create Managemenet object var management = _serviceManager.CreateManagement(_settings, state.AccessTokenResponse, state.ServiceCache); var result = await management.UpdateTicket(incidentDetails.Id, title.Value <string>(), description.Value <string>(), (UrgencyLevel)Enum.Parse(typeof(UrgencyLevel), urgency.Value <string>())); if (result.Success) { await _teamsTicketUpdateActivity.UpdateTaskModuleActivityAsync( context, activityReference, ServiceNowIncidentTaskModuleAdaptiveCardHelper.BuildIncidentCard(result.Tickets.FirstOrDefault(), _settings.MicrosoftAppId), cancellationToken); // Return Added Incident Envelope return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Updated", Height = "small", Width = 300, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident has been Updated") } } }); } } } // Failed to update incident return(new TaskModuleContinueResponse() { Type = "continue", Value = new TaskModuleTaskInfo() { Title = "Incident Update Failed", Height = "medium", Width = 500, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = ServiceNowIncidentTaskModuleAdaptiveCardHelper.IncidentResponseCard("Incident Update Failed") } } }); }