diff --git a/dobroho_vechora.bash b/dobroho_vechora.bash index 8bd4088..89d6f01 100755 --- a/dobroho_vechora.bash +++ b/dobroho_vechora.bash @@ -1,34 +1,75 @@ #!/bin/bash set -e -ip="${1}" -port="${2}" + +mode="${1}" +ip="${2}" +port="${3}" +nick="${4}" print_usage() { echo "${1}" - echo "${0} " + echo "${0} [NICK]" + echo "Modes: interactive (intr), send, receive (rec)" exit } [ -z "${ip}" ] && print_usage 'No IP given.' [ -z "${port}" ] && print_usage 'No port given.' -[ -z "${3}" ] || print_usage 'Too many arguments.' +[ -z "${5}" ] || print_usage 'Too many arguments.' + +[ -z "${nick}" ] || nick="<${nick}> " + +open_socket() { + exec 3<> "/dev/tcp/${ip}/${port}" +} + +close_socket() { + exec 3>&- +} send_message() { - exec 3<> "/dev/tcp/${ip}/${port}" + open_socket echo "${1}" >&3 - exec 3>&- + close_socket } get_message() { - exec 3<> "/dev/tcp/${ip}/${port}" + open_socket echo "${1}" >&3 - timeout 1s cat <&3 || true - exec 3>&- + cat <&3 || true + close_socket } +case "${mode}" in + intr) + ;& + interactive) + ;; + send) + open_socket + text="${nick}$(cat)" + send_message "0${text}" + close_socket + exit + ;; + rec) + ;& + receive) + length="$(get_message 1)" + open_socket + echo -n 2 >&3 + head -c "${length}" <&3 + close_socket + exit + ;; + *) + echo Unknown mode + exit +esac + while :; do read cmd case "${cmd}" in - i) + I) b="" while :; do read c @@ -39,15 +80,22 @@ while :; do b="${b}"$'\n'"${c}" fi done - send_message 0"${b}" + send_message 0"${nick}${b}" ;; - I) + i) read a - send_message 0"${a}" + send_message 0"${nick}${a}" ;; p) - send_message 1 - get_message 2 | sed -e 's/\x1B/ESC/g' + length="$(get_message 1)" + if [ -z "${length}" ]; then + echo !; + else + open_socket + echo -n 2 >&3 + head -c "${length}" <&3 | sed -e 's/\x1B/ESC/g' + close_socket + fi ;; q) exit