code: plan9front

ref: f466d4a75b8027f195c79e67d898c0da23811f47
dir: /rc/bin/ircrc/

View raw version
#!/bin/rc

rfork ne

server=irc.oftc.net
port=6667
realname='<nil>'
target=''
netdir=()
nick=$user
pass=()
tls=0
serverpass=()

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 {
        if(~ $#serverpass 1)
                echo PASS $serverpass > $netdir/data
	echo USER $user foo bar :$realname > $netdir/data
	echo NICK $nick > $netdir/data
	if (~ $#pass 1)
		echo PRIVMSG 'nickserv :'identify $"pass > $netdir/data
	if(! ~ $target ''){
		title
		echo JOIN $target > $netdir/data
	}
	if(~ $target *,*)
		target = `{echo $target | awk -F',' '{print $NF}'}
	while (cmd=`{read}) {
		s=$status
		if(~ $s *eof) {
			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
			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
		}
		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 (line=`{read}) {
		switch ($line) {
		case *PRIVMSG*
			line = `{echo -n $line | privmsg}
		case *JOIN* *QUIT* *PART* *NICK*
			line = `{echo -n $line | misc}
		case *NOTICE*
			line = `{echo -n $line | notice}
		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 title {
	if (! ~ $#winid 0) {
		if (test -f /mnt/acme/$winid/ctl)
			echo name /$server/$target/-ircrc > /mnt/acme/$winid/ctl
	}
	if not
		label $target@$server
}

while (~ $1 -*) {
	switch ($1) {
	case -n
		nick=$2
		shift
	case -p
		port=$2
		shift
        case -P
                serverpass=$2
                shift
	case -r
		realname=$2
		shift
	case -t
		target=$2
		shift
	case -T
		tls=1
	case -*
		echo 'usage: ircrc  [-p port] [-P server password] [-r realname] [-t target] [-n nick] [-T] [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
	}
}

title
userpass=`{auth/userpasswd 'server='^$server^' service=irc user='^$nick >[2]/dev/null}
if(~ $#userpass 2) {
	nick=$userpass(1)
	pass=$userpass(2)
}

p='/n/ircrc'
bind '#|' $p
echo connecting to tcp!$server!$port...
if(~ $tls 0){
	aux/trampoline tcp!$server!$port <>$p/data1 >[1=0] &
}
if not {
	tlsclient tcp!$server!$port <>$p/data1 >[1=0] &
}
netdir=$p
cat $netdir/data | tr -d '\x2\x8\xd\x1f' | pretty &
work