#!/bin/rc rfork en wins=() cons=() chans=() server=irc.oftc.net realname='' nick=$user while(~ $1 -*){ switch($1){ case -s server=$2 shift case -n nick=$2 shift case -u user=$2 shift case -r realname=$2 shift case -p pass=$2 shift } shift } bind '#|' /n/wircrc 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 >$d/label echo wnew $id $d $p <$d/cons { while(line=`{read}){ ~ $line '' || echo wtype $id $line } } } echo wclose $id } exit } fn wio { if(~ $1 $wins){ d=wd$1 d=$$d shift @{echo $* >$d/cons} } } fn sio { d=$1 if(~ $d *!*) d=`{echo $d | awk -F'!' '{print $1}'} if(~ $d $cons){ d=cd$d d=$$d shift @{echo $* >$d/data} } } fn wctl { if(~ $1 $wins){ d=wd$1 d=$$d shift @{echo $* >$d/wctl} } } fn hangup { if(~ $1 $cons){ d=cd$1 d=$$d @{echo hangup >$d/ctl} & } } fn netdial { <$1 { conn=`{basename -d $1}^/^`{read} echo -n connect $2 >$conn/ctl >[2]/dev/null || exit 'connect failed' <$conn/data >$conn/data { shift shift $* exit } } } fn csdial { echo $2 | ndb/csquery $1/cs | sed 's/> //g;/^$/d' | while(l=`{read} && ~ $#l 2 && ! @{netdial $l $*(3-)}){ status=failed } } fn dial { csdial /net $* || csdial /net.alt $* } fn irc { >[3]/n/wircrc/data1 { echo cnew $1 $conn >[1=3] tr -d ' ' | @{ while(line=`{read}){ #echo xxx $line >/dev/cons 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/^:([^!]+)[^\ ]+\ ([0123456789]+)[^:]+:?(.*)$/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; '} ~ $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} & } exec cat /n/wircrc/data >/dev/null } fn sighup { shutdown } fn sigint { shutdown } wmk $server & dial tcp!$server!6667 irc $server &