#!/bin/rc wins=() cons=() server=irc.freenode.net port=6667 tls=0 srvpass=() #chans=('irc.freenode.net!#cat-v') chans=() realname='' nick=$user while (~ $1 -*) { switch ($1) { case -c chans=`{echo $2 | sed 's/,/ /'} shift case -n nick=$2 shift case -p port=$2 shift case -P srvpass=$2 shift case -r realname=$2 shift case -T tls=1 case -* echo 'usage: wircrc [-c chans] [-n nick] [-p port] [-P srvpass] [-r realname] [-T]' >[1=2] exit 'usage' } shift } pass=`{auth/userpasswd 'server='^$server^' service=irc user='^$nick >[2]/dev/null} if(~ $#pass 2){ pass=$pass(2) } if not{ pass=() } bind '#|' /n/wircrc rfork en fn wmk { id=$1 >/n/wircrc/data1 { @{ rfork s d=/n/wircrc.$id p=`{cat /dev/ppid} mount $wsys $d 'new -scroll -pid '^$p || exit echo -n $id | tr -d \x0a >$d/label echo wnew $id $d $p <$d/cons { while(line=`{read}){ ~ $line '' || echo wtype $id $line } } } echo wclose $id } exit } fn etime { date -t | sed 's/-//g;s/^..(.*)T(..):(..).*/\1:\2\3/' } fn wio { if(~ $1 $wins){ d=wd$1 d=$$d @{echo `{etime} $*(2-) | tee -a /tmp/irc.^$1 >$d/cons} } } fn sio { d=$1 if(~ $d *!*) d=`{echo $d | awk -F'!' '{print $1}'} if(~ $d $cons){ d=cd$d d=$$d @{echo $*(2-) >$d/data} @{echo $*(2-) | sed -n 's/^PRIVMSG [^ ]+ :/'^`{etime}^' '^$nick^' ⇒ /p' >>/tmp/irc^.$1} } } fn wctl { if(~ $1 $wins){ d=wd$1 d=$$d shift @{echo $* >$d/wctl} } } fn hangup { if(~ $1 $cons){ d=cpid$1 d=$$d @{echo kill >/proc/$d/notepg} } } fn dial { conn=/n/wircrc.$1 bind '#|' $conn if(~ $2 1){ tlsclient $1 <>$conn/data1 >[1=0] & } if not{ aux/trampoline $1 <>$conn/data1 >[1=0] & } echo cdial $4 $apid >/n/wircrc/data1 <>/$conn/data >[1=0]{ $*(3-) exit } } fn irc { >[3]/n/wircrc/data1 { echo cnew $1 $conn $2 >[1=3] tr -d '\x2\x8\xd\x1f' | @{ while(line=`{read}){ if(~ $line(1) PING) echo PONG $line(2-) if not { line=`{echo $line | sed ' s/^:([^!]+)[^ ]+ PRIVMSG (#[^ ]+)[^:]+:(.*)/cmsg '$1'!\2 \1 \3/g; s/^:([^!]+)[^ ]+ PRIVMSG :?([^ ]+)[^:]+:(.*)/cmsg '$1'!\1 \1 \3/g; s/^:([^!]+)[^ ]+ NOTICE \*[^:]+:(.*)/cmsg '$1' \1 \2/g; s/^:([^!]+)[^ ]+ NOTICE ([^ ]+)[^:]+:(.*)/cmsg '$1'!\1 \1 \3/g; s/^:([^!]+)[^ ]+ ([0-9]+)[^:]+:?(.*)/xmsg '$1' \2 \3/g; s/^:([^!]+)[^ ]+ (MODE|TOPIC) (#[^ ]+) :?(.*)/xmsg '$1'!\3 \2 \4/g; s/^:([^!]+)[^ ]+ (QUIT|NICK) :(.*)/xmsg '$1' \2 \1 \3/g; s/^:([^!]+)[^ ]+ (JOIN|PART) (#[^\ ]+).*/xmsg '$1'!\3 \2 \1/g; s/^:(.*) (PONG) [^ ]+[^:]+:(.*)/cmsg '$1'!\1 \1 \2/g; '} ~ $line '' || echo $line >[1=3] } } } echo cclose $1 >[1=3] } } fn shutdown { for(i in $cons) hangup $i for(i in $wins){ d=wp$i d=$$d @{echo hangup >/proc/$d/notepg} & } {}>/n/wircrc/data } fn sighup { shutdown } fn sigint { shutdown } wmk $server & dial tcp!$server!$port $tls irc $server $srvpass &