diff -r 0ee17db5d86b rc/bin/ircrc --- a/rc/bin/ircrc Sat May 02 17:32:01 2020 +0200 +++ b/rc/bin/ircrc Tue May 05 00:36:54 2020 -0700 @@ -49,71 +49,86 @@ echo QUIT : Leaving... > $netdir/data exit } - msg=() - out=() - switch ($cmd(1)) { - case /! - eval `{mshift $cmd} | while(rc=`{read})echo 'PRIVMSG '^$target^' :' $rc | tee $netdir/data - case /M - msg = (MODE `{mshift $cmd}) - case /N + do_cmd + } +} + +fn do_cmd { + msg=() + out=() + switch ($cmd(1)) { + case /! + eval `{mshift $cmd} | while(rc=`{read})echo 'PRIVMSG '^$target^' :' $rc | tee $netdir/data + case /M + msg = (MODE `{mshift $cmd}) + case /N + cmd = `{mshift $cmd} + if (! ~ $#cmd 0) + msg = (NOTICE $cmd(1) : `{mshift $cmd}) + case /T + msg = (TOPIC `{mshift $cmd}) + case /W + msg = (WHOIS `{mshift $cmd}) + case /a + msg = (AWAY : `{mshift $cmd}) + case /j + if (~ $#cmd 2) { + target=$cmd(2) + title + msg = (JOIN `{mshift $cmd}) + if(~ $target *,*) + target = `{echo $target | awk -F',' '{print $NF}'} + } + case /l + msg = (LIST `{mshift $cmd}) + case /m + cmd = `{mshift $cmd} + if (! ~ $#cmd 0) { + target_orig=$target + target = $cmd(1) cmd = `{mshift $cmd} - if (! ~ $#cmd 0) - msg = (NOTICE $cmd(1) : `{mshift $cmd}) - case /T - msg = (TOPIC `{mshift $cmd}) - case /W - msg = (WHOIS `{mshift $cmd}) - case /a - msg = (AWAY : `{mshift $cmd}) - case /j - if (~ $#cmd 2) { - target=$cmd(2) - title - msg = (JOIN `{mshift $cmd}) - if(~ $target *,*) - target = `{echo $target | awk -F',' '{print $NF}'} - } - case /l - msg = (LIST `{mshift $cmd}) - case /m - cmd = `{mshift $cmd} - if (! ~ $#cmd 0) { - to = $cmd(1) - cmd = `{mshift $cmd} - out = '('^$to^') ⇐ '^$"cmd - msg = 'PRIVMSG '^$to^' :'^$"cmd - } - case /n - nick = `{mshift $cmd} - msg = (NICK $nick) - case /p - cmd = `{mshift $cmd} - if (! ~ $#cmd 0) - msg = (PART $cmd(1) : `{mshift $cmd}) - case /q - msg = `{mshift $cmd} - case /t - target = `{mshift $cmd} - title - case /u - msg = (USERS `{mshift $cmd}) - case /w - msg = (WHO `{mshift $cmd}) - case /x - echo QUIT : Leaving... > $netdir/data - exit - case /* - echo unknown command - case * - msg = 'PRIVMSG '^$target^' :'^$"cmd - out = '('^$target^') ⇐ '^$"cmd + send_msg + target=$target_orig } - if (! ~ $#msg 0) - echo $msg > $netdir/data - if (! ~ $#out 0) - echo `{etime}^' '^$out + case /n + nick = `{mshift $cmd} + msg = (NICK $nick) + case /p + cmd = `{mshift $cmd} + if (! ~ $#cmd 0) + msg = (PART $cmd(1) : `{mshift $cmd}) + case /q + msg = `{mshift $cmd} + case /t + target = `{mshift $cmd} + title + case /u + msg = (USERS `{mshift $cmd}) + case /w + msg = (WHO `{mshift $cmd}) + case /x + echo QUIT : Leaving... > $netdir/data + exit + case /* + echo unknown command + case * + send_msg } + if (! ~ $#msg 0) + echo $msg > $netdir/data + if (! ~ $#out 0) + echo `{etime}^' '^$out +} + +fn send_msg { + prefixmsg='PRIVMSG '^$target^' :' + prefixout='('^$target^') ⇐ ' + linelen=`{hoc -e 447^'-'^`{echo -n $prefixmsg | wc -c} } + ifs_orig=$ifs + ifs='' + msg=`{echo -n $cmd | fmt -l $linelen | awk '{ printf "%s%s\n", ENVIRON["prefixmsg"], $0 }' } + out=`{echo $msg | sed s/$prefixmsg/$prefixout/ } + ifs=$ifs_orig } fn misc { diff -r 0ee17db5d86b sys/man/1/ircrc --- a/sys/man/1/ircrc Sat May 02 17:32:01 2020 +0200 +++ b/sys/man/1/ircrc Tue May 05 00:36:54 2020 -0700 @@ -152,6 +152,10 @@ command. Control-D also sends this command. .PP +Any message containing more than the protocol's maximum allowed characters (447) is chunked into multiple messages using +.I fmt(1) +. +.PP See RFC 1459 and RFC 2812 for detailed information about IRC commands. .SH EXAMPLES