#!/bin/rc rfork ne server=irc.freenode.net port=6667 realname='' target='' clonefile=/net/tcp/clone netdir=() nick=$user pass=() fn sighup { exit 'hang up' } fn sigint sigterm { if (! ~ $#netdir 0) echo QUIT : Leaving... > $netdir/data } fn mshift { shift echo $* } fn etime { date | awk '{print $4}' | awk -F ':' '{print "[" $1 ":" $2 "]"}' } fn work { echo USER $user foo bar :$realname > $netdir/data echo NICK $nick > $netdir/data if (~ $#pass 1) echo PRIVMSG 'nickserv :'identify $"pass > $netdir/data while (cmd=`{read}) { 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}) } 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 * msg = 'PRIVMSG '^$target^' :'^$"cmd out = '('^$target^') ⇐ '^$"cmd } if (! ~ $#msg 0) echo $msg > $netdir/data if (! ~ $#out 0) echo `{etime}^' '^$out } } fn misc { sed ' s/^:// s/!~?[a-zA-Z0-9_@\-|.{=\/:]+ /:/' | awk -F ':' ' { s = $2 " «" $1 "»\t" $3; for(i = 4; i < NF+1; i++) s = s ":" $i; printf("%s\n", s); }' } fn notice { sed ' s/^NOTICE /:'^$server^':/ s/^:// s/!~?[a-zA-Z0-9_@\-|.{=\/]+ /:/' | awk -F ':' ' { s = "-" $1 "- ⇒\t" $3; for(i = 4; i < NF+1; i++) s = s ":" $i; printf("%s\n", s); }' } fn numeric { sed 's/^:[a-zA-Z0-9_@\-|.!=#]+ // s/ '^$nick^' // s/^353= /*** Users on / s/^[0-9][0-9][0-9] ?:?/*** /' } fn privmsg { sed ' s/^:/«/ s/!~?[a-zA-Z0-9_@\-|.{=\/:]+ PRIVMSG /» ⇒ :/ s/#[a-zA-Z0-9_@\-|.#]+/(&)/' | awk -F ':' ' { s = $2 $1 $3; for(i = 4; i < NF+1; i++) s = s ":" $i; printf("%s\n", s); }' } fn pretty { while (~ `{cat $netdir/status} Established*) { line=`{read} switch ($line) { case *JOIN* *QUIT* *PART* *NICK* line = `{echo -n $line | misc} case *NOTICE* line = `{echo -n $line | notice} case *PRIVMSG* line = `{echo -n $line | privmsg} case *PING* echo -n $line | sed 's/PING/PONG/' > $netdir/data line = () case * line = `{echo -n $line | numeric} } if (! ~ $#line 0) echo `{etime} $line } exit } fn getip { echo $1 ip | ndb/dnsquery | sed 1q | awk '{print $NF}' } fn title { if (! ~ $#winid 0) { if (test -f /mnt/acme/$winid/ctl) echo name /$server/$target/-ircrc > /mnt/acme/$winid/ctl } if not label ircrc $server - $target } while (~ $1 -*) { switch ($1) { case -n nick=$2 shift case -p port=$2 shift case -r realname=$2 shift case -t target=$2 shift case -* echo 'usage: ircrc [-p port] [-r realname] [-t target] [-n nick] [server]' >[1=2] exit 'usage' } shift } if (~ $#* 1) { switch ($1) { case bitlbee server=im.bitlbee.org case oftc server=irc.oftc.net case * server=$1 } } ip=`{getip $server} if (~ $#ip 0) { echo cant translate $server exit 'unknown host' } title userpass=`{auth/userpasswd 'server='^$server^' service=irc user='^$nick >[2]/dev/null} if(~ $#userpass 2 && ~ $nick $user) { nick=$userpass(1) pass=$userpass(2) } <[4] $clonefile { netdir=`{basename -d $clonefile} ^ / ^ `{cat /fd/4} echo connect $ip!$port >$netdir/ctl || exit 'cannot connect' echo connected to tcp!$ip!$port on $netdir cat $netdir/data | tr -d ' ' | pretty & work }