public async Task <ActionResult> GenerateAnswer(ChatViewModel model) { // Iteracción entre el usuario y s@mi Bot // Variables tipo texto string textUser = model.Message, queryLuis = "", respuestaFinal = "", intencion = "", respuestaSami = "", entidad = "", casoJson = "", respuestaLuis = "" , puntajeLuis = "", puntajeQnA = "", respuesta = ""; // Variables tipo texto array string[] returnLuisFormat = null; // Variables tipo enteros int operacionMatematica = 0; // Instancia con las APIS var bot = new ConnectToBot(); var uri = new Uri(Request.Url.AbsoluteUri); List <string> exchangeRate = new List <string>(); //Generate a URL from the URI var url = $"{uri.Scheme}://{uri.Host}:{uri.Port}"; //Generate a hub client to specified url var hub = new HubConnection(url); //Generate a hub proxy to specified hub IHubProxy proxy = hub.CreateHubProxy("SamiChatHub"); var datosSamiApi = (from samiapi in _db.ApiConversacions select samiapi).First(); var resultadosApi = await bot.GetAnswersAsync(datosSamiApi.SamiApiKey , datosSamiApi.SamiApiLink , textUser , model.CompanyId , model.IdUserAspNetUser , model.OS , model.Name); model.RepliedByBot = false; casoJson = resultadosApi.TipoCaso; respuesta = resultadosApi.Respuesta; respuestaLuis = resultadosApi.FormatoLuis; intencion = resultadosApi.Intencion; entidad = resultadosApi.Entidades; puntajeLuis = resultadosApi.PuntajeLuis; puntajeQnA = resultadosApi.PuntajeQnA; /* * Aquí pasa la función para guardar a la tabla de reporte. */ if (casoJson != "2" && casoJson != "5") { string[] convertido = respuestaSami.Split(new[] { "<script>" }, StringSplitOptions.None); var chatReportSami = SaveReportChatSami(model.IdSesionSaved, model.Name, model.IdUserAspNetUser, textUser, respuesta, respuestaLuis, model.OS, intencion, entidad, puntajeLuis, puntajeQnA, "Web"); } switch (casoJson) { case "1": // Escenario sin paso de QnA: ¿Que necesitas de....?, ¿Qué necesitas ...? respuestaFinal = queryLuis + "<script>nextQuery();</script>"; rating = null; break; case "2": // Escenario respuesta del caso consultado. respuestaFinal = "Tengo resultado de tu ticket, estos son los datos: <br/></script><script>nextQuery();</script>"; // Convertimos el archivo xml en texto XElement caResult = XElement.Parse(queryLuis); // Se toma solo las etiquetas <AttrValue></AttrValue> var att = caResult.Descendants("AttrValue").ToList(); // Se crea un array de cadena de texto. string[] lista = { "<br/>Estado: ", "<br/>Caso Asignado a: ", "<br/>Descripción: " }; // Se combina el resultado de CA con la cadena de Array var answerCA = att.Zip(lista, (n, w) => new { Number = n, Word = w }); foreach (var nw in answerCA) { // Se imprime los resultados junto con la cadena de array, aquí se elimina el <AttrValue></AttrValue> respuestaFinal += String.Join(" ", nw.Word.ToString() + nw.Number.Value); } // Se desactiva panel de calificación. rating = null; break; case "3": //Escenario respuesta de QnA sin FeedBack respuestaFinal = respuesta + "<script>nextQuery();</script>"; // Se desactiva el panel de calificación. rating = null; break; case "4": //Escenario de QnA con FeedBack respuestaFinal = respuesta; // Activa el panel de calificación rating = ReturnView(); break; case "5": // Escenario pasa al agente automático. respuestaFinal = "No tengo una respuesta a tu pregunta en este momento.<script>AutoQueueForAgentChat();</script>"; rating = null; break; case "6": // Escenario pasa al agente automático. respuestaFinal = respuesta + "<script>AutoQueueForAgentChat();</script>"; rating = null; break; } //Start hub connection await hub.Start(); //Set chat model values model.Name = "Pólux"; model.Message = respuestaFinal + $"<br/><small><b>LUIS: {respuestaLuis} <br/> PUNTAJE LUIS: {puntajeLuis} <br/> PUNTAJE QNA: {puntajeQnA}</b></small>"; model.ProfilePictureLocation = "bot-avatar.png"; //Send answer message await proxy.Invoke <ChatViewModel>("sendChatMessage2", model); //Send acceptable answer or switch to agent prompt if (rating != null) { // Tiempo de espera por longitud. operacionMatematica = respuestaFinal.Length * 50; Thread.Sleep(operacionMatematica); model.Message = rating; await proxy.Invoke <ChatViewModel>("sendChatMessage2", model); } //Stop hub connection hub.Stop(); return(View(model)); }
public async Task <ActionResult> GenerateAnswer(ChatViewModel model) { // Iteracción entre el usuario y s@mi Bot // Variables tipo texto string textUser = model.Message, queryLuis = "", respuestaFinal = "", intencion = "", respuestaSami = "", entidad = "", casoJson = "", respuestaLuis = "" , puntajeLuis = "", puntajeQnA = "", respuesta = ""; // Variables tipo texto array string[] returnLuisFormat = null; // Variables tipo enteros int operacionMatematica = 0; // Instancia con las APIS var bot = new ConnectToBot(); var uri = new Uri(Request.Url.AbsoluteUri); List <string> exchangeRate = new List <string>(); //Generate a URL from the URI var url = $"{uri.Scheme}://{uri.Host}:{uri.Port}"; //Generate a hub client to specified url var hub = new HubConnection(url); //Generate a hub proxy to specified hub IHubProxy proxy = hub.CreateHubProxy("SamiChatHub"); var datosSamiApi = (from samiapi in db.ApiConversacions select samiapi).First(); var resultadosApi = await bot.GetAnswersAsync(datosSamiApi.SamiApiKey , datosSamiApi.SamiApiLink , textUser , model.CompanyId , model.IdUserAspNetUser , model.OS , model.Name); model.RepliedByBot = true; casoJson = resultadosApi.TipoCaso; respuesta = resultadosApi.Respuesta; respuestaLuis = resultadosApi.FormatoLuis; intencion = resultadosApi.Intencion; entidad = resultadosApi.Entidades; puntajeLuis = resultadosApi.PuntajeLuis; puntajeQnA = resultadosApi.PuntajeQnA; /* * Aquí pasa la función para guardar a la tabla de reporte. */ if (casoJson != "2" && casoJson != "5" && casoJson != null) { string[] convertido = respuestaSami.Split(new[] { "<script>" }, StringSplitOptions.None); var chatReportSami = SaveReportChatSami(model.IdSesionSaved, model.Name, model.IdUserAspNetUser, textUser, respuesta, respuestaLuis, model.OS, intencion, entidad, puntajeLuis, puntajeQnA, "Web"); } switch (casoJson) { case "1": // Escenario sin paso de QnA: ¿Que necesitas de....?, ¿Qué necesitas ...? respuestaFinal = respuesta + "<script>nextQuery();</script>"; rating = null; break; case "2": var consultaCa = new ConsultaCA(); // Aquí se guarda la petición en consultar un ticket o caso. string numericPhone = new string(textUser.ToCharArray().Where(c => Char.IsDigit(c)).ToArray()); // Pasa por el método para conectarse con CA y consulta el ticket solicitado. respuestaFinal = await consultaCa.GetTicketCa(numericPhone, model.CompanyId) + "<script>nextQuery();</script>"; break; case "3": //Escenario respuesta de QnA sin FeedBack respuestaFinal = respuesta + "<script>nextQuery();</script>"; // Se desactiva el panel de calificación. rating = null; break; case "4": //Escenario de QnA con FeedBack respuestaFinal = respuesta; // Activa el panel de calificación rating = ReturnView(); break; case "5": // Escenario pasa al agente automático. respuestaFinal = "No tengo una respuesta a tu pregunta en este momento.<script>AutoQueueForAgentChat();</script>"; rating = null; break; case "6": // Escenario pasa al agente automático. respuestaFinal = respuesta + "<script>AutoQueueForAgentChat();</script>"; rating = null; break; default: // Escenario pasa al agente automático. respuestaFinal = "No estoy entrenado para ese tipo de preguntas. ¿En qué te puedo ayudar? <script>nextQuery();</script>"; rating = null; break; } //Start hub connection await hub.Start(); //Set chat model values model.Name = "Pólux"; model.Message = respuestaFinal; model.ProfilePictureLocation = "bot-avatar.png"; //Send answer message await proxy.Invoke <ChatViewModel>("sendChatMessage", model); //Send acceptable answer or switch to agent prompt if (rating != null) { // Tiempo de espera por longitud. operacionMatematica = respuestaFinal.Length * 50; Thread.Sleep(operacionMatematica); model.Message = rating; await proxy.Invoke <ChatViewModel>("sendChatMessage", model); } //Stop hub connection hub.Stop(); return(View(model)); }