dobroho_vechora/dobroho_vechora.bash
2025-01-12 04:48:58 +05:00

124 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
set -e
mode="${1}"
ip="${2}"
port="${3}"
nick="${4}"
print_usage() {
echo "${1}"
echo "${0} <MODE> <IP> <PORT> [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