]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/newt
f83e96b6b3dac88ded307f02ca0c2dfb8142f803
[plan9front.git] / rc / bin / newt
1 #!/bin/rc
2 # bloated, featureful usenet reader for use with nntpfs
3 rfork en
4 ramfs
5 argv0=$0
6 if(~ $#editor 0)
7         editor=hold
8 group=alt/test
9 maxposts=30
10 mnt=/mnt/news
11 if(~ $#newtname 0)
12         newtname=newt@dont-email.me
13 fn enterpost{
14         {
15                 echo From: $"newtname
16                 echo Newsgroups: `{echo $group | sed 's/\//\./g'}
17                 echo Subject: $"subject
18                 echo
19         } >/tmp/post
20         eval $editor /tmp/post
21         cat /tmp/post >$mnt/$group/post
22 }
23 fn f { du -a $* | sed 's/^.*    //g' }
24 fn fmtd{
25         date=`{cat}
26         if(! ~ $date(1) [0-9]*)
27                 date=`{nshift $date}
28         da=$date(1)
29         switch($date(2)){
30         case Jan;       mo=1
31         case Feb;       mo=2
32         case Mar;       mo=3
33         case Apr;       mo=4
34         case May;       mo=5
35         case Jun;       mo=6
36         case Jul;       mo=7
37         case Aug;       mo=8
38         case Sep;       mo=9
39         case Oct;       mo=10
40         case Nov;       mo=11
41         case Dec;       mo=12
42         }
43         if(! ~ $date(3) `{date | awk '{print $6;}'})
44                 ti=$date(3)
45         if not
46                 ti=`{echo $date(4) | awk '{print substr($0,0,5);}'}
47         echo $mo/$da $ti
48 }
49 fn geth{
50         for(i in $*){
51                 from=`{awk -F ' ' '{print $3;}' $i/xover}
52                 if(! ~ $#from 0 && ! ~ $#from 1){
53                         nfrom=`{
54                                 for(i in $from){
55                                         if(~ $i *@*)
56                                                 echo $i | sed 's/(<|>)//g'
57                                 }
58                         }
59                         if(! ~ $#nfrom 0)
60                                 from=$nfrom
61                 }
62                 if(! ~ $#from 0){
63                         date=`{awk -F ' ' '{print $4;}' $i/xover >[2]/dev/null | fmtd}
64                         awk -v date'='$"date -v from'='$from(1) -F '    ' \
65                                 '{print " " $1 "        " date " " from "               " substr($2,0,50);}' $i/xover >[2]/dev/null
66                 }
67                 if not
68                         echo ' '$"i'    nil     nil     nil'
69         }
70 }
71 fn getposts{ ls | grep -e '^[0-9]+$' | sort -n | tail -$maxposts }
72 fn k{
73         kmnt=`{echo $mnt | sed 's/\//\\\//g'}
74         f $mnt/$* |
75                 grep -v -e '\/([0-9]+(\/|$)|post$)' |
76                 sed 's/^'$"kmnt'\// g   /g' |
77                 sort
78 }
79 fn nshift{ shift; echo $* }
80 fn printhelp{
81 echo '[0-9]+    print specified message
82 b               back
83 e               enter message
84 f               jump to first message
85 g ...           go to specified group
86 h               print message headlines
87 help            print this help message
88 k ...           list sub-groups under specified group
89 l               jump to last message
90 n               next
91 p               print message with minimal headers
92 P               print message with full headers
93 q               quit
94 r               reply to message
95 y               synchronize message list with server
96 "               print message in quoted form, suitable for reply
97 |cmd            pipe message body to a command
98 ||cmd           pipe raw message to a command
99 ?               print debug information'
100 }
101 fn printp{
102         if(test -d $mnt/$group/$1){
103                 grep -e '(^From|^Newsgroups|^Subject|^Date)' $1/header
104                 echo
105                 cat $1/body
106         }
107         echo
108         prompt=$group/$1
109 }
110 fn printpp{
111         if(test -d $mnt/$group/$1){
112                 cat $1/article
113         }
114         echo
115         prompt=$group/$1
116 }
117 fn usage{
118         echo usage: $argv0 '[ -f newsgroup ] [ -m mountpoint ] [ -p maxposts ]' >[1=2]
119         exit usage
120 }
121 while(~ $1 -*){
122         switch($1){
123         case -f
124                 group=`{echo $2 | sed 's/\./\//g'}
125                 shift
126         case -m
127                 mnt=$2
128                 shift
129         case -p
130                 maxposts=$2
131                 shift
132         case *
133                 usage
134         }
135         shift
136 }
137 if(! ~ $#* 0)
138         usage
139 prompt=$group
140 if(! test -d $mnt/$group){
141         echo !$mnt/$group does not exist >[1=2]
142         exit
143 }
144 builtin cd $mnt/$group
145 go=()
146 posts=`{getposts}
147 geth $posts >/tmp/h
148 post=$posts(1)
149 echo $#posts messages
150 while(){
151         echo -n $"prompt': '
152         cmd=`{read}
153         switch($cmd){
154         case [0-9]*
155                 post=$cmd(1)
156                 printp $post
157         case b
158                 if(! ~ $post $posts(1)){
159                         post=`{echo $post^-1 | bc}
160                         printp $post
161                 }
162         case e
163                 enterpost
164         case f
165                 post=$posts(1)
166                 printp $post
167         case g' '*
168                 ngroup=`{nshift $cmd | sed 's/\./\//g'}
169                 if(test -d $mnt/$ngroup){
170                         if(grep -s -e '^[0-9]+$' <{ls -p $mnt/$ngroup}){
171                                 group=$ngroup
172                                 builtin cd $mnt/$group
173                                 go=()
174                                 posts=`{getposts}
175                                 geth $posts >/tmp/h
176                                 post=$posts(1)
177                                 prompt=$group
178                                 echo $#posts messages
179                         }
180                         if not
181                                 echo !$ngroup contains no messages
182                 }
183                 if not
184                         echo !$ngroup does not exist
185         case h
186                 cat /tmp/h
187         case help
188                 printhelp
189         case k
190                 k $group
191         case k' '*
192                 k `{nshift $cmd | sed 's/\./\//g'}
193         case l
194                 post=$posts($#posts)
195                 printp $post
196         case p
197                 printp $post
198         case p' '*
199                 post=`{nshift $cmd}
200                 printp $post
201         case P
202                 printpp $post
203         case P' '*
204                 post=`{nshift $cmd}
205                 printpp $post
206         case q
207                 exit
208         case r
209                 if(test -f $mnt/$group/$post/header){
210                         subject='Re: '^`{grep -e '^Subject: ' $mnt/$group/$post/header | sed 's/^Subject: //g'}
211                         enterpost
212                 }
213                 if not
214                         echo !message missing
215         case y
216                 posts=`{getposts}
217                 geth $posts >/tmp/h
218                 echo $#posts messages
219         case '"'
220                 printp $post | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g'
221         case '||'*
222                 cmd=`{echo $"cmd | sed 's/^\|\|//g'}
223                 cat $mnt/$group/$post/article | eval $cmd
224         case '|'*
225                 cmd=`{echo $"cmd | sed 's/^\|//g'}
226                 cat $mnt/$group/$post/body | eval $cmd
227         case '?'
228                 echo mnt: $mnt
229                 echo group: $group
230                 echo maxposts: $maxposts
231                 echo posts: $posts
232                 echo post: $post        
233         case n *
234                 if(~ $post $posts(1) && ~ $#go 0){
235                         go=1
236                         printp $post
237                 }
238                 if not if(! ~ $post $posts($#posts)){
239                         go=1
240                         post=`{echo $post^+1 | bc}
241                         if(test $post -gt $posts($#posts))
242                                 post=$posts($#posts)
243                         printp $post
244                 }
245         }       
246 }