working test program for the clooglebot
[cloogle-irc.git] / IRC.icl
1 implementation module IRC
2
3 import GenPrint
4 import StdOverloaded
5 import Data.Maybe
6 import Data.Either
7 import StdFunc
8 import StdString
9 from Text import class Text(..), instance Text String
10 from StdMisc import undef
11
12 derive gPrint IRCCommands, IRCReplies, IRCErrors, (,), Maybe, (), Either
13
14 instance toString IRCCommands where
15 toString r = flip (+++) "\r\n" case r of
16 //ADMIN (Maybe String)
17 //AWAY String
18 //CONNECT String Int (Maybe String)
19 //DIE
20 //ERROR String
21 //INFO (Maybe String)
22 //INVITE String String
23 //ISON [String]
24 JOIN chs = "JOIN " +++ either (const "0")
25 (\c->join ", " [join " " [ch:maybeToList mkey]\\(ch, mkey)<-c]) chs
26 //KICK String String (Maybe String)
27 //KILL String String
28 //LINKS (Maybe (Maybe String, String))
29 //LIST [String]
30 //LUSERS (Maybe (String, Maybe String))
31 //MODE String
32 //MOTD (Maybe String)
33 //NAMES [String]
34 NICK n = join " " ["NICK", n]
35 //NJOIN
36 //NOTICE String String
37 //OPER String String
38 //PART [String]
39 //PASS String
40 //PING [String]
41 //PONG [String]
42 PRIVMSG dest msg = join " " ["PRIVMSG", dest, msg]
43 QUIT msg = join " " ["QUIT":maybeToList msg]
44 //REHASH
45 //RESTART
46 //SERVER
47 //SERVICE String String String String
48 //SERVLIST (Maybe (String, Maybe String))
49 //SQUERY String String
50 //SQUIRT
51 //SQUIT String String
52 //STATS (Maybe (String, Maybe String))
53 //SUMMON String (Maybe (String, Maybe String))
54 //TIME (Maybe String)
55 //TOPIC String (Maybe String)
56 //TRACE (Maybe String)
57 USER login mode rn = join " " ["USER", login, toString mode, "*", ":", rn]
58 //USERHOST [String]
59 //USERS (Maybe String)
60 //VERSION (Maybe String)
61 //WALLOPS String
62 //WHO (Maybe String)
63 //WHOIS (Maybe String) [String]
64 //WHOWAS (Maybe String) [String]
65 _ = printToString r
66
67
68 instance toString IRCReplies where toString r = printToString r
69 instance toString IRCErrors where toString r = printToString r
70
71 instance fromInt IRCReplies where
72 fromInt r = case r of
73 1 = RPL_WELCOME
74 2 = RPL_YOURHOST
75 3 = RPL_CREATED
76 4 = RPL_MYINFO
77 5 = RPL_BOUNCE
78 200 = RPL_TRACELINK
79 201 = RPL_TRACECONNECTING
80 202 = RPL_TRACEHANDSHAKE
81 203 = RPL_TRACEUNKNOWN
82 204 = RPL_TRACEOPERATOR
83 205 = RPL_TRACEUSER
84 206 = RPL_TRACESERVER
85 207 = RPL_TRACESERVICE
86 208 = RPL_TRACENEWTYPE
87 209 = RPL_TRACECLASS
88 210 = RPL_TRACERECONNECT
89 211 = RPL_STATSLINKINFO
90 212 = RPL_STATSCOMMANDS
91 219 = RPL_ENDOFSTATS
92 221 = RPL_UMODEIS
93 234 = RPL_SERVLIST
94 235 = RPL_SERVLISTEND
95 242 = RPL_STATSUPTIME
96 243 = RPL_STATSOLINE
97 251 = RPL_LUSERCLIENT
98 252 = RPL_LUSEROP
99 253 = RPL_LUSERUNKNOWN
100 254 = RPL_LUSERCHANNELS
101 255 = RPL_LUSERME
102 256 = RPL_ADMINME
103 257 = RPL_ADMINLOC1
104 258 = RPL_ADMINLOC2
105 259 = RPL_ADMINEMAIL
106 261 = RPL_TRACELOG
107 262 = RPL_TRACEEND
108 263 = RPL_TRYAGAIN
109 301 = RPL_AWAY
110 302 = RPL_USERHOST
111 303 = RPL_ISON
112 304 = RPL_UNAWAY
113 305 = RPL_NOWAWAY
114 311 = RPL_WHOISUSER
115 312 = RPL_WHOISSERVER
116 313 = RPL_WHOISOPERATOR
117 314 = RPL_WHOWASUSER
118 315 = RPL_ENDOFWHO
119 317 = RPL_WHOISIDLE
120 318 = RPL_ENDOFWHOIS
121 319 = RPL_WHOISCHANNELS
122 321 = RPL_LISTSTART
123 322 = RPL_LIST
124 323 = RPL_LISTEND
125 324 = RPL_CHANNELMODEIS
126 325 = RPL_UNIQOPIS
127 331 = RPL_NOTOPIC
128 332 = RPL_TOPIC
129 341 = RPL_INVITING
130 342 = RPL_SUMMONING
131 346 = RPL_INVITELIST
132 347 = RPL_ENDOFINVITELIST
133 348 = RPL_EXCEPTLIST
134 349 = RPL_ENDOFEXCEPTLIST
135 351 = RPL_VERSION
136 352 = RPL_WHOREPLY
137 353 = RPL_NAMREPLY
138 364 = RPL_LINKS
139 365 = RPL_ENDOFLINKS
140 366 = RPL_ENDOFNAMES
141 367 = RPL_BANLIST
142 368 = RPL_ENDOFBANLIST
143 369 = RPL_ENDOFWHOWAS
144 371 = RPL_INFO
145 372 = RPL_MOTD
146 374 = RPL_ENDOFINFO
147 375 = RPL_MOTDSTART
148 376 = RPL_ENDOFMOTD
149 381 = RPL_YOUREOPER
150 382 = RPL_REHASHING
151 383 = RPL_YOURESERVICE
152 391 = RPL_TIME
153 392 = RPL_USERSSTART
154 393 = RPL_USERS
155 394 = RPL_ENDOFUSERS
156 395 = RPL_NOUSERS
157 _ = undef
158
159 instance toInt IRCReplies where
160 toInt r = case r of
161 RPL_WELCOME = 1
162 RPL_YOURHOST = 2
163 RPL_CREATED = 3
164 RPL_MYINFO = 4
165 RPL_BOUNCE = 5
166 RPL_TRACELINK = 200
167 RPL_TRACECONNECTING = 201
168 RPL_TRACEHANDSHAKE = 202
169 RPL_TRACEUNKNOWN = 203
170 RPL_TRACEOPERATOR = 204
171 RPL_TRACEUSER = 205
172 RPL_TRACESERVER = 206
173 RPL_TRACESERVICE = 207
174 RPL_TRACENEWTYPE = 208
175 RPL_TRACECLASS = 209
176 RPL_TRACERECONNECT = 210
177 RPL_STATSLINKINFO = 211
178 RPL_STATSCOMMANDS = 212
179 RPL_ENDOFSTATS = 219
180 RPL_UMODEIS = 221
181 RPL_SERVLIST = 234
182 RPL_SERVLISTEND = 234
183 RPL_STATSUPTIME = 242
184 RPL_STATSOLINE = 243
185 RPL_LUSERCLIENT = 251
186 RPL_LUSEROP = 252
187 RPL_LUSERUNKNOWN = 253
188 RPL_LUSERCHANNELS = 254
189 RPL_LUSERME = 255
190 RPL_ADMINME = 256
191 RPL_ADMINLOC1 = 257
192 RPL_ADMINLOC2 = 258
193 RPL_ADMINEMAIL = 259
194 RPL_TRACELOG = 261
195 RPL_TRACEEND = 262
196 RPL_TRYAGAIN = 263
197 RPL_AWAY = 301
198 RPL_USERHOST = 302
199 RPL_ISON = 303
200 RPL_UNAWAY = 304
201 RPL_NOWAWAY = 305
202 RPL_WHOISUSER = 311
203 RPL_WHOISSERVER = 312
204 RPL_WHOISOPERATOR = 313
205 RPL_WHOWASUSER = 314
206 RPL_ENDOFWHO = 315
207 RPL_WHOISIDLE = 317
208 RPL_ENDOFWHOIS = 318
209 RPL_WHOISCHANNELS = 319
210 RPL_LISTSTART = 321
211 RPL_LIST = 322
212 RPL_LISTEND = 323
213 RPL_CHANNELMODEIS = 324
214 RPL_UNIQOPIS = 325
215 RPL_NOTOPIC = 331
216 RPL_TOPIC = 332
217 RPL_INVITING = 341
218 RPL_SUMMONING = 342
219 RPL_INVITELIST = 346
220 RPL_ENDOFINVITELIST = 347
221 RPL_EXCEPTLIST = 348
222 RPL_ENDOFEXCEPTLIST = 349
223 RPL_VERSION = 351
224 RPL_WHOREPLY = 352
225 RPL_NAMREPLY = 353
226 RPL_LINKS = 364
227 RPL_ENDOFLINKS = 365
228 RPL_ENDOFNAMES = 366
229 RPL_BANLIST = 367
230 RPL_ENDOFBANLIST = 367
231 RPL_ENDOFWHOWAS = 369
232 RPL_INFO = 371
233 RPL_MOTD = 372
234 RPL_ENDOFINFO = 374
235 RPL_MOTDSTART = 375
236 RPL_ENDOFMOTD = 376
237 RPL_YOUREOPER = 381
238 RPL_REHASHING = 382
239 RPL_YOURESERVICE = 383
240 RPL_TIME = 391
241 RPL_USERSSTART = 392
242 RPL_USERS = 393
243 RPL_ENDOFUSERS = 394
244 RPL_NOUSERS = 395
245
246 instance fromInt IRCErrors where
247 fromInt r = case r of
248 401 = ERR_NOSUCHNICK
249 402 = ERR_NOSUCHSERVER
250 403 = ERR_NOSUCHCHANNEL
251 404 = ERR_CANNOTSENDTOCHAN
252 405 = ERR_TOOMANYCHANNELS
253 406 = ERR_WASNOSUCHNICK
254 407 = ERR_TOOMANYTARGETS
255 408 = ERR_NOSUCHSERVICE
256 409 = ERR_NOORIGIN
257 411 = ERR_NORECIPIENT
258 412 = ERR_NOTEXTTOSEND
259 413 = ERR_NOTOPLEVEL
260 414 = ERR_WILDTOPLEVEL
261 415 = ERR_BADMASK
262 421 = ERR_UNKNOWNCOMMAND
263 422 = ERR_NOMOTD
264 423 = ERR_NOADMININFO
265 424 = ERR_FILEERROR
266 431 = ERR_NONICKNAMEGIVEN
267 432 = ERR_ERRONEUSNICKNAME
268 433 = ERR_NICKNAMEINUSE
269 436 = ERR_NICKCOLLISION
270 437 = ERR_UNAVAILRESOURCE
271 441 = ERR_USERNOTINCHANNEL
272 442 = ERR_NOTONCHANNEL
273 443 = ERR_USERONCHANNEL
274 444 = ERR_NOLOGIN
275 445 = ERR_SUMMONDISABLED
276 446 = ERR_USERSDISABLED
277 451 = ERR_NOTREGISTERED
278 461 = ERR_NEEDMOREPARAMS
279 462 = ERR_ALREADYREGISTRED
280 463 = ERR_NOPERMFORHOST
281 464 = ERR_PASSWDMISMATCH
282 465 = ERR_YOUREBANNEDCREEP
283 466 = ERR_YOUWILLBEBANNED
284 467 = ERR_KEYSET
285 471 = ERR_CHANNELISFULL
286 472 = ERR_UNKNOWNMODE
287 473 = ERR_INVITEONLYCHAN
288 474 = ERR_BANNEDFROMCHAN
289 475 = ERR_BADCHANNELKEY
290 476 = ERR_BADCHANMASK
291 477 = ERR_NOCHANMODES
292 478 = ERR_BANLISTFULL
293 481 = ERR_NOPRIVILEGES
294 482 = ERR_CHANOPRIVSNEEDED
295 483 = ERR_CANTKILLSERVER
296 484 = ERR_RESTRICTED
297 485 = ERR_UNIQOPPRIVSNEEDED
298 491 = ERR_NOOPERHOST
299 501 = ERR_UMODEUNKNOWNFLAG
300 502 = ERR_USERSDONTMATCH
301
302 instance toInt IRCErrors where
303 toInt r = case r of
304 ERR_NOSUCHNICK = 401
305 ERR_NOSUCHSERVER = 402
306 ERR_NOSUCHCHANNEL = 403
307 ERR_CANNOTSENDTOCHAN = 404
308 ERR_TOOMANYCHANNELS = 405
309 ERR_WASNOSUCHNICK = 406
310 ERR_TOOMANYTARGETS = 407
311 ERR_NOSUCHSERVICE = 408
312 ERR_NOORIGIN = 409
313 ERR_NORECIPIENT = 411
314 ERR_NOTEXTTOSEND = 412
315 ERR_NOTOPLEVEL = 413
316 ERR_WILDTOPLEVEL = 414
317 ERR_BADMASK = 415
318 ERR_UNKNOWNCOMMAND = 421
319 ERR_NOMOTD = 422
320 ERR_NOADMININFO = 423
321 ERR_FILEERROR = 424
322 ERR_NONICKNAMEGIVEN = 431
323 ERR_ERRONEUSNICKNAME = 432
324 ERR_NICKNAMEINUSE = 433
325 ERR_NICKCOLLISION = 436
326 ERR_UNAVAILRESOURCE = 437
327 ERR_USERNOTINCHANNEL = 441
328 ERR_NOTONCHANNEL = 442
329 ERR_USERONCHANNEL = 443
330 ERR_NOLOGIN = 444
331 ERR_SUMMONDISABLED = 445
332 ERR_USERSDISABLED = 446
333 ERR_NOTREGISTERED = 451
334 ERR_NEEDMOREPARAMS = 461
335 ERR_ALREADYREGISTRED = 462
336 ERR_NOPERMFORHOST = 463
337 ERR_PASSWDMISMATCH = 464
338 ERR_YOUREBANNEDCREEP = 465
339 ERR_YOUWILLBEBANNED = 466
340 ERR_KEYSET = 467
341 ERR_CHANNELISFULL = 471
342 ERR_UNKNOWNMODE = 472
343 ERR_INVITEONLYCHAN = 473
344 ERR_BANNEDFROMCHAN = 474
345 ERR_BADCHANNELKEY = 475
346 ERR_BADCHANMASK = 476
347 ERR_NOCHANMODES = 477
348 ERR_BANLISTFULL = 478
349 ERR_NOPRIVILEGES = 481
350 ERR_CHANOPRIVSNEEDED = 482
351 ERR_CANTKILLSERVER = 483
352 ERR_RESTRICTED = 484
353 ERR_UNIQOPPRIVSNEEDED = 485
354 ERR_NOOPERHOST = 491
355 ERR_UMODEUNKNOWNFLAG = 501
356 ERR_USERSDONTMATCH = 502