--- /usr/local/bin/gab	Thu Mar 18 18:45:30 2021
+++ /home/taro/bin/gab	Fri Sep 24 21:51:29 2021
@@ -1,66 +1,152 @@
 #!/usr/local/bin/bash
+
 # Gab es un cliente alternativo al programa de chat en  colorfield.space
-# Reemplace la variable $file_path con la ruta a tu historial de chat
+# Reemplace la variable $GAB_FILE con la ruta a su historial de chat
 # Se asume que cada línea de chat comienza con: "user_name >"
-# otros esquemas y formatos requerirán una modificación del script de awk
-# que se encuentra en las líneas 40 y 46 
 # # # # # #->
 
-help_text=$'GAB - Una simple interfaz de chat\n\nsyntax: gab [bandera] [valor]\n\nbandera          valor\n----------    ---------------\n-h, --help     ninguno\n-m, --msg      Mensaje entre comillas a enviar al chat\n-l, --log      Un número entero con la cantidad de filas que quieres ver, por defecto 5'
+HELP_TEXT=$(cat << EOF
+GAB - Una simple interfaz de chat
 
-file_path=/var/gab/chatlog.txt
-title="GAB v1.0"
-last_date="Último mensaje: $(date -r $(stat -f %m $file_path))"
+syntax: gab [bandera] [valor]
 
-if [ -z "$1" ]
+bandera          valor
+----------    ---------------
+-h, --help     ninguno
+-m, --msg      Mensaje entre comillas a enviar al chat\n
+-l, --log      Un número entero con la cantidad de filas que quieres ver, por defecto 5
+EOF
+)
+
+
+GAB_DEBUG=0
+
+[[ $GAB_DEBUG -eq 0 ]] && GAB_LOG=/var/gab/chatlog.txt || GAB_LOG="$HOME/chatlog.txt"
+
+TITLE="GAB v1.1 'Mirá mamá, sin comillas!!'"
+
+LAST_MSG_DATE=$(date -r $(stat -f %m $GAB_LOG))
+
+SEPARATOR='>'
+
+# chequeamos si se puede escribir en el chatlog
+if [[ ! -w "$GAB_LOG" ]] 
 then
-	echo $title
-	echo $last_date
+	echo "No es posible escribir en $GAB_LOG"
+	exit 1
+fi
+
+# https://github.com/dylanaraps/pure-sh-bible#trim-leading-and-trailing-white-space-from-string
+trim_string() {
+    # Usage: trim_string "   example   string    "
+
+    # Remove all leading white-space.
+    # '${1%%[![:space:]]*}': Strip everything but leading white-space.
+    # '${1#${XXX}}': Remove the white-space from the start of the string.
+    trim=${1#${1%%[![:space:]]*}}
+
+    # Remove all trailing white-space.
+    # '${trim##*[![:space:]]}': Strip everything but trailing white-space.
+    # '${trim%${XXX}}': Remove the white-space from the end of the string.
+    trim=${trim%${trim##*[![:space:]]}}
+
+    printf '%s\n' "$trim"
+}
+
+# Acá está la función que formatea las líneas y las imprime por pantalla
+# todas las cuestiones relacionadas con modificación de apariencia de la salida
+# de los mensajes debería ir por acá
+# https://github.com/dylanaraps/pure-sh-bible#parsing-a-keyval-file
+output_beautiful_messages(){
+	while IFS="$SEPARATOR" read -r user message; do
+		printf '\033[7m\033[1m %s\033[0m%s\n' "$user" "$message"
+		echo '- - -'
+	done
+}
+
+
+# Imprime las últimas n líneas del log de mensajes
+# parámetro 1 es la cantidad de líneas a leer
+# parámetro 2 es el path del archivo a leer
+print_last_n_lines() {
+	tail -n "$1" "$GAB_LOG" | output_beautiful_messages
+}
+
+
+# Imprime cabecera
+print_header() {
+	echo $TITLE
+	echo "Último mensaje: $LAST_MSG_DATE"
 	echo ""
-	tail -n 5 $file_path | awk '{out="\033[7m " $1 " \033[0m "; for (i=3; i<=NF; i++) {out=out" "$i}; print out ORS "- - -"}'
+}
 
+
+# Agrega un mensaje al final del log de mensajes
+# Primer parámetro: el mensaje
+add_message() {
+	IFS=' ' # necesario para $*
+	msg=$(trim_string "$*")
+
+	echo "$USER $SEPARATOR $msg" >> "$GAB_LOG"
+	if [ $? -eq 0 ]
+	then
+		echo "Mensaje agregado exitosamente al chatlog"
+		exit 0
+	else
+		echo "Error agregando mensaje al chatlog"
+		exit 1
+	fi
+}
+
+
+# Imprime los últimos mensajes
+# Por defecto imprime 5
+output_last_messages() {
+	# configuramos por defecto 5 líneas
+	lines=${1:-5}
+
+	print_header
+	print_last_n_lines "$lines"
+}
+
+
+
+# --- MAIN ---
+if [ -z "$1" ]
+then
+	output_last_messages
 else
 	case "$1" in
 		-m | --msg) 
 			if [ -z "$2" ]
 			then
-				echo "Debe incluir un mensaje entre comillas dobles"
+				echo "Debe incluir un mensaje"
 				exit 1
 			else
-				msg=$(echo $2 | sed -e 's/\r$//g')
-				echo "$USER >  $msg" >> $file_path
-				if [ $? -eq 0 ]
-				then
-					echo "Mensaje agregado exitosamente al chatlog"
-					exit 0
-				else
-					echo "Error agregando mensaje al chatlog"
-					exit 1
-				fi
-			fi;;
+				add_message ${@:2}
+			fi
+		;;
 		-l | --log) 
 			if [ -z "$2" ]
 			then
-				echo $title
-				echo $last_date
-				echo ""
-				tail -n 5 $file_path | awk '{out="\033[7m " $1 " \033[0m "; for (i=3; i<=NF; i++) {out=out" "$i}; print out ORS "- - -"}'
+				output_last_messages
 			elif [[ "$2" =~ ^[0-9]+$ ]]
 			then
-				echo $title
-				echo $last_date
-				echo ""
-				tail -n $2 $file_path | awk '{out="\033[7m " $1 " \033[0m "; for (i=3; i<=NF; i++) {out=out" "$i}; print out ORS "- - -"}'
+				output_last_messages $2
 			else
-				echo "Invalido: el valor debe ser entero"
+				echo "Error: el valor debe ser un número entero"
 				exit 1
-			fi;;
+			fi
+		;;
 		-h | --help) 
-			echo "$help_text"
-			exit 0;;
+			echo "$HELP_TEXT"
+			exit 0
+		;;
 		*) 
-			echo "Unknown flag $1"
-			exit 1;;
+			echo "Opción desconocida $1"
+			echo "$HELP_TEXT"
+			exit 1
+		;;
 	esac
 fi
 
