/// <summary>
 /// Handles O365 connector card action queries.
 /// </summary>
 /// <param name="turnContext">The turn context.</param>
 /// <param name="query">Incoming request from Bot Framework.</param>
 /// <returns>Task tracking operation.</returns>
 private static async Task HandleO365ConnectorCardActionQuery(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query)
 {
     // Get O365 connector card query data.
     O365ConnectorCardActionQuery o365CardQuery = query;
     var Text = $"Thanks, {turnContext.Activity.From.Name}\nYour input action ID:{o365CardQuery.ActionId}\nYour input body:{o365CardQuery.Body}";
     await turnContext.SendActivityAsync(Text);
 }
        public void O365ConnectorCardActionQueryInitsWithNoArgs()
        {
            var actionQuery = new O365ConnectorCardActionQuery();

            Assert.NotNull(actionQuery);
            Assert.IsType <O365ConnectorCardActionQuery>(actionQuery);
        }
示例#3
0
        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            try
            {
                if (o365CardQuery.ActionId == Constants.ShowAirCraftDetails)
                {
                    AirCraftDetails aircraftInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <AirCraftDetails>(o365CardQuery.Body);
                    await ShowAircraftDetails(aircraftInfo, replyActivity);

                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    await connector.Conversations.ReplyToActivityAsync(replyActivity);
                }
                else
                {
                    await Conversation.SendAsync(activity, () => new EchoBot());
                }
            }
            catch (Exception e)
            {
                activity.CreateReply(e.Message.ToString());
            }

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
示例#4
0
        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            try
            {
                if (o365CardQuery.ActionId == Constants.Name)
                {
                    var Name = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                    await AttachBaggageInformationName(Name.Value, replyActivity);

                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    await connector.Conversations.ReplyToActivityAsync(replyActivity);
                }
                else
                {
                    await Conversation.SendAsync(activity, () => new EchoBot());
                }
            }
            catch (Exception e)
            {
                activity.CreateReply(e.Message.ToString());
            }
            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            switch (o365CardQuery.ActionId)
            {
            case Constants.ShowFlights:
                FlightInputDetails flightInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <FlightInputDetails>(o365CardQuery.Body);
                flightInfo.JourneyDate = flightInfo.JourneyDate + activity.LocalTimestamp.Value.Offset;
                await ShowFlightInfo(flightInfo, replyActivity);

                break;

            case Constants.Rebook:
                RebookClass rebookFlight = Newtonsoft.Json.JsonConvert.DeserializeObject <RebookClass>(o365CardQuery.Body);
                await AttachRebookPassenger(rebookFlight.flightNumberInput, rebookFlight.pnrNumberInput, replyActivity);

                break;

            default:
                break;
            }
            await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
