]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/newt
torrent(1): update url in examples section
[plan9front.git] / rc / bin / newt
1 #!/bin/rc
2 # NEWT, their six-year-old daughter, yells from the back...
3 # use with nntpfs
4 rfork en
5 ramfs
6 argv0=$0
7 if(~ $#editor 0)
8         editor=hold
9 if(~ $#pager 0)
10         pager=cat
11 group=alt/test
12 maxposts=30
13 mnt=/mnt/news
14 if(~ $#newtname 0)
15         newtname=newt@dont-email.me
16 fn e{
17         {
18                 echo From: $"newtname
19                 echo Newsgroups: `{echo $group | sed 's/\//\./g'}
20                 echo Subject: $"subject
21                 echo
22         } >/tmp/post
23         eval $editor /tmp/post
24         yn send
25         if(~ $yn y)
26                 cat /tmp/post >$mnt/$group/post
27 }
28 fn f { du -a $* | sed 's/^.*    //g' }
29 fn fmtd{
30         date=`{cat}
31         if(! ~ $date(1) [0-9]*)
32                 date=`{nshift $date}
33         da=$date(1)
34         if(~ $da [0-9])
35                 da=0^$da
36         switch($date(2)){
37         case Jan;       mo=1
38         case Feb;       mo=2
39         case Mar;       mo=3
40         case Apr;       mo=4
41         case May;       mo=5
42         case Jun;       mo=6
43         case Jul;       mo=7
44         case Aug;       mo=8
45         case Sep;       mo=9
46         case Oct;       mo=10
47         case Nov;       mo=11
48         case Dec;       mo=12
49         }
50         if(! ~ $date(3) `{date | awk '{print $6;}'})
51                 ti=$date(3)
52         if not
53                 ti=`{echo $date(4) | awk '{print substr($0,0,5);}'}
54         if(! ~ $#mo 0 && ! ~ $#da 0 && ! ~ $#ti 0)
55                 echo $mo/$da $ti
56         if not
57                 echo nil
58 }
59 fn geth{
60         for(i in $*){
61                 from=`{awk -F ' ' '{print $3;}' $rposts($i)^/xover >[2]/dev/null}
62                 if(! ~ $#from 0 && ! ~ $#from 1){
63                         nfrom=`{
64                                 for(i in $from){
65                                         if(~ $i *@*)
66                                                 echo $i | sed 's/(<|>)//g'
67                                 }
68                         }
69                         if(! ~ $#nfrom 0)
70                                 from=$nfrom
71                 }
72                 if(~ $#from 0)
73                         from=nil
74                 date=`{awk -F ' ' '{print $4;}' $rposts($i)^/xover >[2]/dev/null | fmtd}
75                 if(~ $#date 0)
76                         date=nil
77                 subject=`{awk -F '      ' '{print substr($2,0,50);}' $rposts($i)^/xover >[2]/dev/null}
78                 if(~ $#subject 0)
79                         subject=nil
80                 # unicode 00a0 divides message number from headline.
81                 # command input ignores everything after unicode 00a0.
82                 # these lines may be selected and sent to the prompt.
83                 echo '  '$"i' '$"date' '$"from'                '$"subject
84         }
85 }
86 fn getposts{ ls | grep -e '^[0-9]+$' | sort -n | tail -$maxposts }
87 fn getr{
88         switch($*){
89         case ,; echo $posts
90         case ,*;        seq 1 `{echo $* | sed 's/,//g'}
91         case *,;        seq `{echo $* | sed 's/,//g'} $posts($#posts)
92         case *,*;       seq `{echo $* | sed 's/,/ /g'}
93         case *; echo $*
94         }
95 }
96 fn h{ sed -n $1^p /tmp/h }
97 fn k{
98         kmnt=`{echo $mnt | sed 's/\//\\\//g'}
99         f $mnt/$* |
100                 grep -v -e '\/([0-9]+|article|body|header|post|xover)$' |
101                 sed 's/^'$"kmnt'\//  g  /g' |
102                 sort |
103                 eval $pager
104 }
105 fn nshift{ shift; echo $* }
106 fn printhelp{
107 echo 'Commands are of the form [<range>] <command> [args]
108 <range> := <addr> | <addr>','<addr>
109 <command> :=
110 b               print the next ten headers
111 e               enter message
112 g ...           go to specified group
113 h               print message headline (,h for all)
114 help            print this help message
115 k ...           list sub-groups under specified group
116 kf ...          grep $home/lib/newsgroups for regexp
117 p               print message with minimal headers
118 P               print message with full headers
119 q               quit
120 r               reply to message
121 y               synchronize message list with server
122 "               print message in quoted form, suitable for reply
123 |cmd            pipe message body to a command
124 ||cmd           pipe raw message to a command
125 !cmd            run a command
126 ?               print debug information'
127 }
128 fn np{
129         if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/body){
130                 { # don't stutter
131                         grep -e '(^From|^Newsgroups|^Subject|^Date)' $rposts($1)^/header
132                         echo
133                         cat $rposts($1)^/body
134                 } >/tmp/p
135                 eval $pager /tmp/p
136         }
137         echo
138         go=1
139         r=$1
140         post=$1
141         prompt=$group/$1
142 }
143 fn P{
144         if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/article)
145                 eval $pager $rposts($1)^/article
146         echo
147         go=1
148         r=$1
149         post=$1
150         prompt=$group/$1
151 }
152 fn r{
153         if(test $1 -le $#rposts && test -f $mnt/$group/$rposts($1)^/header){
154                 subject=`{grep -e '^Subject: ' $mnt/$group/$rposts($1)^/header | sed 's/^Subject: //g'}
155                 if(! ~ $subject RE:* Re:* re:*)
156                         subject=(Re: $subject)
157                 e
158         }
159         if not
160                 echo !message missing
161 }
162 fn y{
163         go=()
164         r=$post
165         if(! ~ $q 1){
166                 rposts=`{getposts}
167                 posts=`{seq 1 $#rposts}
168                 post=$posts(1)
169                 prompt=$post
170                 geth $posts >/tmp/h
171                 echo $#posts messages
172         }
173 }
174 fn yn{
175         echo
176         echo -n $* ' (y, n) '
177         yn=`{read}
178         switch($yn){
179         case y n
180                 ;
181         case *
182                 yn
183         }
184 }
185 fn '"' {{p $1 | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g' | sed '$d'; echo}}
186 fn usage{
187         echo usage: $argv0 '[ -f newsgroup ] [ -m mountpoint ] [ -p maxposts ]' >[1=2]
188         exit usage
189 }
190 while(~ $1 -*){
191         switch($1){
192         case -f
193                 group=`{echo $2 | sed 's/\./\//g'}
194                 shift
195         case -m
196                 mnt=$2
197                 shift
198         case -p
199                 maxposts=$2
200                 shift
201         case *
202                 usage
203         }
204         shift
205 }
206 if(! ~ $#* 0)
207         usage
208 prompt=$group
209 if(! test -d $mnt/$group){
210         echo !$mnt/$group does not exist >[1=2]
211         exit
212 }
213 builtin cd $mnt/$group
214 y
215 while(){
216         echo -n $"prompt': '
217         # command input ignores everything after unicode 00a0.
218         rcmd=`{read | sed 's/[ ].*$//g' | sed 's/^([0-9]+)?(,)?([0-9]+)?/& /g'}
219         switch($rcmd){
220         case ,* [0-9]*
221                 r=`{getr $rcmd(1)}
222                 cmd=`{nshift $rcmd}
223                 if(~ $#cmd 0)
224                         cmd=p
225         case *
226                 r=$post
227                 cmd=$rcmd
228         }
229         switch($cmd){
230         case b
231                 r=`{seq $r(1) `{echo $r(1)^+10|bc}}
232                 if(test $r($#r) -gt $posts($#posts))
233                         r=`{seq $r(1) $posts($#posts)}
234                 if(! ~ $#r 0 && test $r(1) -le $posts($#posts)){
235                         sed -n $r(1)^,$r($#r)^p /tmp/h
236                         post=$r($#r)
237                         prompt=$post
238                 }
239                 if not
240                         echo !address
241         case e
242                 subject=() e
243         case g' '*
244                 ngroup=`{nshift $cmd | sed 's/\./\//g'}
245                 if(test -d $mnt/$ngroup){
246                         if(grep -s -e '^[0-9]+$' <{ls -p $mnt/$ngroup}){
247                                 group=$ngroup
248                                 builtin cd $mnt/$group
249                                 y
250                         }
251                         if not
252                                 echo !$ngroup contains no messages
253                 }
254                 if not
255                         echo !$ngroup does not exist
256         case h
257                 {
258                         for(i in $r)
259                                 h $i
260                 } | eval $pager
261                 post=$r($#r)
262                 prompt=$post
263         case help
264                 printhelp
265         case k
266                 k $group
267         case k' '*
268                 k `{nshift $cmd | sed 's/\./\//g'}
269         case kf' '*
270                 grep -e `{nshift $cmd} $home/lib/newsgroups |
271                         sed 's/^/  g    /g' |
272                         eval $pager
273         case p
274                 for(i in $r)
275                         np $i
276         case P
277                 for(i in $r)
278                         P $i
279         case q
280                 q=1 y # BUP STOP
281                 exit
282         case r
283                 for(i in $r)
284                         r $i
285                 post=$r($#r)
286                 prompt=$post
287         case y
288                 y
289         case '"'
290                 for(i in $r)
291                         '"' $i
292                 post=$r($#r)
293                 prompt=$post
294         case '||'*
295                 cmd=`{echo $"cmd | sed 's/^\|\|//g'}
296                 cat $mnt/$group/^$rposts($post)^/article | eval $cmd
297         case '|'*
298                 cmd=`{echo $"cmd | sed 's/^\|//g'}
299                 cat $mnt/$group/^$rposts($post)^/body | eval $cmd
300         case '!'*
301                 eval `{echo $"cmd | sed 's/^\!//g'}
302         case '?'
303                 echo editor: $editor
304                 echo pager: $pager
305                 echo mnt: $mnt
306                 echo group: $group
307                 echo maxposts: $maxposts
308                 echo '#go': $#go
309                 echo rposts: $rposts
310                 echo 'rposts(r):' $rposts($r)
311                 echo posts: $posts
312                 echo post: $post
313                 echo r: $r
314         case *
315                 if(~ $post $posts(1) && ~ $#go 0)
316                         np $post
317                 if not if(! ~ $post $posts($#posts)){
318                         post=`{echo $post^+1 | bc}
319                         if(test $post -gt $posts($#posts))
320                                 post=$posts($#posts)
321                         np $post
322                 }
323         }       
324 }