Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }