示例#1
0
        public FulfillmentMessage GetResponse(FulfillmentRequest data)
        {
            var city = ParametersHelper.GetParameter("geo-city", data.QueryResult.Parameters);

            if (string.IsNullOrWhiteSpace(city))
            {
                return(Responsebuilder.BuildTextResponse(new[] { $"Its currently {DateTime.Now:HH:mm}" }));
示例#2
0
        public IEnumerator FulfillUserItem(string @namespace, string userId, string accessToken,
                                           FulfillmentRequest fulfillmentRequest, ResultCallback <FulfillmentResult> callback)
        {
            Assert.IsNotNull(@namespace, $"{nameof(@namespace)} cannot be null");
            Assert.IsNotNull(userId, $"{nameof(userId)} cannot be null");
            Assert.IsNotNull(accessToken, $"{nameof(accessToken)} cannot be null");
            Assert.IsNotNull(fulfillmentRequest, $"{nameof(fulfillmentRequest)} cannot be null");

            var request = HttpRequestBuilder
                          .CreatePost(this.baseUrl + "/admin/namespaces/{namespace}/users/{userId}/fulfillment")
                          .WithPathParam("namespace", @namespace)
                          .WithPathParam("userId", userId)
                          .WithBearerAuth(accessToken)
                          .WithContentType(MediaType.ApplicationJson)
                          .Accepts(MediaType.ApplicationJson)
                          .WithBody(fulfillmentRequest.ToUtf8Json())
                          .GetResult();

            IHttpResponse response = null;

            yield return(this.httpClient.SendRequest(request, rsp => response = rsp));

            var result = response.TryParseJson <FulfillmentResult>();

            callback.Try(result);
        }
 private static FulfillmentResponse BuildResponseForMuiltipleMatchesFor(
     FulfillmentRequest fulfillmentRequest, IEnumerable <Quote> matchingQuotes)
 {
     return(fulfillmentRequest.DoesRequestingDeviceHaveAScreen()
         ? BuildResponseForMultipleMatchesForDeviceWithScreen(matchingQuotes)
         : BuildResponseForMultipleMatchesForAudioDevice(matchingQuotes));
 }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var datePeriod = GetDatePeriodForRevenueFrom(fulfillmentRequest);
            var timeUnit   = fulfillmentRequest.GetParameter(Constants.Variables.TimeUnitOriginal);

            if (string.IsNullOrEmpty(timeUnit))
            {
                timeUnit = "last week";
            }

            var getTransactionRequest = new GetTransactionRequest
            {
                Start    = datePeriod.Start,
                End      = datePeriod.End,
                TimeUnit = timeUnit
            };

            var Transactions = await jobberClient.GetRangedTransactionsAsync(getTransactionRequest);

            decimal revenue = Transactions.GetTotal();

            if (timeUnit.EndsWith("?"))
            {
                timeUnit = timeUnit.Remove(timeUnit.Length - 1);
            }

            return(FulfillmentResponseBuilder.Create()
                   .Speech($"We made ${revenue.ToString("N")} {timeUnit}")
                   .Build());
        }
示例#5
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var num = fulfillmentRequest.GetParameterAsInt("num");

            return(FulfillmentResponseBuilder.Create()
                   .Speech($"Your favorite number is {num}")
                   .Build());
        }
示例#6
0
 private FulfillmentRequestBuilder(string name)
 {
     _fulfillmentRequest = new FulfillmentRequest
     {
         ConversationResult = new ConversationResult {
             ActionName = name
         }
     };
 }
        private void LogResponse(FulfillmentRequest fulfillmentRequest, FulfillmentResponse fulfillmentResponse)
        {
            var actionName = fulfillmentRequest.ConversationResult.ActionName;
            var logTag     = $"{actionName}:{fulfillmentRequest.Id}";

            var serlializedResponse = ConvertToPrettyJson(fulfillmentResponse);

            _logger.LogInfo($"{logTag} Raw Response\n{serlializedResponse}");
        }
