plan9fox/rc/bin/ircrc

253 lines
4.4 KiB
Bash
Executable file

#!/bin/rc
rfork ne
server=irc.freenode.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