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