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