#!/bin/bash set -e mode="${1}" ip="${2}" port="${3}" nick="${4}" print_usage() { echo "${1}" 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 "${5}" ] || print_usage 'Too many arguments.' [ -z "${nick}" ] || nick="<${nick}> " open_socket() { exec 3<> "/dev/tcp/${ip}/${port}" } close_socket() { exec 3>&- } send_message() { open_socket echo "${1}" >&3 close_socket } get_message() { open_socket echo "${1}" >&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 print_messages() { open_socket echo -n 2 >&3 head -c "${1}" <&3 | sed -e 's/\x1B/ESC/g' close_socket } wait_for_messages() { oldlength="${length}" while :; do length="$(get_message 1)" if [ "${oldlength}" -ne "${length}" ]; then break fi echo -n . sleep 1 done echo } length=0 while :; do read cmd case "${cmd}" in I) tmp="$(mktemp)" command ${VISUAL:-${EDITOR:-$(command -v vi)}} "${tmp}" [ -s "${tmp}" ] && send_message 0"${nick}$(cat "${tmp}")" rm "${tmp}" ;; i) read a send_message 0"${nick}${a}" ;; L) length="$(get_message 1)" ;; l) echo "${length}" ;; w) wait_for_messages print_messages "${length}" if [ -n "${DOBROHO_VECHORA_ON_WAIT}" ]; then ${DOBROHO_VECHORA_ON_WAIT} fi ;; p) length="$(get_message 1)" print_messages "${length}" ;; q) exit ;; *) echo ? ;; esac done