#!/bin/rc # bloated, featureful usenet reader for use with nntpfs rfork en ramfs argv0=$0 if(~ $#editor 0) editor=hold group=alt/test maxposts=30 mnt=/mnt/news if(~ $#newtname 0) newtname=newt@dont-email.me fn enterpost{ { echo From: $"newtname echo Newsgroups: `{echo $group | sed 's/\//\./g'} echo Subject: $"subject echo } >/tmp/post eval $editor /tmp/post cat /tmp/post >$mnt/$group/post } fn f { du -a $* | sed 's/^.* //g' } fn fmtd{ date=`{cat} if(! ~ $date(1) [0-9]*) date=`{nshift $date} da=$date(1) if(~ $da [0-9]) da=0^$da switch($date(2)){ case Jan; mo=1 case Feb; mo=2 case Mar; mo=3 case Apr; mo=4 case May; mo=5 case Jun; mo=6 case Jul; mo=7 case Aug; mo=8 case Sep; mo=9 case Oct; mo=10 case Nov; mo=11 case Dec; mo=12 } if(! ~ $date(3) `{date | awk '{print $6;}'}) ti=$date(3) if not ti=`{echo $date(4) | awk '{print substr($0,0,5);}'} echo $mo/$da $ti } fn geth{ for(i in $*){ from=`{awk -F ' ' '{print $3;}' $i/xover} if(! ~ $#from 0 && ! ~ $#from 1){ nfrom=`{ for(i in $from){ if(~ $i *@*) echo $i | sed 's/(<|>)//g' } } if(! ~ $#nfrom 0) from=$nfrom } if(! ~ $#from 0){ date=`{awk -F ' ' '{print $4;}' $i/xover >[2]/dev/null | fmtd} awk -v date'='$"date -v from'='$from(1) -F ' ' \ '{print " " $1 " " date " " from " " substr($2,0,50);}' $i/xover >[2]/dev/null } if not echo ' '$"i' nil nil nil' } } fn getposts{ ls | grep -e '^[0-9]+$' | sort -n | tail -$maxposts } fn k{ kmnt=`{echo $mnt | sed 's/\//\\\//g'} f $mnt/$* | grep -v -e '\/([0-9]+|article|body|header|post|xover)$' | sed 's/^'$"kmnt'\// g /g' | sort } fn nshift{ shift; echo $* } fn printhelp{ echo '[0-9]+ print specified message b back e enter message f jump to first message g ... go to specified group h print message headlines help print this help message k ... list sub-groups under specified group kf ... grep $home/lib/newsgroups for regexp l jump to last message n next p print message with minimal headers P print message with full headers q quit r reply to message y synchronize message list with server " print message in quoted form, suitable for reply |cmd pipe message body to a command ||cmd pipe raw message to a command ? print debug information' } fn printp{ if(test -d $mnt/$group/$1){ { # don't stutter grep -e '(^From|^Newsgroups|^Subject|^Date)' $1/header echo cat $1/body } >/tmp/p cat /tmp/p } echo prompt=$group/$1 } fn printpp{ if(test -d $mnt/$group/$1) cat $1/article echo prompt=$group/$1 } fn usage{ echo usage: $argv0 '[ -f newsgroup ] [ -m mountpoint ] [ -p maxposts ]' >[1=2] exit usage } while(~ $1 -*){ switch($1){ case -f group=`{echo $2 | sed 's/\./\//g'} shift case -m mnt=$2 shift case -p maxposts=$2 shift case * usage } shift } if(! ~ $#* 0) usage prompt=$group if(! test -d $mnt/$group){ echo !$mnt/$group does not exist >[1=2] exit } builtin cd $mnt/$group go=() posts=`{getposts} geth $posts >/tmp/h post=$posts(1) echo $#posts messages while(){ echo -n $"prompt': ' cmd=`{read} switch($cmd){ case [0-9]* if(grep -s -e '^[0-9]+$' <{echo $cmd(1)}){ post=$cmd(1) printp $post } case b if(! ~ $post $posts(1)){ post=`{echo $post^-1 | bc} printp $post } case e enterpost case f post=$posts(1) printp $post case g' '* ngroup=`{nshift $cmd | sed 's/\./\//g'} if(test -d $mnt/$ngroup){ if(grep -s -e '^[0-9]+$' <{ls -p $mnt/$ngroup}){ group=$ngroup builtin cd $mnt/$group go=() posts=`{getposts} geth $posts >/tmp/h post=$posts(1) prompt=$group echo $#posts messages } if not echo !$ngroup contains no messages } if not echo !$ngroup does not exist case h cat /tmp/h case help printhelp case k k $group case k' '* k `{nshift $cmd | sed 's/\./\//g'} case kf' '* grep -e `{nshift $cmd} $home/lib/newsgroups | sed 's/^/ g /g' case l post=$posts($#posts) printp $post case p printp $post case p' '* post=`{nshift $cmd} printp $post case P printpp $post case P' '* post=`{nshift $cmd} printpp $post case q exit case r if(test -f $mnt/$group/$post/header){ subject='Re: '^`{grep -e '^Subject: ' $mnt/$group/$post/header | sed 's/^Subject: //g'} enterpost } if not echo !message missing case y posts=`{getposts} geth $posts >/tmp/h echo $#posts messages case '"' printp $post | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g' case '||'* cmd=`{echo $"cmd | sed 's/^\|\|//g'} cat $mnt/$group/$post/article | eval $cmd case '|'* cmd=`{echo $"cmd | sed 's/^\|//g'} cat $mnt/$group/$post/body | eval $cmd case '?' echo mnt: $mnt echo group: $group echo maxposts: $maxposts echo posts: $posts echo post: $post case n * if(~ $post $posts(1) && ~ $#go 0){ go=1 printp $post } if not if(! ~ $post $posts($#posts)){ go=1 post=`{echo $post^+1 | bc} if(test $post -gt $posts($#posts)) post=$posts($#posts) printp $post } } }