]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/ircrc
9be2bc4e7982e15d168e9813395783ed2d0a5faa
[plan9front.git] / rc / bin / ircrc
1 #!/bin/rc
2
3 rfork ne
4
5 server=irc.freenode.net
6 port=6667
7 realname='<nil>'
8 target=''
9 clonefile=/net/tcp/clone
10 netdir=()
11 nick=$user
12 pass=()
13
14 fn sighup {
15         exit 'hang up'
16 }
17
18 fn sigint sigterm {
19         if (! ~ $#netdir 0)
20                 echo  QUIT : Leaving... > $netdir/data
21 }
22
23 fn mshift {
24         shift
25         echo $*
26 }
27
28 fn etime {
29         date | awk '{print $4}' | awk -F ':' '{print "[" $1 ":" $2 "]"}'
30 }
31
32 fn work {
33         echo USER $user foo bar :$realname > $netdir/data
34         echo NICK $nick > $netdir/data
35         if (~ $#pass 1)
36                 echo PRIVMSG 'nickserv :'identify $"pass > $netdir/data
37         if(! ~ $target ''){
38                 title
39                 echo JOIN $target > $netdir/data
40         }
41         while (cmd=`{read}) {
42         msg=()
43         out=()
44                 switch ($cmd(1)) {
45                 case /!
46                         eval `{mshift $cmd} | while(rc=`{read})echo 'PRIVMSG '^$target^' :' $rc | tee $netdir/data
47                 case /M
48                         msg = (MODE `{mshift $cmd})
49                 case /N
50                         cmd = `{mshift $cmd}
51                         if (! ~ $#cmd 0)
52                                 msg = (NOTICE $cmd(1) : `{mshift $cmd})
53                 case /T
54                         msg = (TOPIC `{mshift $cmd})
55                 case /W
56                         msg = (WHOIS `{mshift $cmd})
57                 case /a
58                         msg =  (AWAY : `{mshift $cmd})
59                 case /j
60                         if (~ $#cmd 2) {
61                                 target=$cmd(2)
62                                 title
63                                 msg = (JOIN `{mshift $cmd})
64                         }
65                 case /l
66                         msg = (LIST `{mshift $cmd})
67                 case /m
68                         cmd = `{mshift $cmd}
69                         if (! ~ $#cmd 0) {
70                                 to = $cmd(1)
71                                 cmd = `{mshift $cmd}
72                                 out =  '('^$to^')       ⇐     '^$"cmd
73                                 msg = 'PRIVMSG '^$to^' :'^$"cmd
74                         }
75                 case /n
76                         nick = `{mshift $cmd}
77                         msg =  (NICK $nick)
78                 case /p
79                         cmd = `{mshift $cmd}
80                         if (! ~ $#cmd 0)
81                                 msg = (PART $cmd(1) : `{mshift $cmd})
82                 case /q
83                         msg =  `{mshift $cmd}
84                 case /t
85                         target = `{mshift $cmd}
86                         title
87                 case /u
88                         msg = (USERS `{mshift $cmd})
89                 case /w
90                         msg = (WHO `{mshift $cmd})
91                 case /x
92                         echo  QUIT : Leaving... > $netdir/data
93                         exit
94                 case *
95                         msg = 'PRIVMSG '^$target^' :'^$"cmd
96                         out = '('^$target^')    ⇐     '^$"cmd
97                 }
98                 if (! ~ $#msg 0)
99                         echo $msg > $netdir/data
100                 if (! ~ $#out 0)
101                         echo `{etime}^' '^$out
102         }
103 }
104
105 fn misc {
106         sed '
107                 s/^://
108                 s/!~?[a-zA-Z0-9_@\-|.{=\/:]+ /:/' |
109         awk -F ':' '
110         {
111                 s =  $2 " «" $1 "»\t" $3;
112                 for(i = 4; i < NF+1; i++)
113                         s = s ":" $i;
114                 printf("%s\n", s);
115         }' 
116 }
117
118 fn notice {
119         sed '
120                 s/^NOTICE /:'^$server^':/
121                 s/^://
122                 s/!~?[a-zA-Z0-9_@\-|.{=\/]+ /:/' |
123         awk -F ':' '
124         {
125                 s = "-" $1 "-   ⇒\t" $3;
126                 for(i = 4; i < NF+1; i++)
127                         s = s ":" $i;
128                 printf("%s\n", s);
129         }' 
130 }
131
132 fn numeric {
133         sed 's/^:[a-zA-Z0-9_@\-|.!=#]+ //
134                 s/ '^$nick^' //
135                 s/^353= /***    Users on /
136                 s/^[0-9][0-9][0-9] ?:?/***      /'
137 }
138
139 fn privmsg {
140         sed ' 
141                 s/^:/«/
142                 s/!~?[a-zA-Z0-9_@\-|.{=\/:]+ PRIVMSG /»        ⇒     :/
143                 s/#[a-zA-Z0-9_@\-|.#]+/(&)/' | 
144         awk -F ':' '
145         {
146                 s = $2 $1  $3;
147                 for(i = 4; i < NF+1; i++)
148                         s = s ":" $i;
149                 printf("%s\n", s);
150         }'
151
152 }
153
154 fn pretty {
155         while (~ `{cat $netdir/status} *Established*) {
156                 line=`{read}
157                 switch ($line) {
158                 case *JOIN* *QUIT* *PART* *NICK*
159                         line = `{echo -n $line | misc}
160                 case *NOTICE*
161                         line = `{echo -n $line | notice}
162                 case *PRIVMSG*
163                         line = `{echo -n $line | privmsg}
164                 case *PING*
165                         echo -n $line | sed 's/PING/PONG/' > $netdir/data
166                         line = ()
167                 case *
168                         line = `{echo -n $line | numeric}
169                 }
170                 if (! ~ $#line 0)
171                         echo `{etime} $line
172         }
173         exit
174 }
175
176 fn getip {
177         echo $1 ip | ndb/dnsquery | sed 1q | awk '{print $NF}'
178 }
179
180 fn title {
181         if (! ~ $#winid 0) {
182                 if (test -f /mnt/acme/$winid/ctl)
183                         echo name /$server/$target/-ircrc > /mnt/acme/$winid/ctl
184         }
185         if not
186                 label ircrc $server - $target
187 }
188
189 while (~ $1 -*) {
190         switch ($1) {
191         case -n
192                 nick=$2
193                 shift
194         case -p
195                 port=$2
196                 shift
197         case -r
198                 realname=$2
199                 shift
200         case -t
201                 target=$2
202                 shift
203         case -*
204                 echo 'usage: ircrc  [-p port] [-r realname] [-t target] [-n nick]  [server]' >[1=2]
205                 exit 'usage'    
206         }
207         shift
208 }
209
210 if (~ $#* 1) {
211         switch ($1) {
212         case bitlbee
213                 server=im.bitlbee.org
214         case oftc
215                 server=irc.oftc.net
216         case *
217                 server=$1
218         }
219 }
220
221 ip=`{getip $server}
222 if (~ $#ip 0) {
223         echo cant translate $server
224         exit 'unknown host'
225 }
226
227 title
228 userpass=`{auth/userpasswd 'server='^$server^' service=irc user='^$nick >[2]/dev/null}
229 if(~ $#userpass 2 && ~ $nick $user) {
230         nick=$userpass(1)
231         pass=$userpass(2)
232 }
233
234 <[4] $clonefile {
235         netdir=`{basename -d $clonefile} ^ / ^  `{cat /fd/4}
236         echo connect $ip!$port >$netdir/ctl || exit 'cannot connect'
237         echo connected to tcp!$ip!$port on $netdir
238         cat $netdir/data | tr -d '\r\ 2' | pretty & 
239         work
240 }