diff --git a/rowbot b/rowbot index ac25dc1..54a4fa6 100755 --- a/rowbot +++ b/rowbot @@ -134,7 +134,7 @@ cleanup() { trap cleanup EXIT ### -# net code +# net/reload code ### if [[ $reload = yes ]]; then @@ -150,6 +150,12 @@ if [[ $reload = yes ]]; then if [[ -v PING_PID ]]; then ping_pid=$PING_PID fi + + nick=$NICK ident=$IDENT + + if [[ -v HOST ]]; then + host=$HOST + fi elif [[ $tls = yes ]]; then sock_dir=$(mktemp -d) mkfifo "$sock_dir"/rb{in,out} @@ -256,6 +262,8 @@ on_001() { done & ping_pid=$! + nick=${params[0]} + who "$nick" %%uht,42 } on_002() { @@ -314,6 +322,10 @@ on_266() { info %s "${params[3]}" } +on_315() { + debug "end of WHO for %s" "${params[1]}" +} + on_332() { info "topic for %s is %s" "${params[1]}" "${params[2]}" } @@ -328,6 +340,14 @@ on_353() { info "members of %s: %s" "${params[2]}" "${params[3]}" } +on_354() { + if (( ${params[1]} == 42 )); then + debug "received the identifying who" + ident=${params[2]} host=${params[3]} + debug "ident=%s host=%s" "$ident" "$host" + fi +} + on_366() { debug "%s: end of NAMES list" "${params[1]}" } @@ -361,6 +381,18 @@ nick() { } notice() { + if [[ -v host ]]; then + local msg_len msg=$2 + (( msg_len = 494 - (${#nick} + ${#ident} + ${#host} + ${#1}) )) + debug "max message length is %d" "$msg_len" + + while (( ${#msg} > msg_len )); do + send "NOTICE %s :"$'\xe2\x80\x8b'"%s" "$1" "${msg:0:$msg_len}" + info "[%s/%s] %s" "$nick" "$1" "${msg:0:$msg_len}" + msg=${msg:$msg_len} + done + fi + send "NOTICE %s :%s" "$1" "$2" info "[%s/%s] %s" "$nick" "$1" "$2" } @@ -384,8 +416,20 @@ pong() { } privmsg() { - send "PRIVMSG %s :\u200b%s" "$1" "$2" - info "<%s/%s> %s" "$nick" "$1" "$2" + if [[ -v host ]]; then + local msg_len msg=$2 + (( msg_len = 493 - (${#nick} + ${#ident} + ${#host} + ${#1}) )) + debug "max message length is %d" "$msg_len" + + while (( ${#msg} > msg_len )); do + send "PRIVMSG %s :"$'\xe2\x80\x8b'"%s" "$1" "${msg:0:$msg_len}" + info "<%s/%s> %s" "$nick" "$1" "${msg:0:$msg_len}" + msg=${msg:$msg_len} + done + fi + + send "PRIVMSG %s :"$'\xe2\x80\x8b'"%s" "$1" "$msg" + info "<%s/%s> %s" "$nick" "$1" "$msg" } quit() { @@ -400,6 +444,14 @@ user() { send "USER %s 0 * :%s" "$ident" "$realname" } +who() { + if (( $# > 1 )); then + send "WHO %s %s" "$1" "$2" + else + send "WHO %s" "$1" + fi +} + ### # app hooks ## @@ -512,7 +564,7 @@ hook_post_PRIVMSG_control_panel() { case ${words[0]:${#trigger}} in raw) local cmd - cmd=${params[1]#*"$trigger"raw} cmd=${cmd# } + cmd=${params[1]#"$trigger"raw} cmd=${cmd# } info "%s is executing command: %s" "$from" "$cmd" send "$cmd" ;; @@ -523,6 +575,11 @@ hook_post_PRIVMSG_control_panel() { reload) export IN_SOCK=$in_sock OUT_SOCK=$out_sock LOG_FD=$log DEV=$dev export RELOAD_TO=$to TRIGGER=$trigger LOG_LEVEL=$level + export NICK=$nick IDENT=$ident + + if [[ -v host ]]; then + export HOST=$host + fi if [[ $tls = yes ]]; then export SOCK_DIR=$sock_dir