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;
            }
            }
        }
Exemple #2
0
        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);
                }
            });
        }
Exemple #4
0
        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")
                    }
                }
            });
        }
Exemple #6
0
        // 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")
                    }
                }
            });
        }