ref: f3afdf563f784c0a5703496f48c1a72dff4617f4
dir: /ircx/
#!/bin/rc
# ircx: ircs ui
rfork e
flagfmt='e,p,r,T,U,s srvname,f file,t target,b lines'
args='[nick[!user] addr]'
srv=ircs
mainlog=()
log=()
opt=()
lines=()
target=()
offset=()
help='<del>, /q quit ircx (leaves ircs running)
/h print this help
/j #channel join #channel and set it as target
/n nick change nick
/N list nicks on channel target
/p [message] part from channel target
/Q [message] quit (stops ircs)
/r message send raw message to server
/t target set target (channel or nick)
/T [topic] get [set] topic of channel target
/w mask send who query
/W mask send whois query
/x create new ircx window
[/ ]message send message to target
/me message send an action emote'
fn usage{
aux/usage
exit usage
}
fn fatal{
echo $* >[1=2]
exit $"*
}
fn isnum{
echo $1 | grep -s '^[0-9]+$'
}
fn clear{
awk 'BEGIN {
for(i = 0; i < '$1'; i++)
printf "\x08"
}'
}
fn runtail{
{ tail -$2
while(sleep 1) cat
} <$1 &
tailpid=$apid
}
fn oldlabel{
if(! ~ $#oldlabel 0)
label $oldlabel
}
fn killtail{
@{
echo kill >/proc/$tailpid/note
} &
}
fn saveoffset{
if(~ $#offset 1 && test -r $log)
wc -l <$log | tr -d ' ' >$offset
}
fn shutdown{
saveoffset
killtail
oldlabel
exit 0
}
fn sighup sigint sigterm{
shutdown
}
fn send{
if(test -e /srv/$srv)
echo $* >>/srv/$srv
if not{
echo /srv/$srv not found '(ircs stopped?)'
shutdown
}
}
fn settarget{
if(~ $1 ''){
target=()
label $mainlog
}
if not{
target=$1
label $target
}
}
fn newtarget{
if(~ $#flagf 1)
settarget $newtarget
if not{
if(~ $newtarget '#'*){
f=/tmp/$srv/$newtarget
sleep 1
}
if not{
settarget $newtarget
f=$mainlog
}
if(! ~ $f $log){
if(test -r $f){
settarget $newtarget
saveoffset
offset=()
killtail
log=$f
echo $log
runtail $log 10
}
if not
echo can''''t access $f
}
}
newtarget=()
}
fn lines{
if(~ $#offset 1 && test -r $offset && test -r $log){
n₀=`{cat $offset}
n₁=`{wc -l <$log}
δn=`{echo $n₁ - $n₀ + 10 | bc}
echo $δn
}
if not
echo 10
}
if(! ifs=() eval `{aux/getflags $*} || ! ~ $#* 0 2)
usage
if(~ $#flagb 1){
if(! isnum $flagb)
usage
lines=$flagb
}
if(~ $#flagt 1)
target=$flagt
if(~ $#flags 1){
if(~ $flags '')
fatal empty srvname
srv=$flags
opt=($opt -s $srv)
}
if(~ $#flagf 1){
mainlog=$flagf
opt=($opt -f $mainlog)
}
if not{
mainlog=/tmp/$srv/log
if(~ $#lines 0){
offset=/tmp/$srv/offsets/log
mkdir -p /tmp/$srv/offsets
}
}
if(~ $#flage 1) opt=($opt -e)
if(~ $#flagp 1) opt=($opt -p)
if(~ $#flagr 1) opt=($opt -r)
if(~ $#flagT 1) opt=($opt -T)
if(~ $#flagU 1) opt=($opt -U)
switch($#*){
case 0
for(i in /srv/$srv $mainlog)
if(! test -e $i)
fatal $i not found
case 2
if(test -e /srv/$srv)
fatal ircs already running
nick=$1
addr=$2
ircs $opt $nick $addr
stat=$status
if(! ~ $stat '')
exit $stat
case *
usage
}
oldlabel=`{cat /dev/label}
oifs=$ifs
log=$mainlog
if(~ $#target 1){
label $target
if(~ $target '#'*){
send JOIN $target
if(~ $#flagf 0){
log=/tmp/$srv/$target
if(~ $#lines 0)
offset=/tmp/$srv/offsets/$target
if(! test -e $log)
sleep 1
}
}
}
if not
label $log
if(~ $#lines 0)
lines=`{lines}
echo $log -$lines
runtail $log $lines
while(ifs=() line=`{read | tr -d \xa}){
ifs=$oifs
clear `{echo $line | wc -r}
if(! ~ $line ''){
msg=()
*=`{echo $line}
cmd=$1
shift
switch($cmd){
case /h
echo $help
case /j
if(~ $#* 0)
echo no channel
if not{
msg='JOIN '^$"*
newtarget=$1
}
case /t
if(~ $#* 0)
echo no target
if not
newtarget=$1
case /N
if(! ~ $target '#'*)
echo no channel
if not
msg='NAMES '^$target
case /T
if(! ~ $target '#'*)
echo no channel
if not{
msg='TOPIC '^$target
if(! ~ $#* 0)
msg=$msg^' :'^$"*
}
case /p
if(! ~ $target '#'*)
echo no channel
if not{
msg='PART '^$target
if(! ~ $#* 0)
msg=$msg^' :'^$"*
newtarget=''
}
case /q
shutdown
case /Q
if(~ $#* 0)
send QUIT
if not
send 'QUIT :'^$"*
sleep 1
shutdown
case /r
if(~ $#* 0)
echo no message
if not{
ifs=()
msg=`{echo -n $line | sed 's!^[ ]*/r[ ]+!!'}
ifs=$oifs
}
case /n
if(~ $#* 0)
echo no nick
if not
msg='NICK '^$1
case /w
if(~ $#* 0)
echo no mask
if not
msg='WHO '^$"*
case /W
if(~ $#* 0)
echo no mask
if not
msg='WHOIS '^$"*
case /x
window -m ircx $opt
case /
if(~ $#target 0)
echo no target
if not{
ifs=()
line=`{echo -n $line | sed 's!^[ ]*/[ ]*!!'}
ifs=$oifs
msg='PRIVMSG '^$target^' :'^$line
}
case /me
if(~ $#target 0)
echo no target
if not
msg='PRIVMSG '^$target^' :ACTION '^$"*^''
case /*
echo unknown command
case *
if(~ $#target 0)
echo no target
if not
msg='PRIVMSG '^$target^' :'^$line
}
if(! ~ $#msg 0)
send $msg
if(~ $#newtarget 1)
newtarget
}
}
shutdown