¡Habla! chat basado en geolocalización
¡Habla! es una app de chat que desarrollé como proyecto personal para aprender un poco más sobre websockets y porque nunca había hecho una aplicación de chat y ya tocaba.
Pero hacer una simple aplicación de chat no tiene mucho sentido, tenía que agregarle algo para hacerla un poquito más interesante, así que se me ocurrió la maravillosa idea de que en esta app los usuarios se conectan para chatear con otros usuarios que se encuentren físicamente cerca. Pero no cerca en la misma ciudad ni en el mismo barrio, sino un poco más cerca. Tan cerca como a un radio de 200 metros. Not creepy at all!
Dentro de la app se encuentra lo que llamé "Radar", que el usuario puede encender o apagar a su gusto. Cuando está encendido registra la ubicación del usuario, lo hace visible a los demás y muestra a todos los usuarios conectados al rededor. Apagado esconde al usuario y no permite recibir ni enviar mensajes.
Los mensajes no se guardan en la base de datos, son entregados directamente entre cliente y cliente, por lo tanto al desconectarse, apagar el radar, o cerrar la app se pierden todos los mensajes y no se pueden recuperar. Evidentemente no es posible contactar con usuarios desconectados.
No existe forma (aún) de agregar a otros usuarios a una lista de amigos/contactos. La lista de usuarios conectados muestra unicamente a los usuarios que están activos en el momento cerca de ti. Si un usuario se desconecta o se aleja desaparecerá de la lista de usuarios conectados hasta que vuelva a conectarse cerca de ti.
La app está hecha en NodeJs con la ayuda de Socket.IO y MongoDB para la base de datos. En el front-end no hay nada más que HTML, CSS y JavaScript y la librería de Socket.IO para cliente. Está alojada en Render que hasta ahora me ha funcionado bien como alternativa a Heroku.
Puedes probarla en hablaapp.onrender.com en su versión 0.2.0-beta pero tienes que pedirle a alguien más que entre también por que no puedes chatear solo y seguro que no hay nadie conectado :(. O puedes crearte dos cuentas y usar dos dispositivos/navegadores a la vez.
Lo que sigue y lo que falta #
Estoy bastante satisfecho con esta versión como punto de partida, pero quedan faltando muchas características que considero indispensables para considerar una app de este estilo utilizable y disponible para el público general y que por falta de tiempo no he implementado aún, como por ejemplo
- fotos de perfil
- verificación de e-mail al registrarse
- sistema de recuperación de contraseña
- selector de emojis
- encriptar mensajes
- notificaciones
- reportar y bloquear usuarios y
- convertirla en una PWA.
También ay algunas otras funciones que podría incluir pero en mi visión personal considero que no deberían ser incluidas nunca en esta app, como
- indicador de leído
- stickers
- sistema de compartimiento de archivos (ni de fotos ni de ningún tipo)
- agregar amigos/contacto
- notas de voz y
- llamadas.
En la parte técnica el código es horrible, ojalá nadie nunca lo vea hasta que lo refactorice. El servidor necesita mejor escalabilidad, hasta ahora solo se ha probado con tres usuarios a la vez pero seguro que no soportaría una gran cantidad de usuarios mensajeándose activamente todos a la vez. Además debe estar llena de errores que no he encontrado por falta de pruebas.
Creo que estaría bien agregar una base de datos en memoria como Redis para guardar la ubicación de los usuarios y así agilizar la consulta y entrega de la lista de usuarios cercanos.
En el front-end estoy considerando una mejor estrategia para renderizar la lista de usuarios ya que ahora mismo podría ralentizarse muy fácilmente con una lista de usuarios larga. Lo mismo con la cantidad de mensajes en la ventana de chat.
Notas finales #
Desarrollar una app de chat es más complejo de lo que puede parecer al principio. La gente siempre va a querer emojis, stickers, audios, gifs, reenviar, reaccionar, compartir archivos, llamadas, archivar, backups, estados/historias, chats grupales, mensajes efímeros, seguridad, etc… y las grandes apps del mercado ya ofrecen todo esto mejor que tú, así que si estás pensando en hacer una app de chat para competir, te recomiendo que mejor no. A menos que solo quieras agregarle una función de chat a tu producto ya existente, en ese caso peor es nada.
Sé que la idea suena peligrosa. Que personas que están cerca puedan verte en linea y hablarte sin barreras da un poco de miedo. Pero considero que la interfaz de mensaje nuevo no es nada invasiva y la falta de marca de leído permite ignorar con comodidad. Además la app no comparte información personal delicada en ningún momento y el rango de distancia es lo suficientemente largo como para que no te encuentren con solo levantar la vista. En cualquier caso se puede apagar el radar y listo.
Honestamente esto es solo un experimento. Quiero seguir trabajando en esta app aunque sea solo por diversión, hasta tengo ideas para nuevas funciones, pero no prometo nada.