domingo, 30 de abril de 2017

MoMo: Cómo crear un chatbot que gestione los contactos

Una de las grandes ventajas de MoMo es la gran flexibilidad que ofrece el lenguaje de script y la gestión automática de los recuerdos, lo que nos permite abordar rápidamente todo tipo de tareas.



Por ejemplo, supongamos que queremos que nuestro flamante bot incluya una pequeña base de datos con nuestros contactos. En principio, vamos a almacenar solo el nombre del contacto y su número de teléfono. Esta sencilla regla se encarga de ello:

<rule>
    <input>teléfono de <wildcard lengthmin="1" name="$name$" /> es el <wildcard lengthmin="1" name="$phone$" /></input>
    <output script="forget();recentMemoryGetByItem(contact);recentMemoryFilterByAttributeValue(name,$name$);if(getRecentMemoryCount()==0){recentMemoryCreate(contact);recentMemorySetAttribute(name,$name$);};recentMemorySetAttribute(phone,$phone$);">Muy bien, el teléfono de $name$ es el $phone$.</output>
</rule>

El corazón de esta regla es un script, que vamos a analizar en detalle ahora:

forget();
Esta línea sencillamente indica que gestionaremos personalmente cómo se almacena la información (si no, el bot la almacenará en un formato predeterminado menos cómodo).
recentMemoryGetByItem(contact);
Cargamos en la memoria reciente del bot todos los datos de los contactos.
recentMemoryFilterByAttributeValue(name,$name$);
Filtramos los datos de los contactos, para dejar solo aquellos en los que el atributo "name" tiene como valor el nombre que el usuario ha indicado mediante el comodín $name$.
if(getRecentMemoryCount()==0){recentMemoryCreate(contact);recentMemorySetAttribute(name,$name$);};Si no se ha encontrado ningún contacto, creamos un nuevo contacto y definimos que su atributo "name" sea el valor del comodín $name$ especificado por el usuario.
recentMemorySetAttribute(phone,$phone$);
Definimos que su atributo "phone" sea el valor del comodín $phone$ especificado por el usuario.

¡Solo 7 instrucciones y hemos creado un sistema que no solo almacena los datos que nos interesan, sino que además evita que se introduzca información duplicada! Por supuesto, nuestro script podría ser más sofisticado. Por ejemplo, podría comprobar si ya se ha indicado el número de teléfono y, en tal caso, dependiendo de si coincide o no con el que ha indicado el usuario, mostrar una advertencia o, sencillamente, informar que ya se conocía el número de teléfono.

Claro que, por interesante que sea almacenar los datos de nuestros contactos, necesitamos una manera de recuperar esta información. Para ello, utilizaremos los siguientes reglas:

<rule>
    <input>teléfono de <wildcard lengthmin="1" name="$name$" /> ?</input>
    <output script="forget();recentMemoryGetByItem(contact);recentMemoryFilterByAttributeValue(name,$name$);if(getRecentMemoryCount()==0){throwExceptionById(xContactPhoneUnknown);};$result$=getRecentMemoryAttribute(phone);if(length($result$)==0){$data$=número de teléfono;throwExceptionById(xContactMissingData);}">El teléfono de $name$ es el $result$.</output>
</rule>
 <rule id="xContactPhoneUnknown">
    <output>No conozco a $name$.</output>
</rule>
 <rule id="xContactMissingData">
    <output>No sé su $data$.</output>
</rule>

Aunque son un total de tres reglas, dos de ellas se limitan a mostrar mensajes de advertencia, por lo que el corazón se encuentra, al igual que para la introducción de datos en un sencillo script, que también analizaremos a continuación:

forget();
Una vez más, indicamos que procesaremos nosotros la información.
recentMemoryGetByItem(contact);
Recuperamos todos los contactos...
recentMemoryFilterByAttributeValue(name,$name$);
...y dejamos solo aquellos en los que el atributo "name" sea el nombre indicado por el usuario.
if(getRecentMemoryCount()==0){throwExceptionById(xContactPhoneUnknown);};Si no hay ningún contacto con este nombre, es que se trata de un contacto desconocido.
$result$=getRecentMemoryAttribute(phone);
Recuperamos como resultado el atributo "phone" del contacto obtenido.
if(length($result$)==0){$data$=número de teléfono;throwExceptionById(xContactMissingData);}
Si la longitud del resultado es cero, indicamos que no conocemos el dato en cuestión.

Lo más enfoque es que este método es muy ampliable. Es decir, hemos escrito las reglas para guardar y recuperar los nombres y los números de teléfono de nuestros contactos, pero esa misma estructura puede utilizarse para guardar más datos, como el número de móvil, la dirección, el correo electrónico, etc. La información queda almacenada para utilizarla en cualquier otro punto del bot. Por ejemplo, el bot podría preguntarnos cada cierto tiempo si hemos visto a un contacto, pedir que le rellenemos los datos que desconoce, etc. ¡Y todo ello utilizando únicamente funciones básicas!

Si quieres practicar estos conocimientos, ¿podrías crear las reglas necesarias para registrar también el número de móvil? Y, si te tropiezas con alguna dificultad, ¡no dudes en avisarnos!

No hay comentarios:

Publicar un comentario