private async Task <DialogTurnResult> PromptForProjectCollectionAndProjectName(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var cardText = await CardProvider.GetCardText("ProjectInformationCard").ConfigureAwait(false);

            var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);

            return(await stepContext.PromptAsync(nameof(ActivityInfoPrompt), new PromptOptions { Prompt = replyActivity }, cancellationToken));
        }
示例#2
0
        private async Task <DialogTurnResult> PromptStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            // Reply to the activity we received with an activity.
            var cardText = await CardProvider.GetCardText("WelcomeCard").ConfigureAwait(false);

            var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);

            replyActivity.Attachments.Add(GetSignInCard(stepContext.Context.Activity).ToAttachment());

            await stepContext.Context.SendActivityAsync(replyActivity, cancellationToken).ConfigureAwait(false);

            return(await stepContext.BeginDialogAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Did you have a successful login?") }, cancellationToken));
        }
        private async Task <DialogTurnResult> PromptForWorkItemDetails(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var workItemInput = await workItemInputAccessor.GetAsync(stepContext.Context, cancellationToken : cancellationToken).ConfigureAwait(false);

            var activity = stepContext.Result as Activity;

            var replaceInfo = new Dictionary <string, string>();

            replaceInfo.Add("{{workitemType}}", workItemInput.WorkItemType.ToString());
            var cardText = await CardProvider.GetCardText("CreateWorkItemCard", replaceInfo).ConfigureAwait(false);

            var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);

            return(await stepContext.PromptAsync(nameof(ActivityInfoPrompt), new PromptOptions { Prompt = replyActivity }, cancellationToken));
        }
示例#4
0
        public static async Task NotifySubscribers(UserScubaData userScubaData, BotAdapter adapter, MicrosoftAppCredentials workingCredentials, ConversationReference reserverReference = null)
        {
            if (reserverReference != null)
            {
                var scubaReservation = new Tuple <ConversationReference, UserScubaData>(reserverReference, userScubaData);
                _recentReservations.AddOrUpdate(reserverReference.User.Id, scubaReservation, (key, oldValue) => scubaReservation);
                //todo: this should not be a hard coded url
                userScubaData.ChatWithUserUrl = "https://contososcubademo.azurewebsites.net?chatWithId=" + reserverReference.User.Id;
                //chatWithUserIdUrl = "Use this URL to chat with them: http://localhost:3979?chatWithId=" + reserverReference.User.Id;
            }
            string message = $"New scuba booking for {userScubaData.PersonalInfo.Name}";

            var replaceInfo = new Dictionary <string, string>();

            replaceInfo.Add("{{destination}}", userScubaData.Destination);
            replaceInfo.Add("{{school}}", userScubaData.School);
            replaceInfo.Add("{{longdate}}", Convert.ToDateTime(userScubaData.Date).ToString("dddd, MMMM dd"));
            replaceInfo.Add("{{number_of_people}}", userScubaData.NumberOfPeople);
            replaceInfo.Add("{{phone}}", userScubaData.PersonalInfo.Phone);
            replaceInfo.Add("{{email}}", userScubaData.PersonalInfo.Email);
            replaceInfo.Add("{{name}}", userScubaData.PersonalInfo.Name);
            replaceInfo.Add("{{protein_preference}}", userScubaData.MealOptions.ProteinPreference);
            replaceInfo.Add("{{vegan}}", userScubaData.MealOptions.Vegan ? "Yes" : "No");
            replaceInfo.Add("{{allergy}}", userScubaData.MealOptions.Alergy);

            if (!string.IsNullOrEmpty(userScubaData.ChatWithUserUrl))
            {
                replaceInfo.Add("{{url}}", userScubaData.ChatWithUserUrl);
            }


            var subscriberCardText = await CardProvider.GetCardText("SubscriberNotification", replaceInfo);

            var conversationCallback = GetConversationCallback(message, workingCredentials, subscriberCardText);

            await SendActionableMessage(userScubaData);

            foreach (var subscriber in _reservationSubscribers.Values)
            {
                await adapter.ContinueConversation(subscriber.Bot.Id, subscriber, conversationCallback);
            }
        }
        private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            if (stepContext.Result == null || !(stepContext.Result is Activity))
            {
                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }

            var workItemInput = await workItemInputAccessor.GetAsync(stepContext.Context, cancellationToken : cancellationToken).ConfigureAwait(false);

            try
            {
                var authenticatedProfile = await this.authHelper.GetAuthenticatedProfileAsync(stepContext.Context, cancellationToken).ConfigureAwait(false);

                var activity     = stepContext.Result as Activity;
                var workItemInfo = JObject.Parse(activity.Value.ToString());

                var      fieldToValueMappings = GetFieldToValueMappings(workItemInfo["WorkItemTitle"].ToString(), workItemInfo["WorkItemDescription"].ToString(), workItemInfo["Priority"].ToString(), workItemInfo["AreaPath"].ToString(), workItemInfo["IterationPath"].ToString());
                WorkItem workItem             = await vsoApiController.CreateWorkItemAsync(workItemInput.ProjectCollection, workItemInput.ProjectName, fieldToValueMappings, workItemInput.WorkItemType, authenticatedProfile.Token.AccessToken).ConfigureAwait(false);

                if (workItem == null)
                {
                    this.logger.LogError($"Error while creating the {workItemInput.WorkItemType}");
                    await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Sorry something went wrong when creating {workItemInput.WorkItemType}."), cancellationToken);

                    return(await stepContext.EndDialogAsync(null, cancellationToken));
                }

                var replaceInfo = new Dictionary <string, string>();
                replaceInfo.Add("{{workitemId}}", workItem.Id.ToString());
                replaceInfo.Add("{{workitemUrl}}", $"https://{workItemInput.ProjectCollection}.visualstudio.com/{workItemInput.ProjectName}/_workitems/edit/{workItem.Id}");
                if (workItem.Fields.Count == 0)
                {
                    this.logger.LogWarning($"Work item details are miising for {workItem.Id}");
                }

                if (workItem.Fields.TryGetValue("System.WorkItemType", out object workItemType))
                {
                    replaceInfo.Add("{{workitemType}}", workItemType.ToString());
                }

                if (workItem.Fields.TryGetValue("System.Title", out object title))
                {
                    replaceInfo.Add("{{workitemTitle}}", title.ToString());
                }

                if (workItem.Fields.TryGetValue("System.State", out object status))
                {
                    replaceInfo.Add("{{workitemStatus}}", status.ToString());
                }

                if (workItem.Fields.TryGetValue("System.ChangedDate", out object lastUpdatedDate))
                {
                    replaceInfo.Add("{{lastUpdated}}", lastUpdatedDate.ToString());
                }

                var cardText = await CardProvider.GetCardText("WorkItemDetailsCard", replaceInfo).ConfigureAwait(false);

                var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);
                replyActivity.Text = $"Created {workItemInput.WorkItemType} successfully";
                await stepContext.Context.SendActivityAsync(replyActivity, cancellationToken);

                return(await stepContext.EndDialogAsync(workItemInput, cancellationToken));
            }
            catch (Exception)
            {
                await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Sorry something went wrong when creating {workItemInput.WorkItemType}."), cancellationToken);

                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }
        }
        private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            if (stepContext.Result == null || !(stepContext.Result is Activity) || !(stepContext.Options is RecognizerResult))
            {
                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }

            var recognizerResult = (RecognizerResult)stepContext.Options;
            // We need to get the result from the LUIS JSON which at every level returns an array.
            WorkItemInput workItemInput = new WorkItemInput();
            Match         match         = Regex.Match(recognizerResult.Entities["id"].ToString(), @"(\d+)");

            if (match.Success)
            {
                workItemInput.WorkItemId = match.Groups[1].Value;
            }

            try
            {
                var authenticatedProfile = await this.authHelper.GetAuthenticatedProfileAsync(stepContext.Context, cancellationToken).ConfigureAwait(false);

                var      activity    = stepContext.Result as Activity;
                var      projectInfo = JObject.Parse(activity.Value.ToString());
                WorkItem workItem    = await vsoApiController.GetWorkItemAsync(workItemInput.WorkItemId, projectInfo["ProjectCollection"].ToString(), projectInfo["ProjectName"].ToString(), authenticatedProfile.Token.AccessToken).ConfigureAwait(false);

                var replaceInfo = new Dictionary <string, string>();
                replaceInfo.Add("{{workitemId}}", workItem.Id.ToString());
                replaceInfo.Add("{{workitemUrl}}", $"https://{projectInfo["ProjectCollection"].ToString()}.visualstudio.com/{projectInfo["ProjectName"].ToString()}/_workitems/edit/{workItemInput.WorkItemId}");
                if (workItem.Fields.Count == 0)
                {
                    this.logger.LogWarning($"Work item details are miising for {workItem.Id}");
                }

                if (workItem.Fields.TryGetValue("System.Title", out object title))
                {
                    replaceInfo.Add("{{workitemTitle}}", title.ToString());
                }

                if (workItem.Fields.TryGetValue("System.WorkItemType", out object workItemType))
                {
                    replaceInfo.Add("{{workitemType}}", workItemType.ToString());
                }

                if (workItem.Fields.TryGetValue("System.State", out object status))
                {
                    replaceInfo.Add("{{workitemStatus}}", status.ToString());
                }

                if (workItem.Fields.TryGetValue("System.ChangedDate", out object lastUpdatedDate))
                {
                    replaceInfo.Add("{{lastUpdated}}", lastUpdatedDate.ToString());
                }

                var cardText = await CardProvider.GetCardText("WorkItemDetailsCard", replaceInfo).ConfigureAwait(false);

                var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);
                await stepContext.Context.SendActivityAsync(replyActivity, cancellationToken);

                return(await stepContext.EndDialogAsync(workItemInput, cancellationToken));
            }
            catch (Exception)
            {
                await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Sorry something went wrong when fetching {workItemInput.WorkItemId}."), cancellationToken);

                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }
        }