Esempio n. 1
0
        /// <summary>
        /// Parse the invoke value and change the activity type as message
        /// </summary>
        /// <param name="activity"></param>
        /// <returns></returns>
        public static IMessageActivity HandleInvokeRequest(IMessageActivity activity)
        {
            if (activity == null)
            {
                throw new ArgumentNullException(nameof(activity));
            }

            activity.Text = TemplateUtility.ParseInvokeRequestJson(activity.Value.ToString());

            //Change the Type of Activity to work in exisiting Root Dialog Architecture
            activity.Type = Strings.MessageActivity;

            return(activity);
        }
 // used to parse the user preferences from the state and save them for later use
 public async void ParseSettingsAndSave(string state, BotData userData, Activity activity, IBotDataStore <BotData> service)
 {
     userData.SetProperty <string>("composeExtensionCardType", state);
     await TemplateUtility.SaveBotUserDataObject(service, activity, userData);
 }
        public async Task <ComposeExtensionResponse> GetComposeExtensionResponse(Activity activity, IBotDataStore <BotData> botDataStore)
        {
            ComposeExtensionResponse composeExtensionResponse = null;
            ImageResult imageResult = null;
            List <ComposeExtensionAttachment> composeExtensionAttachments = new List <ComposeExtensionAttachment>();

            var userData = await TemplateUtility.GetBotUserDataObject(botDataStore, activity);

            var userPreferredCardType = userData.GetProperty <string>(Strings.ComposeExtensionCardTypeKeyword);

            bool isSettingUrl = false;

            var composeExtensionQuery = activity.GetComposeExtensionQueryData();

            if (string.Equals(activity.Name.ToLower(), Strings.ComposeExtensionQuerySettingUrl))
            {
                isSettingUrl = true;
            }

            if (composeExtensionQuery.CommandId == null || composeExtensionQuery.Parameters == null)
            {
                return(null);
            }

            var initialRunParameter = GetQueryParameterByName(composeExtensionQuery, Strings.manifestInitialRun);
            var queryParameter      = GetQueryParameterByName(composeExtensionQuery, Strings.manifestParameterName);

            if (userData == null)
            {
                composeExtensionResponse = new ComposeExtensionResponse();
                string message = Strings.ComposeExtensionNoUserData;
                composeExtensionResponse.ComposeExtension = GetMessageResponseResult(message);
                return(composeExtensionResponse);
            }

            /**
             * Below are the checks for various states that may occur
             * Note that the order of many of these blocks of code do matter
             */

            // situation where the incoming payload was received from the config popup

            if (!string.IsNullOrEmpty(composeExtensionQuery.State))
            {
                ParseSettingsAndSave(composeExtensionQuery.State, userData, activity, botDataStore);

                /**
                 * //// need to keep going to return a response so do not return here
                 * //// these variables are changed so if the word 'setting' kicked off the compose extension,
                 * //// then the word setting will not retrigger the config experience
                 **/

                queryParameter      = "";
                initialRunParameter = "true";
            }

            // this is a sitaution where the user's preferences have not been set up yet
            if (string.IsNullOrEmpty(userData.GetProperty <string>(Strings.ComposeExtensionCardTypeKeyword)))
            {
                composeExtensionResponse = GetConfig();
                return(composeExtensionResponse);
            }

            /**
             * // this is the situation where the user has entered the word 'reset' and wants
             * // to clear his/her settings
             * // resetKeyword for English is "reset"
             **/

            if (string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionResetKeyword))
            {
                userData.RemoveProperty(Strings.ComposeExtensionCardTypeKeyword);
                await TemplateUtility.SaveBotUserDataObject(botDataStore, activity, userData);

                composeExtensionResponse = new ComposeExtensionResponse();
                composeExtensionResponse.ComposeExtension = GetMessageResponseResult(Strings.ComposeExtensionResetText);
                return(composeExtensionResponse);
            }

            /**
             * // this is the situation where the user has entered "setting" or "settings" in order
             * // to repromt the config experience
             * // keywords for English are "setting" and "settings"
             **/

            if ((string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionSettingKeyword) || string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionSettingsKeyword)) || (isSettingUrl))
            {
                composeExtensionResponse = GetConfig();
                return(composeExtensionResponse);
            }

            /**
             * // this is the situation where the user in on the initial run of the compose extension
             * // e.g. when the user first goes to the compose extension and the search bar is still blank
             * // in order to get the compose extension to run the initial run, the setting "initialRun": true
             * // must be set in the manifest for the compose extension
             **/

            if (initialRunParameter == "true")
            {
                //Signin Experience, please uncomment below code for Signin Experience
                //composeExtensionResponse = GetSignin(composeExtensionResponse);
                //return composeExtensionResponse;

                composeExtensionResponse = new ComposeExtensionResponse();

                var historySearchWikiResult = userData.GetProperty <List <WikiHelperSearchResult> >(ComposeExtensionSelectedResultsKey);
                if (historySearchWikiResult != null)
                {
                    foreach (var searchResult in historySearchWikiResult)
                    {
                        WikiHelperSearchResult wikiSearchResult = new WikiHelperSearchResult(searchResult.imageUrl, searchResult.highlightedTitle, searchResult.text);

                        // create the card itself and the preview card based upon the information
                        var createdCardAttachment = TemplateUtility.CreateComposeExtensionCardsAttachments(wikiSearchResult, userPreferredCardType);
                        composeExtensionAttachments.Add(createdCardAttachment);
                    }

                    composeExtensionResponse = GetComposeExtensionQueryResult(composeExtensionAttachments);
                }
                else
                {
                    composeExtensionResponse.ComposeExtension = GetMessageResponseResult(Strings.ComposeExtensionInitialRunText);
                }

                return(composeExtensionResponse);
            }

            /**
             * Below here is simply the logic to call the Wikipedia API and create the response for
             * a query; the general flow is to call the Wikipedia API for the query and then call the
             * Wikipedia API for each entry for the query to see if that entry has an image; in order
             * to get the asynchronous sections handled, an array of Promises for cards is used; each
             * Promise is resolved when it is discovered if an image exists for that entry; once all
             * of the Promises are resolved, the response is sent back to Teams
             */

            WikiResult wikiResult = await SearchWiki(queryParameter, composeExtensionQuery);

            // enumerate search results and build Promises for cards for response
            foreach (var searchResult in wikiResult.query.search)
            {
                //Get the Image result on the basis of Image Title one by one
                imageResult = await SearchWikiImage(searchResult);

                //Get the Image Url from imageResult
                string imageUrl = GetImageURL(imageResult);

                string cardText = searchResult.snippet + " ...";

                WikiHelperSearchResult wikiSearchResult = new WikiHelperSearchResult(imageUrl, searchResult.title, cardText);

                // create the card itself and the preview card based upon the information
                var createdCardAttachment = TemplateUtility.CreateComposeExtensionCardsAttachments(wikiSearchResult, userPreferredCardType);
                composeExtensionAttachments.Add(createdCardAttachment);
            }

            composeExtensionResponse = GetComposeExtensionQueryResult(composeExtensionAttachments);

            return(composeExtensionResponse);
        }
        /// <summary>
        /// Handle the callback received when the user selects an item from the results list
        /// </summary>
        /// <param name="activity"></param>
        /// <returns></returns>
        public async Task <ComposeExtensionResponse> HandleComposeExtensionSelectedItem(Activity activity, IBotDataStore <BotData> botDataStore)
        {
            // Keep a history of recently-selected items in bot user data. The history will be returned in response to the initialRun query
            var userData = await TemplateUtility.GetBotUserDataObject(botDataStore, activity);

            //Get the Max number of History items from config file
            int maxComposeExtensionHistoryCount = Convert.ToInt32(ConfigurationManager.AppSettings[MaxComposeExtensionHistoryCountKey]);

            WikiHelperSearchResult selectedItem = JsonConvert.DeserializeObject <WikiHelperSearchResult>(activity.Value.ToString());

            var historySearchWikiResult = userData.GetProperty <List <WikiHelperSearchResult> >(ComposeExtensionSelectedResultsKey);

            //Removing other occurrences of the current selectedItem so there are not duplicates in the most recently used list
            if (historySearchWikiResult != null && historySearchWikiResult.Count > 0)
            {
                int index = 0;
                while (index < historySearchWikiResult.Count)
                {
                    if (string.Equals(historySearchWikiResult[index].highlightedTitle.ToLower(), selectedItem.highlightedTitle.ToLower()))
                    {
                        historySearchWikiResult.RemoveAt(index);
                    }
                    else
                    {
                        index++;
                    }
                }
            }
            else
            {
                historySearchWikiResult = new List <WikiHelperSearchResult>();
            }

            //Add new item in list
            historySearchWikiResult.Insert(0, selectedItem);

            //Restrict the transaction History with Max Items.
            if (historySearchWikiResult.Count > maxComposeExtensionHistoryCount)
            {
                historySearchWikiResult = historySearchWikiResult.GetRange(0, maxComposeExtensionHistoryCount);
            }

            //Save the history Items in user Data
            userData.SetProperty <List <WikiHelperSearchResult> >(ComposeExtensionSelectedResultsKey, historySearchWikiResult);
            await TemplateUtility.SaveBotUserDataObject(botDataStore, activity, userData);

            ComposeExtensionResponse          composeExtensionResponse   = new ComposeExtensionResponse();
            List <ComposeExtensionAttachment> composeExtensionAttachment = new List <ComposeExtensionAttachment>();

            if (selectedItem != null)
            {
                // create the card itself and the preview card based upon the information
                // check user preference for which type of card to create
                var userPreferredCardType = userData.GetProperty <string>(Strings.ComposeExtensionCardTypeKeyword);
                var createdCardAttachment = TemplateUtility.CreateComposeExtensionCardsAttachmentsSelectedItem(selectedItem, userPreferredCardType);
                composeExtensionAttachment.Add(createdCardAttachment);

                composeExtensionResponse = GetComposeExtensionQueryResult(composeExtensionAttachment);
            }
            else
            {
                composeExtensionResponse.ComposeExtension = GetMessageResponseResult(Strings.ComposeExtensionInitialRunText);
            }

            return(composeExtensionResponse);
        }