#!/bin/rc
rfork
. acme.rc
mainpid=$pid
nl='
'
imfs=/n/irc/freenode
ipipe=/n/ircpipe
bind '#|' $ipipe
fn ircwin {
datafd=''
winid=$1
shift
echo -n scroll > /mnt/acme/$winid/ctl
echo -n NoScroll Join > /mnt/acme/$winid/tag
if(~ $1 main){
winname irc
{cat $imfs/event | winwrite data}&
}
if(~ $1 sub){
datafd=$3/data
winname $2
dpipe=/n/dpipe
spipe=/n/spipe
bind '#|' $dpipe
bind '#|' $spipe
{
awk '{print "IRC", $0; fflush}' < $datafd >$dpipe/data &
# (FIX: this proc does not get killed ^)
awk '
/^IRC/{
if(lock != 1) {
printf("length: %s in '^$winid^'\n", length($0)) > "/fd/2";
sub("^IRC", "");
print $0;
fflush;
} else {
printf("locked\n") > "/fd/2";
}
}
/^hold/{
lock = 1;
printf("ok\n") > "'^$spipe/data^'";
close("'^$spipe/data^'");
}
/^unhold/{
lock = 0;
fflush;
}
' < $dpipe/data1 > /mnt/acme/$winid/data <[5]/mnt/acme/$winid/addr
}&
}
catpid=$apid
wineventloop
echo DEBUG killing: $apid
echo kill > /proc/$catpid/notepg
}
fn event {
switch($1$2){
case KI # keyboard: char insterted in body
if(! ~ $datafd '' && ~ $9 $nl){
pos=`{cat /mnt/acme/$winid/addr}
p1=$pos(1)
if(test $3 -gt $p1){
{echo hold > $dpipe/data; read}<$spipe/data1
echo -n 'dot=addr' >/mnt/acme/$winid/ctl
echo -n '.,' > /mnt/acme/$winid/addr
pos=`{cat /mnt/acme/$winid/addr}
p1=$pos(1)
line = `{cat /mnt/acme/$winid/data}
echo -n '#'$p1,'#'$pos(2) > /mnt/acme/$winid/addr
echo -n '' > /mnt/acme/$winid/data
echo unhold > $dpipe/data
echo -n $line > $datafd
}
if not echo -n '$' > /mnt/acme/$winid/addr
}
case Mx # button 2 in tag
args=`{echo $9} # turn string into list
if(~ $args(1) Join)
echo join ''^$args(2-)^'' > $imfs/ctl
# (TODO: auto-open window on new join)
if(~ $9 Reconn && ~ $winid $topwin)
echo -n reconnect > $imfs/0/ctl
if(~ $9 NoScroll) echo -n noscroll > /mnt/acme/$winid/ctl
if(~ $9 Scroll) echo -n scroll > /mnt/acme/$winid/ctl
if(~ $9 Del){
if(~ $winid $topwin)
echo Del > $ipipe/data
if not{
echo -n 'Del '^$winid > $ipipe/data
winwriteevent $*
}
}
if(! ~ $9 Del && ! ~ $9 Reconn && ! ~ $9 NoScroll && ! ~ $9 Scroll && ! ~ $args(1) Join)
winwriteevent $*
case ML # button 3 in body
args=`{echo $9}
echo Open $args > $ipipe/data
# (TODO: handle new user?)
found=`{read $ipipe/data}
if(~ $found none) winwriteevent $*
}
}
#TODO
fn mainproc {
while() {
m=`{read $ipipe/data1}
switch($m(1)) {
case Open
for(j in $m(2-)) # O(n^2) but data is small
for(i in $imfs/[0-9]*){
n=`{cat $i/name}
if(~ $n $j){
match=1
show=`{awk '
$6 == "irc/'$n'"{ print $1 }
' /mnt/acme/index}
if(! ~ $show ''){
echo show > /mnt/acme/$show/ctl
show=''
}
if not{
newwindow
winds=($winid $winds)
ircwin $winid sub irc/$n $i &
}
}
}
if(~ $match '0') echo none > $ipipe/data1
if(~ $match '1') echo -n '' > $ipipe/data1
match=0
case Del
if(~ $m(2) ''){
for(i in $winds)
echo delete > /mnt/acme/$i/ctl
echo DEBUG exiting...
exit
}
if not winds=`{echo $winds | sed 's/( |^)'^$m(2)^'( |$)/ /g'}
} #dostuff
}
}
# startup: create main
# window
newwindow
winds=($winid)
topwin=$winid
ircwin $winid main &
# begin the main proc
mainproc
exit
|