public static async Task EchoMessage(ConnectorClient connector, Activity activity)
        {
            var message = activity.GetTextWithoutMentions();

            if (string.Compare(message, "hello", true) == 0 || string.Compare(message, "help", true) == 0)
            {
                // Send help message
                var response = activity.CreateReply();
                response.Text = "Hi! I am the Event Management bot for Dev Days 2019 happening in Taiwan. Ask me questions about the event and I can help you find answers Ask me questions like \n\n" +
                                "   *\r What is the venue? \r\n\n" +
                                "   *\r What tracks are available? \r\n\n" +
                                "   *\r Do we have workshops planned? \n\n".Replace("\n", Environment.NewLine);
                await connector.Conversations.ReplyToActivityWithRetriesAsync(response);

                return;
            }
            //if(string.Compare(message, "feedback", true) == 0)
            //{
            //    var replyy = activity.CreateReply();
            //    var cardRes = CardResponse();
            //    replyy.Attachments.Add(cardRes);
            //    await connector.Conversations.ReplyToActivityWithRetriesAsync(replyy);
            //    return;
            //}
            Helperr helper      = new Helperr();
            var     userInput   = activity.GetTextWithoutMentions();
            var     reply       = activity.CreateReply();
            var     apiResponse = await helper.GetQnAAnswer(userInput);

            if (!string.IsNullOrEmpty(apiResponse))
            {
                QnAAnswer ans    = (new JavaScriptSerializer().Deserialize <QnAAnswer>(apiResponse));
                var       answer = ans.answers.FirstOrDefault();
                if (answer != null)
                {
                    if (answer.answer == "No good match found in KB.")
                    {
                        reply.Text = "Sorry! I do not have answer to this question. Please ask me questions about events";
                    }
                    else
                    {
                        reply.Text = answer.answer;
                    }
                }
                else
                {
                    reply.Text = "Sorry, did not get you question.";
                }
            }
            else
            {
                reply.Text = "Unable to fetch response from QnA maker service. Please try again.";
            }
            await connector.Conversations.ReplyToActivityWithRetriesAsync(reply);
        }
        public static ComposeExtensionResponse HandleMessageExtensionQuery(ConnectorClient connector, Activity activity, Dictionary <int, StudentValues> results)
        {
            Helperr            helper   = new Helperr();
            List <SpeakerBios> speakers = helper.SpeakerInformation();


            var query = activity.GetComposeExtensionQueryData();

            if (query == null /*|| (query.CommandId != "Speakers" || query.CommandId != "Sessions")*/)
            {
                return(null);
            }

            if (query.CommandId == "Speakers")
            {
                var title      = "";
                var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "SpeakerTitle");
                var response   = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result"));
                ComposeExtensionAttachment[] attachments = null;
                if (titleParam != null)
                {
                    title = titleParam.Value.ToString();

                    List <string> searchNames  = speakers.Select(a => a.SpeakerName).Where(c => c.ToLower().Contains(title.ToLower())).Select(d => d).ToList();
                    List <string> searchImages = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Snap).ToList();
                    List <string> searchBio    = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Bio).ToList();
                    List <string> searchTitle  = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Title).ToList();
                    int           attacCount   = searchNames.Count();

                    attachments = new ComposeExtensionAttachment[attacCount];
                    for (int i = 0; i < attacCount; i++)
                    {
                        attachments[i] = GetAttachment(searchImages[i], searchNames[i], searchTitle[i], searchBio[i]);
                    }
                    response.ComposeExtension.Attachments = attachments.ToList();
                }
                else
                {
                    List <string> searchNames  = speakers.Select(c => c.SpeakerName).ToList();
                    List <string> searchImages = speakers.Select(c => c.Snap).ToList();
                    List <string> searchTitle  = speakers.Select(c => c.Title).ToList();
                    List <string> searchBio    = speakers.Select(c => c.Bio).ToList();
                    attachments = new ComposeExtensionAttachment[searchNames.Count];
                    for (int i = 0; i < searchNames.Count; i++)
                    {
                        attachments[i] = GetAttachment(searchImages[i], searchNames[i], searchTitle[i], searchBio[i]);
                    }
                    response.ComposeExtension.Attachments = attachments.ToList();
                }

                return(response);
            }
            else if (query.CommandId == "Sessions")
            {
                List <SessionList> sessions = helper.SessionInformation();

                var title      = "";
                var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "sessionTitle");
                var response   = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result"));
                ComposeExtensionAttachment[] attachments = null;
                if (titleParam != null)
                {
                    title = titleParam.Value.ToString();

                    List <string> searchSessionNames    = sessions.Select(a => a.Session).Where(c => c.ToLower().Contains(title.ToLower())).Select(d => d).ToList();
                    List <string> searchSpeaker         = sessions.Where(a => a.Session.ToLower().Contains(title.ToLower())).Select(d => d.Speaker).ToList();
                    List <string> searchSessionAbstract = sessions.Where(a => a.Session.ToLower().Contains(title.ToLower())).Select(d => d.Abstract).ToList();
                    List <string> searchSessionType     = sessions.Where(a => a.Session.ToLower().Contains(title.ToLower())).Select(d => d.SessionType).ToList();;
                    int           attacCount            = searchSessionNames.Count();

                    attachments = new ComposeExtensionAttachment[attacCount];
                    for (int i = 0; i < attacCount; i++)
                    {
                        string speakerAndSessionType = searchSpeaker[i] + " - " + searchSessionType[i];
                        attachments[i] = GetAttachments(searchSessionNames[i], speakerAndSessionType, searchSessionAbstract[i]);
                    }
                    response.ComposeExtension.Attachments = attachments.ToList();
                }
                else
                {
                    List <string> searchSessionNames    = sessions.Select(c => c.Session).Take(20).ToList();
                    List <string> searchSpeaker         = sessions.Select(c => c.Speaker).Take(20).ToList();
                    List <string> searchSessionAbstract = sessions.Select(c => c.Abstract).Take(20).ToList();
                    List <string> searchSessionType     = sessions.Select(c => c.SessionType).ToList();
                    attachments = new ComposeExtensionAttachment[searchSessionNames.Count];
                    for (int i = 0; i < searchSessionNames.Count; i++)
                    {
                        string speakerAndSessionType = searchSpeaker[i] + " - " + searchSessionType[i];
                        attachments[i] = GetAttachments(searchSessionNames[i], speakerAndSessionType, searchSessionAbstract[i]);
                    }
                    response.ComposeExtension.Attachments = attachments.ToList();
                }

                return(response);
            }

            return(null);
        }