示例#6
0
        private async Task HandleInvoke(IDialogContext context, IMessageActivity message)
        {
            var activity        = (Activity)message;
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            //string savedMessageId;
            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            switch (o365CardQuery.ActionId)
            {
            case Constants.newInventoryCount:
                InventoryInputDetails itemCount = Newtonsoft.Json.JsonConvert.DeserializeObject <InventoryInputDetails>(o365CardQuery.Body);
                await AddItems(itemCount, replyActivity);

                break;

            case Constants.BlockInventory:
                InventoryInputDetails blockItem = Newtonsoft.Json.JsonConvert.DeserializeObject <InventoryInputDetails>(o365CardQuery.Body);
                await BlockItems(blockItem, replyActivity);

                break;

            case Constants.RetireInventory:
                InventoryInputDetails retireitemcount = Newtonsoft.Json.JsonConvert.DeserializeObject <InventoryInputDetails>(o365CardQuery.Body);
                await RetireItems(retireitemcount, replyActivity);

                break;

            case Constants.RequestNewStock:
                await AttachNewStock(replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            default:
                break;
            }

            if (context.ConversationData.TryGetValue(LastMessageIdKey, out savedMessageId))
            {
                try
                {
                    var resource = await connectorClient.Conversations.UpdateActivityAsync(replyActivity.Conversation.Id, savedMessageId, replyActivity);

                    savedMessageId = resource.Id;
                }
                catch (Exception e)
                {
                    var resource = e.Message.ToString();
                }
            }
            else
            {
                var resource = await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

                savedMessageId = resource.Id;
            }
            context.ConversationData.SetValue(LastMessageIdKey, savedMessageId);
        }
        /// <summary>
        /// Handles O365 connector card action queries.
        /// </summary>
        /// <param name="activity">Incoming request from Bot Framework.</param>
        /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param>
        /// <returns>Task tracking operation.</returns>

        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();

            Activity replyActivity = activity.CreateReply();

            replyActivity.TextFormat = "xml";

            replyActivity.Text = $@"

            <h2>Thanks, {activity.From.Name}</h2><br/>

            <h3>Your input action ID:</h3><br/>

            <pre>{o365CardQuery.ActionId}</pre><br/>

            <h3>Your input body:</h3><br/>

            <pre>{o365CardQuery.Body}</pre>

        ";

            await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
        private async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

            var userInfo = UserInfoRepository.GetUserInfo(activity.From.Id);

            // Validate for Sing In
            if (userInfo == null || userInfo.ExpiryTime < DateTime.Now)
            {
                var        reply  = activity.CreateReply();
                SigninCard plCard = RootDialog.GetSignInCard();
                reply.Attachments.Add(plCard.ToAttachment());
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(reply);

                return(new HttpResponseMessage(System.Net.HttpStatusCode.OK));
            }

            var email  = string.Empty;
            var member = connectorClient.Conversations.GetConversationMembersAsync(activity.Conversation.Id).Result.AsTeamsChannelAccounts().FirstOrDefault();

            if (member != null)
            {
                email = member.Email;
            }


            // Get O365 connector card query data.
            Task <Task> task = new Task <Task>(async() =>
            {
                O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
                Activity replyActivity = activity.CreateReply();
                switch (o365CardQuery.ActionId)
                {
                case "Custom":
                    // Get Passenger List & Name
                    var teamDetails = Newtonsoft.Json.JsonConvert.DeserializeObject <CustomTeamData>(o365CardQuery.Body);
                    await CreateTeam(connectorClient, activity, userInfo, teamDetails.TeamName, teamDetails.Members.Split(';').ToList());
                    break;

                case "Flight":
                    var flightDetails = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);


                    await CreateTeam(connectorClient, activity, userInfo, "Flight-" + flightDetails.Value, GetMemberList(email));
                    // await AttachClassWisePassengerList(classInfo.Value, replyActivity, $"Passengers with {classInfo.Value} tickets");
                    break;

                default:
                    break;
                }
            });

            task.Start();

            return(new HttpResponseMessage(System.Net.HttpStatusCode.OK));
        }
        public void O365ConnectorCardActionQueryInits()
        {
            var body     = "body";
            var actionId = "ActionCard";

            var actionQuery = new O365ConnectorCardActionQuery(body, actionId);

            Assert.NotNull(actionQuery);
            Assert.IsType <O365ConnectorCardActionQuery>(actionQuery);
            Assert.Equal(body, actionQuery.Body);
            Assert.Equal(actionId, actionQuery.ActionId);
        }
        /// <summary>
        /// Handles O365 connector card action queries.
        /// </summary>
        /// <param name="activity">Incoming request from Bot Framework.</param>
        /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param>
        /// <returns>Task tracking operation.</returns>

        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            switch (o365CardQuery.ActionId)
            {
            case Constants.All:
                await AttachAllPassengerList(replyActivity, "All passengers");

                break;

            case Constants.ClassWise:
                var classInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachClassWisePassengerList(classInfo.Value, replyActivity, $"Passengers with {classInfo.Value} tickets");

                break;

            case Constants.Zone:
                var zoneInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachZoneWisePassengerList(zoneInfo.Value, replyActivity, $"Passengers who belongs to zone {zoneInfo.Value}");

                break;

            case Constants.FrequentFlyer:
                await AttachFrequentFlyerPassengerList(replyActivity, "Frequent flyer passengers");

                break;

            case Constants.SeatNumber:
                var seatNo = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachPassengerOnSpecifiedSeat(seatNo.Value, replyActivity);

                break;

            case Constants.SpecialAssistance:
                await AttachPassengerWhoNeedSpecialAssistance(replyActivity, "Passengers who need special assistance");

                break;

            default:
                break;
            }

            await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
        private static async Task <HttpResponseMessage> HandleO365ConnectorCardActionQuery(Activity activity)
        {
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            try
            {
                if (o365CardQuery.ActionId == Constants.Industry)
                {
                    var industryCode = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                    await ShowProductInfo(industryCode.Value, replyActivity);

                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    await connector.Conversations.ReplyToActivityAsync(replyActivity);
                }
            }
            catch (Exception e)
            {
                activity.CreateReply(e.Message.ToString());
            }
            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
 /// <summary>
 /// Invoked when a O365 Connector Card Action activity is received from the connector.
 /// </summary>
 /// <param name="turnContext">A strongly-typed context object for this turn.</param>
 /// <param name="query">The O365 connector card HttpPOST invoke query.</param>
 /// <param name="cancellationToken">A cancellation token that can be used by other objects
 /// or threads to receive notice of cancellation.</param>
 /// <returns>A task that represents the work queued to execute.</returns>
 protected virtual Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     throw new InvokeResponseException(HttpStatusCode.NotImplemented);
 }
