// Get incident review card send from messaging extension.
        public static Attachment GetIncidentReviewCard(IncidentDetails incidentDetail)
        {
            string[]             paths            = { ".", "Resources", "reviewCard.json" };
            var                  adaptiveCardJson = File.ReadAllText(Path.Combine(paths));
            AdaptiveCardTemplate template         = new AdaptiveCardTemplate(adaptiveCardJson);
            var                  payloadData      = new
            {
                incidentTitle  = incidentDetail.IncidentTitle,
                assignedTo     = incidentDetail.AssignedToName,
                category       = incidentDetail.Category,
                subCategory    = incidentDetail.SubCategory,
                createdBy      = incidentDetail.CreatedBy,
                assignedToName = incidentDetail.AssignedToName,
                userMRI        = incidentDetail.AssignedToMRI,
                incidentId     = incidentDetail.IncidentId
            };
            var cardJsonString         = template.Expand(payloadData);
            var adaptiveCardAttachment = new Attachment()
            {
                ContentType = AdaptiveCard.ContentType,
                Content     = JsonConvert.DeserializeObject(cardJsonString),
            };

            return(adaptiveCardAttachment);
        }
Example #2
0
        protected override async Task <InvokeResponse> OnInvokeActivityAsync(ITurnContext <IInvokeActivity> turnContext, CancellationToken cancellationToken)
        {
            List <IncidentDetails> currentIncidentList = new List <IncidentDetails>();

            incidentDetailsList.TryGetValue("incidentList", out currentIncidentList);

            if (turnContext.Activity.Name == "composeExtension/submitAction")
            {
                var asJobject    = JObject.FromObject(turnContext.Activity.Value);
                var data         = (object)asJobject.ToObject <CardTaskFetchValue <object> >()?.Data;
                var botInstalled = (object)JObject.Parse(data.ToString()).ToObject <CardTaskFetchValue <object> >()?.MsTeams;

                if (botInstalled != null)
                {
                    return(GetIncientListFromMEAction(currentIncidentList));
                }
                else
                {
                    var incidentId     = (string)JObject.Parse(data.ToString()).ToObject <CardTaskFetchValue <string> >()?.IncidentId;
                    var incidentDetail = currentIncidentList.FirstOrDefault(incident => incident.IncidentId.ToString() == incidentId);
                    await turnContext.SendActivityAsync(MessageFactory.Attachment(CardHelper.GetIncidentReviewCard(incidentDetail)));

                    return(CreateInvokeResponse());
                }
            }

            if (turnContext.Activity.Name == "composeExtension/fetchTask")
            {
                try
                {
                    // Check if your app is installed by fetching member information.
                    var member = await TeamsInfo.GetMemberAsync(turnContext, turnContext.Activity.From.Id, cancellationToken);

                    return(GetIncientListFromMEAction(currentIncidentList));
                }
                catch (ErrorResponseException ex)
                {
                    if (ex.Body.Error.Code == "BotNotInConversationRoster")
                    {
                        string[] paths                  = { ".", "Resources", "justInTimeInstall.json" };
                        var      adaptiveCardJson       = File.ReadAllText(Path.Combine(paths));
                        var      adaptiveCardAttachment = new Attachment()
                        {
                            ContentType = AdaptiveCard.ContentType,
                            Content     = JsonConvert.DeserializeObject(adaptiveCardJson),
                        };

                        return(CreateInvokeResponse(new MessagingExtensionActionResponse
                        {
                            Task = new TaskModuleContinueResponse
                            {
                                Value = new TaskModuleTaskInfo
                                {
                                    Card = adaptiveCardAttachment,
                                    Height = 200,
                                    Width = 400,
                                    Title = "Bot is not installed",
                                },
                            },
                        }));
                    }
                }
            }

            if (turnContext.Activity.Name == "adaptiveCard/action")
            {
                var    data = JsonConvert.DeserializeObject <InitialSequentialCard>(turnContext.Activity.Value.ToString());
                string verb = data.action.verb;
                AdaptiveCardInvokeResponse adaptiveCardResponse;
                string  cardJson;
                JObject response;
                switch (verb)
                {
                case "initialRefresh":
                    string[] initialCard       = { ".", "Resources", "firstCard.json" };
                    var      members           = new List <TeamsChannelAccount>();
                    string   continuationToken = null;
                    do
                    {
                        var currentPage = await TeamsInfo.GetPagedMembersAsync(turnContext, 100, continuationToken, cancellationToken);

                        continuationToken = currentPage.ContinuationToken;
                        members.AddRange(currentPage.Members);
                    }while (continuationToken != null);

                    foreach (var member in members)
                    {
                        if (member.AadObjectId != turnContext.Activity.From.AadObjectId)
                        {
                            var newMemberInfo = new Info {
                                value = member.AadObjectId, title = member.Name
                            };
                            memberDetails.Add(newMemberInfo);
                        }
                    }

                    adaptiveCardResponse = GetNextActionCard(initialCard, data);

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "firstCard":
                    string[] firstCard    = { ".", "Resources", "secondCard.json" };
                    var      assigneeInfo = await TeamsInfo.GetMemberAsync(turnContext, data.action.data.AssignedTo, cancellationToken);

                    data.action.data.UserMRI = assigneeInfo.Id;
                    adaptiveCardResponse     = GetNextActionCard(firstCard, data);

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "secondCard":
                    string[] secondCard = { ".", "Resources", "thirdCard.json" };

                    if (data.action.data.Category == "Software")
                    {
                        adaptiveCardResponse = GetNextActionCard(secondCard, data, Constants.Software);
                    }
                    else
                    {
                        adaptiveCardResponse = GetNextActionCard(secondCard, data, Constants.Hardware);
                    }

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "thirdCard":
                    var initiator = await TeamsInfo.GetMemberAsync(turnContext, data.action.data.AssignedTo, cancellationToken);

                    data.action.data.AssignedToName = initiator.Name;
                    var incidentDetail = new IncidentDetails
                    {
                        IncidentId     = Guid.NewGuid(),
                        CreatedBy      = turnContext.Activity.From.Name,
                        AssignedToMRI  = data.action.data.UserMRI,
                        AssignedToName = data.action.data.AssignedToName,
                        Category       = data.action.data.Category,
                        IncidentTitle  = data.action.data.IncidentTitle,
                        SubCategory    = data.action.data.SubCategory
                    };

                    data.action.data.IncidentId = incidentDetail.IncidentId;
                    string[] thirdCard          = { ".", "Resources", "reviewCard.json" };
                    var      responseAttachment = CardHelper.GetResponseAttachment(thirdCard, data, out cardJson);
                    Activity pendingActivity    = new Activity();
                    pendingActivity.Type        = "message";
                    pendingActivity.Id          = turnContext.Activity.ReplyToId;
                    pendingActivity.Attachments = new List <Attachment> {
                        responseAttachment
                    };
                    await turnContext.UpdateActivityAsync(pendingActivity);

                    response             = JObject.Parse(cardJson);
                    adaptiveCardResponse = new AdaptiveCardInvokeResponse()
                    {
                        StatusCode = 200,
                        Type       = AdaptiveCard.ContentType,
                        Value      = response
                    };

                    if (currentIncidentList == null)
                    {
                        currentIncidentList = new List <IncidentDetails> {
                            incidentDetail
                        };
                    }
                    else
                    {
                        List <IncidentDetails> incidentList = new List <IncidentDetails>();
                        incidentList = currentIncidentList;
                        incidentList.Add(incidentDetail);
                        currentIncidentList = incidentList;
                    }
                    incidentDetailsList.AddOrUpdate("incidentList", currentIncidentList, (key, value) => currentIncidentList);

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "refresh":

                    string[] assignedToCard = { ".", "Resources", "assignedToCard.json" };
                    adaptiveCardResponse = GetNextActionCard(assignedToCard, data);

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "approved":

                    string[] approvedCard       = { ".", "Resources", "approvedCard.json" };
                    var      approvedAttachment = CardHelper.GetResponseAttachment(approvedCard, data, out cardJson);
                    Activity approvedActivity   = new Activity();
                    approvedActivity.Type        = "message";
                    approvedActivity.Id          = turnContext.Activity.ReplyToId;
                    approvedActivity.Attachments = new List <Attachment> {
                        approvedAttachment
                    };
                    await turnContext.UpdateActivityAsync(approvedActivity);

                    response             = JObject.Parse(cardJson);
                    adaptiveCardResponse = new AdaptiveCardInvokeResponse()
                    {
                        StatusCode = 200,
                        Type       = AdaptiveCard.ContentType,
                        Value      = response
                    };

                    return(CreateInvokeResponse(adaptiveCardResponse));

                case "rejected":

                    string[] rejectedCard       = { ".", "Resources", "rejectedCard.json" };
                    var      rejectedAttachment = CardHelper.GetResponseAttachment(rejectedCard, data, out cardJson);
                    Activity rejectedActivity   = new Activity();
                    rejectedActivity.Type        = "message";
                    rejectedActivity.Id          = turnContext.Activity.ReplyToId;
                    rejectedActivity.Attachments = new List <Attachment> {
                        rejectedAttachment
                    };
                    await turnContext.UpdateActivityAsync(rejectedActivity);

                    response             = JObject.Parse(cardJson);
                    adaptiveCardResponse = new AdaptiveCardInvokeResponse()
                    {
                        StatusCode = 200,
                        Type       = AdaptiveCard.ContentType,
                        Value      = response
                    };

                    return(CreateInvokeResponse(adaptiveCardResponse));
                }
            }

            return(null);
        }