#!/usr/bin/env bash ### # argument parser for parsing arguments ## declare -A opts while (( $# )); do case $1 in --*=*) key=${1#--} key=${key%%=*} opts[$key]=${1#--*=} ;; --no-*) key=${1#--no-} opts[$key]=no ;; --) shift break ;; --*) key=${1#--} opts[$key]=yes ;; *) break esac shift done ### # default config ## server=${opts[server]:-irc.libera.chat} tls=${opts[tls]:-no} if [[ $tls = yes ]]; then if ! hash socat 2>/dev/null; then printf 'please install socat to use tls with rowbot.\n' >&2 exit 1 fi port=${opts[port]:-6697} else port=${opts[port]:-6667} fi ### # net code ### if [[ $tls = yes ]]; then coproc sock { socat OPENSSL:"$server":"$port" -; } in_sock=${sock[0]} out_sock=${sock[1]} else exec {sock}<>/dev/tcp/"$server"/"$port" in_sock=$sock out_sock=$sock fi send() { local fmt printf -v fmt "$1" "${@:2}" printf '%s\r\n' "$fmt" >&"$out_sock" } recv() { declare -n sock_line=$1 IFS= read -r "$1" <&"$in_sock" sock_line=${sock_line%$'\r'} } ### # driver ### while recv line; do declare -p line done