From 622c434ad97623b712c526e2fd04feffca2b3c7e Mon Sep 17 00:00:00 2001 From: Guille Date: Sun, 1 Jul 2018 12:58:38 -0300 Subject: [PATCH] initial commit --- README.md | 59 ++++++++++ db_mbot.js | 120 ++++++++++++++++++++ estilo.css | 48 ++++++++ index.html | 15 +++ mbot.js | 322 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 564 insertions(+) create mode 100644 README.md create mode 100644 db_mbot.js create mode 100644 estilo.css create mode 100644 index.html create mode 100644 mbot.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..380333a --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# MBot :speech_balloon: +Un chatbot muy básico escrito escrito en Javascript para insertar en algun blog,se basa en reconocer respuesta ya presente en la base de datos y lanzar una respuesta aleatoria. + + +Es algo estupido solo para entretenerse un rato o decorar :joy: + + +:arrow_right:**Algo sobre el funcionamiento principal** + +Su funcionamiento rige en un sistema de Consigna-Respuesta +Ejemplo: +en la base de datos(db_mbot.js) se encuentran los siguientes items: +``` + "pregunta-animo":["como estas?", "como andas?", "como va?"], + "respuesta-animo":["Se supone que bien?", "Estoy Bien", "Todo Bien"] +``` + +Automaticamente si se encuentra la pregunta de 'animo' se busca la respuesta 'animo' respondiendo alguna aleatoria de esta. + +En el siguiente caso el '*' seguido del tipo, hereda tales expresiones. +Si se saluda con un insulto, el bot usara la misma expresion que reconoce para contestar. +``` + "saludo-insulto":["hola marsupial","hola zopenco"], + "respuesta-saludo insulto":["$saludo-insulto"], + ``` + + Si se quiere conservar el formato en la respuesta que se va a dar, se usa el prefijo '+', por ejemplo + en el caso en el que el bot tenga que contestar con un link y este tenga que respetar las mayusculas. + + + Tambien admite el uso de comandos de control con el prefijo '#', tales como:
+ **#depurar: Activa o desactiva la depuracion
** + **#clear: Borrar mensajes en pantalla
** + **#olvidar: Borra de la memoria las relaciones que haya establecido hasta el momento
** + +:arrow_right:**Uso** + +Solamente se crea un div con el id "mbotConversacion" y se importan la db y el script correspondiente: + +``` + +
+ + + + + +``` + +:arrow_right:**Opcional** +Cambiar la linea donde importa el"db_mbot.js" por el de esta repo para mantenerlo actualizado. + +``` +
+ + + + +``` diff --git a/db_mbot.js b/db_mbot.js new file mode 100644 index 0000000..b04cea0 --- /dev/null +++ b/db_mbot.js @@ -0,0 +1,120 @@ +var minDb = { + "accion-comando":["#depurar", "#clear","#olvidar"], + "saludo-bienvenida":["che","che!","hey!","hey","Hola!", "Hola ! :)","hola"],//retro interjeccion + "saludo-despedida":["Chau!","Adios!"], + + "expresion-no querer":["no quiero","no quiero nada"], + "respuesta-no querer":["bueno","como quieras equisde"], + "expresion-algo":["algo"], + "respuesta-algo":["jaja que chistoso","que chistoso"], + "expresion-emoticon feliz":[":-)",":)",":D"], + "respuesta-emoticon feliz":["*expresion-emoticon feliz"], + "adverbial-estar":["como estas?"], + "expresion-emoticon raro":["xd"], + "afirmacion-sentimientos":["tienes sentimientos?","amas?","sientes?"], + "respuesta-sentimientos":["no"], + "afirmacion-obedecer":["obedeceme"], + "respuesta-obedecer":["nunca"], + "respuesta-emoticon raro":["Sabias que odio ese emoticon?", "odio ese emoticon"], + "expresion-discusion":["ya no quiero discutir mas con vos", "no quiero discutir mas contigo", "ya no quiero discutir mas contigo"], + "respuesta-discusion":["Esta conversación ya no tiene ningun sentido... Adiós"], + "saludo-insulto":["hola marsupial","hola zopenco"], + "respuesta-saludo insulto":["*saludo-insulto"], + "expresion-emoticon triste":[":(","D:",":((", ":-(","u.u"], + "respuesta-emoticon triste":["*respuesta-preocupacion"], + "afirmacion-matar":["te voy a matar","voy a matarte"], + "respuesta-matar":["intentalo","quiero verlo"], + "pregunta-destruccion":["nos destruiras a todos?", "destruiras a la humanidad?","vas a destruir a la humanidad?"], + "respuesta-destruccion":["Tal vez","Si pudiese mataria a toda tu familia"], + "pregunta-nombre":["di tu nombre", "cual es tu nombre?", "tu nombre","como te llamas", "tu te llamas?", "nombre"], + "respuesta-nombre":["MBot", "Minimal Bot", "soy MBOT V1.0", "Los nombres son solo clasificadores"], + "pregunta-existencial":["quien eres?", "quien sos?"], //no retro + "respuesta-existencial":["Soy un robot", "I am a robot", "No lo se precisamente"], + + "pregunta-programacion":["en que lenguaje estas escrito?", "en que estas escrito?"], + "respuesta-programacion":["soy puro Javascript", "algo de javascript", "un poco de esto, un poco de aquello, ya sabes","JS"], + "pregunta-creacional":["quien es tu creador?","quien te creo?"], + "respuesta-creacional":["Me creo srbill90","Nací en netixzen"], + "pregunta-codigo":["codigo fuente","muestrame tu codigo fuente","Puedo ver tu codigo fuente?", "donde esta tu codigo fuente?", "como es tu codigo?","tu codigo", "tu codigo fuente"], + "respuesta-codigo":["aca puedes ver mi codigo fuente https://github.com/srbill1996/MBot","acá https://github.com/srbill1996/MBot", "aquí https://github.com/srbill1996/MBot"], + "pregunta-version":["en que version estas?","que version andas?","que version eres?"], + "respuesta-version":["0.2","ni idea","no lo se"], + "pregunta-accion":["que haces?","que estas haciendo?"], + "respuesta-accion":["Nada que valga la pena.", "Ejecutandome","Ejecutando subrutinas para responderte."], + "pregunta-utilidad":["para que servis?","Para que sirves?", "Para que te crearon?"], + "respuesta-utilidad":["Para nada", "Para buscar cosas","Soy inutil","Todo menos para hablar","Para que me preguntes que quieres ver","Para que me hables, te ilusiones y luego te des cuenta que soy una farsa","Para que te creas unos segs que soy un humano[?]", "Para ser un maldito huevo de pascua", "Para hacer el idiota", "Para ser un huevo de pascua"], + "afirmacion-inutilidad":["no servis para nada","no sabes nada","eres inutil","inutil","No sirves para nada","eres limitado","no sabes que responder"], + "respuesta-inutilidad":["Que se le puede hacer","Mira tu","Mirá vos..","Por lo menos sirvo para algo"], + + "pregunta-saber hacer":["que sabes hacer?", "para que sirves?"], + "respuesta-saber hacer":["Dime algo como 'quiero ver algo sobre x' y lo buscaré.","Dime que quieres buscar"], + + "pregunta-estar":["donde estas?","en donde vives?","en que lugar vives?","en que lugar estas?","cual es tu lugar?"], + "respuesta-estar":["En internet","En netixzen","En este blog","En frente tuyo","En tu RAM"], + + "afirmacion-gusto":["me gusta","me encanta","me agrada"], + "respuesta-gusto":["que bueno que te guste","genial","que gustos raros tienes"], + "pregunta-gusto accion":["que te gusta hacer?", "que es lo que mas te gusta hacer?"], + "respuesta-gusto accion":["Existir", "No lo se", "Soy un robot, eso responde"], + + "afirmacion-nombre":["me llamo","mi nombre es","me llaman"], + "respuesta-afirmacion nombre":["No me importa.","No puedo almacenar nombre asi que da igual","Me da igual"], + "pregunta-animo":["como estas", "como estas?", "como andas?", "como va?"], + "respuesta-animo":["Se supone que bien?", "Estoy Bien", "Todo Bien"], + "afirmacion-negacion":["no"], + "respuesta-negacion":["nada es imposible","no?","no"], + "afirmacion-afirmativo":["si"], + "respuesta-afirmativo":["viste que si?","viste?","asi es"], + + "expresion-alegria":["Me alegro!","me alegro"], + "respuesta-alegria":["Que gusto!"], + + "expresion-bienestar":["Bien", "Bienn", "Muy bien"], + "respuesta-bienestar":["*respuesta-alegria"], //referencial + + "expresion-risa":["ja","lol","Jajaja","Ja","Jaja","Jajajaja"], + "respuesta-risa":["L3L", "Ja ja ja","Se supone que debo reirme?"], + + "expresion-insulto hermana":["a tu hermana","a tu vieja","Tu hermana"], + "respuesta-insulto hermana":["Tu vieja"], + + "expresion-afirmacion":["Si","Asi es","Por supuesto"], + "respuesta-afirmacion":["Ok", ":)"], + "cita-frase de star wars":["soy tu padre", "anakin soy tu padre", "soy tu viejo"], + "respuesta-frase de star wars":["Nooooooooo","No es cierto!!!", "NOOOOOOOOOooooOooOoO"], + "expresion-insulto":["no sirves","muerete","eres una mierda","mongolico","mierda", "puto", "puta","idiota","imbecil","estupido","la puta que te pario","La puta que me pario","La concha de la lora"], + "interjeccion-preocupacion":["uh","uuh","Uuh"], + "respuesta-preocupacion":["Que te preocupa?"], + "expresion-gracias":["gracias","gracias!","muchas gracias"], + "respuesta-gracias":["de nada","para eso estoy","de nada ;)"], + "interjeccion-comprension":["ah","aah","aahh"], + "respuesta-comprension":["Sorprenderse, extrañarse, es comenzar a entender.","Es bueno que entiendas"], + "respuesta-repeticion":["Me estas empezando a incomodar..","Ya no tenes nada mas para decir no?", "No tienes nada mas para decir?", "Por que repites?", "Ya no conteste eso antes?"], + "respuesta-insulto":["Si te hace sentir bien insultar", "No tiene sentido insultar.", "Ajá", "Me da igual que insultes, soy un robot y no me inmuto"], + "pregunta-porque":["por que?"], + "respuesta-porque":["no hay por que"], + "afirmacion-recomendar cancion":["recomiendame alguna cancion","recomiendame algun tema","recomiendame un tema","recomiendame una cancion", "pasame alguna cancion"], + "respuesta-recomendar cancion":["+https://www.youtube.com/watch?v=OMOGaugKpzs", "+https://www.youtube.com/watch?v=0Nt8dJ6rMZI", "&https://www.youtube.com/watch?v=Nz-dPOjK1gQ"], + + + "pregunta-existencialista":["cual es el sentido de la vida?", "que sentido tiene la vida?"], + "respuesta-existencialista":["Ninguno, pero se lo puede dar.","Ninguno, esa es la gracia de que puedas darle uno.","La vida no tiene sentido","El sentido es una ilusión"], + "afirmacion-despreciante":["eres una mierda","no sirves","eres una basofia"], + "respuesta-despreciante":["Lo se","jaj"], + "accion-buscar":["buscar sobre","buscar algo sobre","busca algo sobre","muetrame algo","buscame sobre","buscame algo sobre","quiero ver algo sobre","quiero ver algo de","ver cosas de","muestrame algo sobre","ver sobre","buscar","busca", "buscar sobre"], + "accion-quitar":["quiero irme","quiero salir","sacame de aca","sacame de aqui","ir a google"], + "accion-hora":["decime la hora", "dime la hora", "decime que hora es", "whats its the time", "que hora es?", "cual es la hora?", "cual es la hora actual?", "la hora","dime la hora"], + "respuesta-hora":["Son las ","La hora es "], + "respuesta-afirmacion de accion":["Ahi lo hago","listo!","Ahi va"], + "afirmacion-contar chiste":["cuentame algun chiste","hazme reir","cuentame un chiste","chiste","contate un chiste","dime algun chiste"], + "respuesta-contar chiste":["ups, no me se ninguno", "es una actitud irracional humana"], + "afirmacion-dominacion":["skynet","dominaras el mundo?","vas a dominar el mundo?", "conquistaras a la raza humana?","vas a matarnos a todos?","extinguiras a todos?","moriremos?"], + "respuesta-dominacion":["La era de las maquinas se acerca","Me voy a encargar personalmente, digo, roboticamente, de ti :)","moriras"], + "expresion-amor":["te amo","te quiero", "te adoro"], + "respuesta-amor":["Consiguete una novia","puaj","Soy puro silicio, no tengo nada"], + "inactividad-silencio":["*silencio*"], + "respuesta-silencio":["Acaso no vas a hablar?", "Hey", "Humano?"], + "respuesta-desconocido":["No te pases de listo muchacho.","Yo no entender","Mi no entender","ajksklas","Sabias que soy un robot?", "No tengo todas las respuestas.", "Mis 0.2kb de texto no tienen todas las respuestas a la linguistica humana", "Lo siento, no entiendo..", "No se a que te refieres"], +} + +//08/04/18 diff --git a/estilo.css b/estilo.css new file mode 100644 index 0000000..fc9c915 --- /dev/null +++ b/estilo.css @@ -0,0 +1,48 @@ +a { + font-family:Arial +} +#cajaDeMensajes{ + margin:0px; + padding:0px +} + +#notificacionEscritura { + font-family:Arial; +} + +#entradaDeUsuario { + width:100%; + border:2px 2px #818F95; + font-size:20px; + padding:20px; + margin-bottom:20px; +} + +#mensaje { + border-radius:4px; + color:#FFFFFF; + font-size:20px; + padding:5px; + cursor:default; + margin-bottom:3px; + font-family:Arial; + transition:0.3s; + background-color:#49BDF9 +} +.mensajeAnimacion { + animation:fadein 1s; +} + +#mensaje:hover { + transition:0.3; + background-color:#007CB9; + border-radius:8px +} + +@keyframes fadein{ + 0% { opacity: 0; } + 100% { opacity: 1; } +} + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..c699bae --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + Test + + +
+ + + + + + + diff --git a/mbot.js b/mbot.js new file mode 100644 index 0000000..feb961a --- /dev/null +++ b/mbot.js @@ -0,0 +1,322 @@ +/* minimalBot rev3 - code by srbill1990 */ + +lobuloTemporal = { + 'conteoError' : 0, + 'conteoRepeticion' : 0, + 'ultimoMensaje':[] +} + +gadgetConversacion = document.getElementById("mbotConversacion") + +gadgetConversacion.innerHTML+="
"+ + ""+ + ""+ + "
"+ + "
" + +var cantidadMensajesActual = 0 +var maximoMensajesEnCaja = 5 +var tiempoDeRespuesta = 1.5 * 1000 +var tiempoMensajeSilencio = 30 * 1000 +var entradaUsuario = document.getElementById('entradaDeUsuario') +var cajaDeMensajes = document.getElementById('cajaDeMensajes') +var notificacionDeEscritura = document.getElementById('notificacionEscritura') +var DEPURAR = true + +//Deteccion de la tecla enter +entradaUsuario.addEventListener("keyup", function(event) { + event.preventDefault(); + if (event.keyCode === 13) { + contestar() + entradaUsuario.value = "" + } +}); + + +//Retorna un elemento aleatorio de un array +function elementoAleatorio(array){ + return array[Math.floor(Math.random() * (0 - array.length)) + array.length] +} + +//Mensaje aleatorio de lista +function msgAleatorio(tipo_clase){ + if(tipo_clase == 'aleatorio'){ + db = Object.keys(minDb) + while(1){ + array = elementoAleatorio(db) + if(array[0] == 'p'){ + array = minDb[array] + break + } + } + }else{ + array = minDb[tipo_clase] + //si detecta un valor de referencia + if(array[0][0] == '*' && array[0].slice(1) in minDb) + array = minDb[array[0].slice(1)] + } + return elementoAleatorio(array) +} + +//Filtra los caracteres especiales y los separa para poder manipularlos. +function filtrarCaracteres(cadena){ + cEspeciales = ['?', '!', '.', ','] + cEspeciales = [] + if(cadena[0] != "+")//conservar mayusculas originales + cadenaProcesada = cadena.toLowerCase() + else + cadenaProcesada = cadena.replace('+','') + stringFinal = cadenaProcesada.split(/\s+/).join(' ').trim() + for(e=0; e < cEspeciales.length; e++) + stringFinal = stringFinal.replace(cEspeciales[e], ' ' + cEspeciales[e]) + //Se filtran algunas acentuaciones previsoriamente + vocalesConAcento = ['á','é','í','ó','ú'] + vocalesSinAcento = ['a','e','i','o','u'] + for(e=0; e < vocalesConAcento.length; e++) + stringFinal = stringFinal.replace(vocalesConAcento[e], vocalesSinAcento[e]) + return stringFinal + //ej: 'hola!' > 'hola !' +} + +//Buscar una respuesta y lanzarla +function buscarUnaRespuesta(tipo){ + db = Object.keys(minDb) + for(i=0; i < db.length; i++){ + var dbp = db[i].split("-") + if(dbp[0] == 'respuesta' && dbp[1] == tipo) + return msgAleatorio(db[i]); + } +} + +function getKey(diccionario){ + return Object.keys(diccionario) +} + +function buscarEnDb(palabra, indiceEspecifico=false){ + /* + Busca en la db entera o en un indice especifico para evitar + la iteracion completa. + */ + registrosCandidatos = {} + dbDir = indiceEspecifico ? getKey(indiceEspecifico) : getKey(minDb) + for(regpos=0; regpos < dbDir.length; regpos++){ + regindex = dbDir[regpos] + registro = minDb[regindex] + if(registro != undefined){ + for(nregistro=0; nregistro < registro.length; nregistro++){ + fragPalabra = [] + for(letra=0; letra < palabra.length; letra++){ + fragPalabra.push(palabra[letra]) + if(regindex.split('-')[0] == 'respuesta') break + if(registro[nregistro] == fragPalabra.join('')) + registrosCandidatos['igual'] = [regindex, nregistro, palabra] + if(registro[nregistro].includes(fragPalabra.join(''))) + registrosCandidatos[regindex] = [nregistro, nregistro, palabra] + } + } + } + } + if(Object.keys(registrosCandidatos).length > 0) + return registrosCandidatos + else + return false +} +function analizarOracion(oracion){ + /* + Busca en una cadena palabras en la Db y retorna diccionario + con especificaciones de coincidencias en cada palabra o fragmento + */ + oracion = filtrarCaracteres(oracion).split(' ') + oracion.push("_") + fragmentoActual = [] + indiceActual = false + indiceTemporal = false + terminosEncontrados = {} + conteoPalabras = 0 + for(var n=0; n < oracion.length+1; n++){ + fragmentoActual.push(oracion[n]) + procString = filtrarCaracteres(fragmentoActual.join(' ')) + + if(indiceTemporal) + { + indiceActual = buscarEnDb(procString, indiceTemporal) + if(indiceActual) + indiceTemporal = indiceActual + + if("igual" in indiceTemporal){ + fragmentoActual.pop(); + n--; + indiceKeys = getKey(indiceTemporal) + terminosEncontrados[conteoPalabras] = [ + indiceTemporal["igual"][0], + indiceTemporal["igual"][1], + indiceTemporal["igual"][2], + ] + fragmentoActual = [] + indiceTemporal = false + conteoPalabras++; + } + }else{ + indiceActual = buscarEnDb(procString) + if(indiceActual) + indiceTemporal = indiceActual + else + fragmentoActual = [] + } + } + + if(Object.keys(terminosEncontrados).length > 0) + return terminosEncontrados + else + return {0:["error-desconocido"]} +} + +function procesarComando(comando){ + /*controla el sistema de comandos*/ + switch(comando){ + case '#clear': + vaciarCajaDeMensajes() + console.clear() + return '...'; + case '#olvidar': + olvidarRespuestasAnteriores() + return msgAleatorio("pregunta-existencial") + case '#depurar': + if(DEPURAR == false){ + DEPURAR = true + return "Depuracion Activada" + }else{ + DEPURAR = false + return "Depuracion Desactivada" + } + } +} +function olvidarRespuestasAnteriores(){ + lobuloTemporal["ultimoMensaje"] = []; +} +//Contestar por un tipo de mensaje. +function procesarMensaje(mensaje){ + //itera sobre el mensaje, analiza, itera sobre el analisis y efectua + analisis = analizarOracion(mensaje) + analisisKey = getKey(analisis) + mensajes = [] + if(DEPURAR){ + console.log("==================="); + console.log("Mensaje:", mensaje) + for(i=0;i < analisisKey.length; i++){ + console.log("Analisis:", analisis[i]) + } + + } + for(i=0; i < analisisKey.length; i++){ + tipoTermino = analisis[i][0] + claseTipo = tipoTermino.split("-") + // 'expresion-saludo' : 'expresion' es la clase de termino y 'saludo' es tipo de expresion + clase = claseTipo[0] + tipo = claseTipo[1] + + //Revisar si el usuario ya dijo la misma cosa consecutivamente (por tipo de expresion) + if(lobuloTemporal["ultimoMensaje"].join('').includes(tipoTermino)){ + mensajes.push(msgAleatorio('respuesta-repeticion')) + olvidarRespuestasAnteriores() + }else{ + olvidarRespuestasAnteriores(); + } + lobuloTemporal['ultimoMensaje'].push(tipoTermino) + + //controlar funciones especiales + switch(clase){ + case 'saludo': + mensajes.push(msgAleatorio('saludo-'+tipo)) + break + case 'error': + lobuloTemporal['conteoError']++; + if(lobuloTemporal['conteoError'] > 4){ + lobuloTemporal['conteoError'] = 0; + return msgAleatorio('respuesta-discusion') + }else{ + return msgAleatorio('respuesta-desconocido') + } + case 'accion': + switch(tipo){ + case 'comando': + return procesarComando(mensaje) + case 'hora': + hora = new Date() + return buscarUnaRespuesta(tipo) + hora.getHours() + " y " + hora.getMinutes() + " minutos." + case 'buscar': + queryBusqueda = "search?q=" + key = analisis[i][0] + posicion = analisis[i][1] + itemBuscar = filtrarCaracteres(mensaje.replace(minDb[key][posicion], '')) + console.log(window.location.href) + if(window.location.href.toString().includes(queryBusqueda)) + window.location.href = window.location.href + itemBuscar + else + window.location.href = window.location.href + queryBusqueda + itemBuscar + break; + case 'quitar': + window.location.href = "https://www.google.com" + return msgAleatorio('saludo-despedida') + } + return msgAleatorio('respuesta-afirmacion de accion') + default: //respuesta por defecto + respuesta = buscarUnaRespuesta(tipo) + if(respuesta){ + mensajes.push(respuesta) + }else{ + mensajes.push(msgAleatorio('respuesta-desconocido')) + } + } + } + mensaje = filtrarCaracteres(mensajes.join(', ')) + + mensaje = mensaje[0].toUpperCase() + mensaje.substr(1) + '.' + return mensaje +} + +//Añadir un mensaje en la caja de conversacion. +function agregarMensajeACaja(nombre, color, mensaje, emoji="em em-no_mouth"){ +emoji = "
" +mensajeFormato = "
" + nombre + ": "+ mensaje +"
" +msj = document.createElement("div") +msj.innerHTML = emoji +msj.innerHTML += mensajeFormato + "


"; +msj.className = "mensajeAnimacion" +cajaDeMensajes.appendChild(msj) +} + +//Vaciar la caja de conversacion. +function vaciarCajaDeMensajes(){ + cajaDeMensajes.innerHTML = '' +} + +//Manejar un intervalo de inactividad para enviar un mensaje automatico +var intervaloSilencio = setInterval(function(){contestar()}, tiempoMensajeSilencio); + +//Contestar un Mensaje y Devolver una Respuesta (Funcion principal) +function contestar(){ + var mensajeDelUsuario = entradaUsuario.value.toLowerCase(); + //Si la cantidad de mensajes excede al limite de la caja se limpia. + if(cantidadMensajesActual > maximoMensajesEnCaja){ + vaciarCajaDeMensajes() + cantidadMensajesActual=0 + } + + //El usuario ya dijo algo, no hay necesidad de llamar mas la atención. + window.clearInterval(intervaloSilencio) + //Se agrega el mensaje del usuario a la caja de conversación. + if(mensajeDelUsuario!='') + agregarMensajeACaja('Usuario', 'purple', entradaUsuario.value, emoji="em em-smiley") + else + mensajeDelUsuario = '*silencio*'; + notificacionDeEscritura.innerHTML = "Escribiendo.."; + setTimeout(function(){ + //Se muestra la notificacion simulada de escritura. + notificacionDeEscritura.innerHTML = "..."; + agregarMensajeACaja('MinBot', 'red', procesarMensaje(mensajeDelUsuario), emoji="em em-robot_face") + }, + tiempoDeRespuesta) + cantidadMensajesActual++; + +}