plan9fox/rc/bin/ircrc
2012-10-12 19:13:34 +02:00

240 lines
4.1 KiB
Bash
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/rc
rfork ne
server=irc.freenode.net
port=6667
realname='<nil>'
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
if(! ~ $target ''){
title
echo JOIN $target > $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
}