示例#13
0
 /// <summary>
 /// Handles the o365 connector card action asynchronously.
 /// </summary>
 /// <param name="turnContext">The turn context.</param>
 /// <param name="query">The o365 connector card action action.</param>
 /// <returns>Task tracking operation.</returns>
 public virtual Task <InvokeResponse> HandleO365ConnectorCardActionAsync(ITurnContext turnContext, O365ConnectorCardActionQuery query)
 {
     return(Task.FromResult <InvokeResponse>(null));
 }
 protected virtual Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     return(Task.CompletedTask);
 }
 protected override async Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     await turnContext.SendActivityAsync(MessageFactory.Text($"O365ConnectorCardActionQuery event value: {JsonConvert.SerializeObject(query)}"));
 }
示例#16
0
        private async Task HandleConnectorAction(IDialogContext context, Activity message)
        {
            O365ConnectorCardActionQuery o365CardQuery = message.GetO365ConnectorCardActionQueryData();
            O365ConnectorActionRequest   actionInfo    = Newtonsoft.Json.JsonConvert.DeserializeObject <O365ConnectorActionRequest>(o365CardQuery.Body);

            Activity reply = message.CreateReply();

            switch (actionInfo.Value)
            {
            case "Weather":
                reply.Attachments.Add(GetWeatherCard());
                break;

            case "OperationsDelay":
                reply.Attachments.Add(GetOperationsDelayCard());
                break;

            case "SocialEvents":
                List <Attachment> events = GetSocialEvents();
                foreach (var evnt in events)
                {
                    reply.Attachments.Add(evnt);
                }
                reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                break;

            default:
                break;
            }

            MicrosoftAppCredentials.TrustServiceUrl(message.ServiceUrl, DateTime.MaxValue);
            ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));

            reply.ChannelData = new TeamsChannelData()
            {
                Notification = new NotificationInfo(true)
            };

            var lastMessageId = context.ConversationData.GetValueOrDefault <string>(actionInfo.ActionId);

            if (lastMessageId == null && privateStorage.ContainsKey(actionInfo.ActionId))
            {
                lastMessageId = privateStorage[actionInfo.ActionId];
            }
            if (!string.IsNullOrEmpty(lastMessageId))
            {
                // Update existing item.
                await connector.Conversations.UpdateActivityAsync(reply.Conversation.Id, lastMessageId, reply);

                context.ConversationData.RemoveValue(actionInfo.ActionId);
                if (privateStorage.ContainsKey(actionInfo.ActionId))
                {
                    privateStorage.Remove(actionInfo.ActionId);
                }

                // Send private messages.
                if (!string.IsNullOrEmpty(actionInfo.Members))
                {
                    // Send private message to these users.
                    var members = actionInfo.Members.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                    if (members.Any(x => x.Contains("ALL TEAM")))
                    {
                        // Provide option to send message to all members.
                        var channelData = message.GetChannelData <TeamsChannelData>();
                        if (context.ConversationData.ContainsKey(channelData.Channel.Id))
                        {
                            members = context.ConversationData.GetValue <List <string> >(channelData.Channel.Id).ToArray();
                            context.ConversationData.RemoveValue(channelData.Channel.Id);
                        }
                        else
                        {
                            IList <ChannelAccount> allMembers = await GetAllMembers(connector, channelData);

                            members = allMembers.Select(m => m.Id).ToArray();
                        }
                    }
                    foreach (var memberId in members)
                    {
                        // Create or get existing chat conversation with user
                        try
                        {
                            await SendNotification(context, reply, memberId, actionInfo.Value);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                    }
                }
            }
        }