示例#8
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest)
        {
            var jobberServer = _jobberClientFactory.CreateJobberClient(new JobberConfig
            {
                ApiKey = fulfillmentRequest.OriginalRequest.Data.User.AccessToken
            });

            return(await GetJobberIntentFulfillerFor(fulfillmentRequest).FulfillAsync(fulfillmentRequest, jobberServer));
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var response = new FulfillmentResponse
            {
                Speech      = "Sorry, I'm not sure what you're asking for.",
                DisplayText = "Sorry, I'm not sure what you're asking for."
            };

            return(await Task.FromResult(response));
        }
        public static long GetCurrentUserId(this FulfillmentRequest fulfillmentRequest)
        {
            if (fulfillmentRequest.UserId != -1)
            {
                return(fulfillmentRequest.UserId);
            }
            var token   = fulfillmentRequest.OriginalRequest.Data.User.AccessToken;
            var decoded = new JwtSecurityToken(jwtEncodedString: token);

            return(Convert.ToInt64(decoded.Claims.First(c => c.Type == "user_id").Value));
        }
示例#11
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var todaysVisits = await jobberClient.GetTodaysVisitsAsync();

            switch (todaysVisits.NumCompletable)
            {
            case 1:
                return(BuildSingleVisitResponseFor(todaysVisits));

            default:
                return(BuildMultipleVisitsResponseFor(todaysVisits));
            }
        }
        private void LogRequest(FulfillmentRequest fulfillmentRequest)
        {
            var actionName = fulfillmentRequest.ConversationResult.ActionName;
            var logTag     = $"{actionName}:{fulfillmentRequest.Id}";

            _logger.LogInfo("Fulfillment started for request with action: " +
                            $"{actionName} " +
                            $"and id: {fulfillmentRequest.Id}");

            var serializedRequest = ConvertToPrettyJson(fulfillmentRequest);

            _logger.LogInfo($"{logTag} Raw Request\n{serializedRequest}");
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var userId         = fulfillmentRequest.GetCurrentUserId();
            var userCollection = await jobberClient.GetUserAsync(userId);

            var user = userCollection.Users;
            var chipSuggestionMessage = GoogleChipMessage.From(user.PossibleActions().Values.ToList());

            return(FulfillmentResponseBuilder.Create()
                   .Speech("I have listed some functionalities as suggestions")
                   .WithMessage(chipSuggestionMessage)
                   .Build());
        }
        private static DatePeriod GetDatePeriodForRevenueFrom(FulfillmentRequest fulfillmentRequest)
        {
            if (fulfillmentRequest.IsParameterDatePeriod(Constants.Variables.TimeUnit))
            {
                return(fulfillmentRequest.GetParemterAsDatePeriod(Constants.Variables.TimeUnit));
            }

            return(new DatePeriod
            {
                End = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek),
                Start = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek - 6)
            });
        }
示例#15
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var serviceName        = fulfillmentRequest.GetParameter(Constants.Variables.ServiceName);
            var newUnitPrice       = fulfillmentRequest.GetParameterAsDouble(Constants.Variables.Price);
            var modifyQuoteContext = fulfillmentRequest.GetContextParameterAs <ModifyQuoteContext>(
                Constants.Contexts.QuoteDetailsSet, Constants.Variables.ModifyQuoteContext);

            var modifiedQuote = UpdateServicePriceInQuote(modifyQuoteContext.Quote, serviceName, newUnitPrice);

            await jobberClient.UpdateQuoteAsync(modifiedQuote);

            return(FulfillmentResponseBuilder.Create()
                   .Speech("Okay. I've updated the quote for you.")
                   .Build());
        }
        private static DateTimeRange GetDateTimeRangeForJobFrom(FulfillmentRequest fulfillmentRequest)
        {
            if (fulfillmentRequest.IsParameterDateRange(Constants.Variables.Date))
            {
                return(fulfillmentRequest.GetParemterAsDateTimeRange(Constants.Variables.Date));
            }

            var dateSpecified = fulfillmentRequest.GetParameterAsDateTime(Constants.Variables.Date);

            return(new DateTimeRange
            {
                Start = dateSpecified,
                End = dateSpecified.AddHours(3)
            });
        }
示例#17
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var quoteNumber     = fulfillmentRequest.GetParameterAsInt(Constants.Variables.QuoteNumber);
            var quoteCollection = await jobberClient.GetQuotesAsync();

            var filteredQuotes = quoteCollection.Quotes.Where(q => q.QuoteNumber == quoteNumber);

            switch (filteredQuotes.Count())
            {
            case 1:
                return(QuoteUtils.BuildResponseFor(filteredQuotes.First()));

            default:
                return(BuildResponseForNoMatchingQuotes(quoteNumber));
            }
        }
示例#18
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var clientName      = fulfillmentRequest.GetParameter(Constants.Variables.ClientName);
            var matchingClients = await jobberClient.GetClientsAsync(clientName);

            switch (matchingClients.Count)
            {
            case 0:
                return(BuildClientNotFoundResponse(clientName));

            case 1:
                return(BuildClientFoundResponse(matchingClients.Clients.First()));

            default:
                return(BuildMultipleClientsFound(clientName, matchingClients));
            }
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var userId = fulfillmentRequest.GetCurrentUserId();
            var visits = await jobberClient.GetTodayAssignedVisitsAsync(userId);

            switch (visits.Count)
            {
            case 0:
                return(BuildNoVisitResponse());

            case 1:
                return(BuildVisitFoundResponse(visits.Visits.First()));

            default:
                return(buildMultipleVisitsFoundResponse(visits));
            }
        }
示例#20
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var invoices = await jobberClient.GetDraftInvoicesAsync();

            var numOfSendableInvoices = invoices.Count();

            switch (numOfSendableInvoices)
            {
            case 0:
                return(BuildNoSendableInvoicesFoundResponse());

            case 1:
                return(BuildSingleSendableInvoiceFoundResponse());

            default:
                return(BuildMultipleSendableInvoicesFoundResponse(numOfSendableInvoices));
            }
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest,
                                                             IJobberClient jobberClient)
        {
            var userId       = fulfillmentRequest.GetCurrentUserId();
            var current_time = DateTime.Now.ToUnixTime();
            var visits       = await jobberClient.GetTodayAssignedVisitsAsync(userId, current_time);

            if (visits.Count == 0)
            {
                return(FulfillmentResponseBuilder.Create()
                       .Speech($"Your remaining day looks clear")
                       .Build());
            }
            return(FulfillmentResponseBuilder.Create()
                   .Speech(BuildResponseFrom(visits.Visits.First()))
                   .WithMessage(BuildGoogleCardFrom(visits.Visits.First()))
                   .Build());
        }
示例#22
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var quotes = await jobberClient.GetQuotesAsync();

            var numOfConvertableQuotes = quotes.NumConvertable;

            switch (numOfConvertableQuotes)
            {
            case 0:
                return(BuildNoConvertableQuotesFoundResponse());

            case 1:
                return(BuildSingleConvertableQuotesFoundResponse(quotes.ConvertableQuotes.First()));

            default:
                return(BuildMultipleConvertableQuotesFoundResponse(numOfConvertableQuotes));
            }
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var Visits = await jobberClient.GetTodaysVisitsAsync();

            var numOfUnassignedVisits = Visits.NumUnassigned;

            switch (numOfUnassignedVisits)
            {
            case 0:
                return(BuildZeroUnassignedVisitsFoundResponse(numOfUnassignedVisits));

            case 1:
                return(BuildSingleUnassignedVisitsFoundResponse(numOfUnassignedVisits));

            default:
                return(BuildMultipleUnassignedVisitsFoundResponse(numOfUnassignedVisits));
            }
        }
        /// <summary>
        /// Fulfill item to a user.
        /// </summary>
        /// <param name="userId">UserId of a user who will receive item.</param>
        /// <param name="fulfillmentRequest">The request to fulfill an item to user.</param>
        /// <param name="callback">Returns Wallet info via callback when completed.</param>
        public void FulfillUserItem(string userId, FulfillmentRequest fulfillmentRequest,
                                    ResultCallback <FulfillmentResult> callback)
        {
            Report.GetFunctionLog(this.GetType().Name);

            if (!this.session.IsValid())
            {
                callback.TryError(ErrorCode.IsNotLoggedIn);
                return;
            }

            this.coroutineRunner.Run(
                this.api.FulfillUserItem(
                    this.namespace_,
                    userId,
                    this.session.AuthorizationToken,
                    fulfillmentRequest,
                    callback));
        }
示例#25
0
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var userId = fulfillmentRequest.GetCurrentUserId();
            var visits = await jobberClient.GetTodayAssignedVisitsAsync(userId);

            float length     = 0;
            float currentEnd = 0;

            foreach (Visit visit in visits.Visits)
            {
                // To handle overlap intervals
                length    += Math.Max(0, visit.EndAt - Math.Max(currentEnd, visit.StartAt));
                currentEnd = visit.EndAt;
            }
            float duration = (float)(length / 3600);
            int   hours    = (int)Math.Floor(duration);
            int   minutes  = (int)((duration - hours) * 60);


            StringBuilder sb = new StringBuilder();

            if (hours == 0)
            {
                sb.Append($"You have no work today.");
            }
            else
            {
                if (hours >= 24)
                {
                    sb.Append($"You have work all day.");
                }
                else
                {
                    sb.Append($"Your work is {hours} hours and {minutes} minutes long today.");
                }
            }
            return(FulfillmentResponseBuilder.Create()
                   .Speech(sb.ToString())
                   .Build());
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var clientName  = fulfillmentRequest.GetParameter(Constants.Variables.ClientName);
            var serviceName = fulfillmentRequest.GetParameter(Constants.Variables.ServiceName);

            var quotesCollection = await jobberClient.GetQuotesAsync();

            var filteredQuotes = quotesCollection.Quotes
                                 .Where(q => q.Client.Name.ContainsIgnoringCase(clientName))
                                 .Where(q => DoesLineItemsMatchUserQuery(q.LineItems, serviceName));

            switch (filteredQuotes.Count())
            {
            case 0:
                return(BuildResponseForNoMatchingQuotes());

            case 1:
                return(QuoteUtils.BuildResponseFor(filteredQuotes.First()));

            default:
                return(BuildResponseForMuiltipleMatchesFor(fulfillmentRequest, filteredQuotes));
            }
        }
        public ContentResult Post([FromBody] FulfillmentRequest data)
        {
            var fulfillmentMessages = new List <FulfillmentMessage>();

            switch (data.QueryResult.Intent.DisplayName)
            {
            case "Default Fallback Intent":
                fulfillmentMessages.Add(Responsebuilder.BuildTextResponse(new[] { "I am not sure how to help please try again." }));
                break;

            case "Default Welcome Intent":
                fulfillmentMessages.Add(
                    Responsebuilder.BuildTextResponse(new[] { "Welcome try and ask me the time." }));
                break;

            case "Time":

                var timeIntentResponse = new TimeIntent(_config).GetResponse(data);
                fulfillmentMessages.Add(timeIntentResponse);

                break;

            default:
                fulfillmentMessages.Add(Responsebuilder.BuildCardResponse("Help",
                                                                          $"The {data.QueryResult.Intent.DisplayName} intent has not been configured contact support.",
                                                                          "https://static.planetminecraft.com/files/resource_media/screenshot/1213/Windows-help1_1825170.jpg"));
                break;
            }

            var response = new FulfilmentResponse()
            {
                FulfillmentMessages = fulfillmentMessages.ToArray()
            };

            return(Content(JsonConvert.SerializeObject(response), "application/json"));
        }
        public async Task <FulfillmentResponse> FulfillAsync(FulfillmentRequest fulfillmentRequest, IJobberClient jobberClient)
        {
            var jobDateTimeRange     = GetDateTimeRangeForJobFrom(fulfillmentRequest);
            var createJobDescription = fulfillmentRequest.GetParameter(Constants.Variables.JobDescription);
            var createJobContext     = fulfillmentRequest.GetContextParameterAs <CreateJobContext>
                                           (Constants.Contexts.CreateJobClientSet, Constants.Variables.CreateJobContext);

            var createJobRequest = new CreateJobRequest
            {
                ClientId    = createJobContext.Client.Id,
                PropertyId  = createJobContext.Property.Id,
                StartAt     = jobDateTimeRange.Start.ToUnixTime(),
                EndAt       = jobDateTimeRange.End.ToUnixTime(),
                Description = createJobDescription
            };

            await jobberClient.CreateJobAsync(createJobRequest);

            return(FulfillmentResponseBuilder.Create()
                   .Speech(BuildResponseFrom(fulfillmentRequest))
                   .WithMessage(BuildGoogleCardFrom(createJobContext, createJobDescription))
                   .MarkEndOfAssistantConversation()
                   .Build());
        }
 public bool CanFulfill(FulfillmentRequest fulfillmentRequest)
 {
     return(fulfillmentRequest.IsForAction(Constants.Intents.GetRevenue));
 }
示例#30
0
 public bool CanFulfill(FulfillmentRequest fulfillmentRequest)
 {
     return(fulfillmentRequest.IsForAction(Constants.Intents.SendableInvoices));
 }