Beispiel #1
0
        public async Task <Result> GetSpeechAsync(Activity message, Sesion sesion, IDialogContext context)
        {
            Result result = new Result();

            try
            {
                string fileSavePath = System.Web.HttpContext.Current.Server.MapPath("~/Dialogflow/") + AppConstant.DialogFlow.FilePrivateKeyIdJson;

                if (System.IO.File.Exists(fileSavePath))
                {
                    GoogleCredential cred    = GoogleCredential.FromFile(fileSavePath);
                    Channel          channel = new Channel(SessionsClient.DefaultEndpoint.Host, SessionsClient.DefaultEndpoint.Port, cred.ToChannelCredentials());
                    SessionsClient   client  = SessionsClient.Create(channel);

                    QueryInput query = new QueryInput
                    {
                        Text = new TextInput
                        {
                            Text         = message.Text,
                            LanguageCode = "es-es"
                        }
                    };

                    //string sessionId = Guid.NewGuid().ToString();
                    //string projectId = "upc-chatbot"; //TODO: Move to AppSettings

                    string sessionId = sesion.IdSesion.ToString();
                    string projectId = ConfigurationManager.AppSettings["ApiAiProjectId"].ToString();

                    SessionName sessionName = new SessionName(projectId, sessionId);

                    RepeatedField <Context> outputContexts = new RepeatedField <Context>();

                    List <DialogFlowContext> dialogFlowContexts = new List <DialogFlowContext>();

                    if (context.UserData.ContainsKey("OutputContexts"))
                    {
                        string outputContextsGetValue = context.UserData.GetValue <string>("OutputContexts");

                        if (!string.IsNullOrEmpty(outputContextsGetValue))
                        {
                            dialogFlowContexts = JsonConvert.DeserializeObject <List <DialogFlowContext> >(outputContextsGetValue);

                            foreach (var item in dialogFlowContexts)
                            {
                                Struct s = new Struct();

                                foreach (var p in item.Parameters)
                                {
                                    Value v = new Value
                                    {
                                        StructValue = null,
                                        ListValue   = null,
                                        NumberValue = 0D,
                                        StringValue = p.Value //This order position matters!!!
                                    };

                                    s.Fields.Add(p.Key, v);
                                }

                                outputContexts.Add(new Context {
                                    Name = item.Name, LifespanCount = item.LifespanCount, Parameters = s
                                });
                            }
                        }
                    }

                    DetectIntentRequest detectIntentRequest = new DetectIntentRequest
                    {
                        SessionAsSessionName = sessionName,
                        QueryInput           = query,
                        QueryParams          = new QueryParameters()
                    };

                    if (outputContexts.Count > 0)
                    {
                        detectIntentRequest.QueryParams.Contexts.AddRange(outputContexts);
                    }

                    DetectIntentResponse dialogFlow = client.DetectIntent(detectIntentRequest);

                    QueryResult response = dialogFlow.QueryResult;

                    string outputContextsSetValue = response.OutputContexts.ToString();

                    context.UserData.SetValue("OutputContexts", outputContextsSetValue);

                    await EvaluateDialogFlowResponse(response, result, message, sesion);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                BaseData.LogError(ex);
            }

            return(result);
        }