示例#17
0
 protected override Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     Record.Add(MethodBase.GetCurrentMethod().Name);
     return(Task.CompletedTask);
 }
示例#18
0
        private async Task HandleInvoke(IDialogContext context, IMessageActivity message)
        {
            var activity        = (Activity)message;
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            Activity replyActivity = activity.CreateReply();

            switch (o365CardQuery.ActionId)
            {
            case Constants.PNR:
                var PNRno = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachBaggagebyPNR(PNRno.Value, replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            case Constants.TicketNumber:
                var Ticketno = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachBaggageInformationTicket(Ticketno.Value, replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            case Constants.Name:
                var Name = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachBaggageInformationName(Name.Value, replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            case Constants.DetailsofCheckedBaggage:
                var PNRno1 = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body).Value;
                await AttachBaggageInformation(PNRno1, replyActivity);

                break;

            case Constants.CurrentStatus:
                var PNRno2 = Newtonsoft.Json.JsonConvert.DeserializeObject <O365BodyValue>(o365CardQuery.Body);
                await AttachBaggageInformation(PNRno2.Value, replyActivity);

                break;

            case Constants.RebookBaggage:
                RebookClass NewFlightTicketNumber = Newtonsoft.Json.JsonConvert.DeserializeObject <RebookClass>(o365CardQuery.Body);
                await AttachRebookInformation(NewFlightTicketNumber.flightNumberInput, replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            case Constants.ReportMissing:
                await AttachReportMissing(replyActivity);

                context.ConversationData.RemoveValue(LastMessageIdKey);
                break;

            default:
                break;
            }

            string savedMessageId;

            if (context.ConversationData.TryGetValue(LastMessageIdKey, out savedMessageId))
            {
                try
                {
                    var resource = await connectorClient.Conversations.UpdateActivityAsync(replyActivity.Conversation.Id, savedMessageId, replyActivity);

                    savedMessageId = resource.Id;
                }
                catch (Exception e)
                {
                    var resource = e.Message.ToString();
                }
            }
            else
            {
                var resource = await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

                savedMessageId = resource.Id;
            }
            context.ConversationData.SetValue(LastMessageIdKey, savedMessageId);
        }
 protected virtual Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }
 /// <summary>
 /// Invoked when the user submit any action from O365 Connector Card.
 /// </summary>
 /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param>
 /// <param name="query">Contains O365 Connector Card query keywords.</param>
 /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param>
 /// <returns>A task that represents the work queued to execute.</returns>
 protected override async Task OnTeamsO365ConnectorCardActionAsync(ITurnContext <IInvokeActivity> turnContext, O365ConnectorCardActionQuery query, CancellationToken cancellationToken)
 {
     await HandleO365ConnectorCardActionQuery(turnContext, query);
 }
示例#21
0
        private async Task HandleInvoke(IDialogContext context, IMessageActivity message)
        {
            var activity        = (Activity)message;
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            //string savedMessageId;
            // Get O365 connector card query data.
            O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
            AirCraftDetails actionInfo    = Newtonsoft.Json.JsonConvert.DeserializeObject <AirCraftDetails>(o365CardQuery.Body);
            Activity        replyActivity = activity.CreateReply();


            switch (o365CardQuery.ActionId)
            {
            case Constants.Assignaircraft:
                AirCraftDetails assignairCraftInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <AirCraftDetails>(o365CardQuery.Body);


                await AttachAssignairCraft(assignairCraftInfo, replyActivity);

                break;

            case Constants.MarkGrounded:
                AirCraftDetails groundedAirCraftInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <AirCraftDetails>(o365CardQuery.Body);

                await MarkGroundedAirCraft(groundedAirCraftInfo, replyActivity);

                break;

            case Constants.Available:
                AirCraftDetails freeAirCraftInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <AirCraftDetails>(o365CardQuery.Body);

                await MarkFreeAirCraft(freeAirCraftInfo, replyActivity);

                break;

            default:
                break;
            }



            var lastMessageId = context.ConversationData.GetValueOrDefault <string>(actionInfo.ActionId);

            if (lastMessageId == null && privateStorage.ContainsKey(actionInfo.ActionId))
            {
                lastMessageId = privateStorage[actionInfo.ActionId];
            }
            if (!string.IsNullOrEmpty(lastMessageId))
            {
                // Update existing item.
                await connectorClient.Conversations.UpdateActivityAsync(replyActivity.Conversation.Id, lastMessageId, replyActivity);

                context.ConversationData.RemoveValue(actionInfo.ActionId);
                //if (privateStorage.ContainsKey(Actionid))
                //    privateStorage.Remove(Actionid);
            }
            else
            {
                await connectorClient.Conversations.SendToConversationAsync(replyActivity);
            }
        }
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
            }
            else if (activity.Type == ActivityTypes.Invoke)
            {
                // ComposeExtension query
                if (activity.IsComposeExtensionQuery())
                {
                    // TODO: Handle your compose extension request
                    ComposeExtensionResponse invokeResponse = new ComposeExtensionResponse()
                    {
                        ComposeExtension = new ComposeExtensionResult()
                    };
                    return(Request.CreateResponse(HttpStatusCode.OK, invokeResponse));
                }
                //Actionable Message
                else if (activity.IsO365ConnectorCardActionQuery())
                {
                    // TODO: Handle your actionable message here
                    var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
                    O365ConnectorCardActionQuery o365CardQuery = activity.GetO365ConnectorCardActionQueryData();
                    Activity replyActivity = activity.CreateReply();
                    replyActivity.TextFormat = "xml";
                    replyActivity.Text       = $@"
                        <h2>Thanks, {activity.From.Name}</h2><br/>
                        <h3>Your input action ID:</h3><br/>
                        <pre>{o365CardQuery.ActionId}</pre><br/>
                        <h3>Your input body:</h3><br/>
                        <pre>{o365CardQuery.Body}</pre>";
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

                    return(Request.CreateResponse(HttpStatusCode.OK));
                }
                // PopUp SignIn
                else if (activity.Name == "signin/verifyState")
                {
                    // TODO: Handle your PopUp SignIn request
                    var      connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
                    Activity replyActivity   = activity.CreateReply();
                    replyActivity.Text = $@"Authentication Successful";
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);

                    return(Request.CreateResponse(HttpStatusCode.OK));
                }
                // Handle other invoke requests
                else
                {
                    // Parse the invoke value and change the message activity as well - useful if you've got action buttons which postback
                    return(Request.CreateResponse(HttpStatusCode.OK));
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }