]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/newt
7d6e8ab8e6017d640a6b9f1134e09bb3e0e79044
[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 l               jump to last message
92 n               next
93 p               print message with minimal headers
94 P               print message with full headers
95 q               quit
96 r               reply to message
97 y               synchronize message list with server
98 "               print message in quoted form, suitable for reply
99 |cmd            pipe message body to a command
100 ||cmd           pipe raw message to a command
101 ?               print debug information'
102 }
103 fn printp{
104         if(test -d $mnt/$group/$1){
105                 grep -e '(^From|^Newsgroups|^Subject|^Date)' $1/header
106                 echo
107                 cat $1/body
108         }
109         echo
110         prompt=$group/$1
111 }
112 fn printpp{
113         if(test -d $mnt/$group/$1){
114                 cat $1/article
115         }
116         echo
117         prompt=$group/$1
118 }
119 fn usage{
120         echo usage: $argv0 '[ -f newsgroup ] [ -m mountpoint ] [ -p maxposts ]' >[1=2]
121         exit usage
122 }
123 while(~ $1 -*){
124         switch($1){
125         case -f
126                 group=`{echo $2 | sed 's/\./\//g'}
127                 shift
128         case -m
129                 mnt=$2
130                 shift
131         case -p
132                 maxposts=$2
133                 shift
134         case *
135                 usage
136         }
137         shift
138 }
139 if(! ~ $#* 0)
140         usage
141 prompt=$group
142 if(! test -d $mnt/$group){
143         echo !$mnt/$group does not exist >[1=2]
144         exit
145 }
146 builtin cd $mnt/$group
147 go=()
148 posts=`{getposts}
149 geth $posts >/tmp/h
150 post=$posts(1)
151 echo $#posts messages
152 while(){
153         echo -n $"prompt': '
154         cmd=`{read}
155         switch($cmd){
156         case [0-9]*
157                 if(grep -s -e '^[0-9]+$' <{echo $cmd(1)}){
158                         post=$cmd(1)
159                         printp $post
160                 }
161         case b
162                 if(! ~ $post $posts(1)){
163                         post=`{echo $post^-1 | bc}
164                         printp $post
165                 }
166         case e
167                 enterpost
168         case f
169                 post=$posts(1)
170                 printp $post
171         case g' '*
172                 ngroup=`{nshift $cmd | sed 's/\./\//g'}
173                 if(test -d $mnt/$ngroup){
174                         if(grep -s -e '^[0-9]+$' <{ls -p $mnt/$ngroup}){
175                                 group=$ngroup
176                                 builtin cd $mnt/$group
177                                 go=()
178                                 posts=`{getposts}
179                                 geth $posts >/tmp/h
180                                 post=$posts(1)
181                                 prompt=$group
182                                 echo $#posts messages
183                         }
184                         if not
185                                 echo !$ngroup contains no messages
186                 }
187                 if not
188                         echo !$ngroup does not exist
189         case h
190                 cat /tmp/h
191         case help
192                 printhelp
193         case k
194                 k $group
195         case k' '*
196                 k `{nshift $cmd | sed 's/\./\//g'}
197         case l
198                 post=$posts($#posts)
199                 printp $post
200         case p
201                 printp $post
202         case p' '*
203                 post=`{nshift $cmd}
204                 printp $post
205         case P
206                 printpp $post
207         case P' '*
208                 post=`{nshift $cmd}
209                 printpp $post
210         case q
211                 exit
212         case r
213                 if(test -f $mnt/$group/$post/header){
214                         subject='Re: '^`{grep -e '^Subject: ' $mnt/$group/$post/header | sed 's/^Subject: //g'}
215                         enterpost
216                 }
217                 if not
218                         echo !message missing
219         case y
220                 posts=`{getposts}
221                 geth $posts >/tmp/h
222                 echo $#posts messages
223         case '"'
224                 printp $post | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g'
225         case '||'*
226                 cmd=`{echo $"cmd | sed 's/^\|\|//g'}
227                 cat $mnt/$group/$post/article | eval $cmd
228         case '|'*
229                 cmd=`{echo $"cmd | sed 's/^\|//g'}
230                 cat $mnt/$group/$post/body | eval $cmd
231         case '?'
232                 echo mnt: $mnt
233                 echo group: $group
234                 echo maxposts: $maxposts
235                 echo posts: $posts
236                 echo post: $post        
237         case n *
238                 if(~ $post $posts(1) && ~ $#go 0){
239                         go=1
240                         printp $post
241                 }
242                 if not if(! ~ $post $posts($#posts)){
243                         go=1
244                         post=`{echo $post^+1 | bc}
245                         if(test $post -gt $posts($#posts))
246                                 post=$posts($#posts)
247                         printp $post
248                 }
249         }       
250 }