1 implementation module IRC
10 from Text import class Text(..), instance Text String
11 from StdMisc import undef
13 derive gPrint IRCCommands, IRCReplies, IRCErrors, (,), Maybe, (), Either
15 instance toString IRCCommands where
16 toString r = flip (+++) "\r\n" case r of
17 //ADMIN (Maybe String)
19 //CONNECT String Int (Maybe String)
23 //INVITE String String
25 JOIN chs = "JOIN " +++ (if (isEmpty chs) "0"
26 (join ", " [join " " [ch:maybeToList mk]\\(ch, mk)<-chs]))
27 //KICK String String (Maybe String)
29 //LINKS (Maybe (Maybe String, String))
31 //LUSERS (Maybe (String, Maybe String))
35 NICK n = join " " ["NICK", n]
37 //NOTICE String String
41 PING a mb = join " " ["PING",a:maybeToList mb]
42 PONG a mb = join " " ["PONG",a:maybeToList mb]
43 PRIVMSG dest msg = join " " ["PRIVMSG", dest, ":"+++msg]
44 QUIT msg = join " " ["QUIT":maybeToList msg]
48 //SERVICE String String String String
49 //SERVLIST (Maybe (String, Maybe String))
50 //SQUERY String String
53 //STATS (Maybe (String, Maybe String))
54 //SUMMON String (Maybe (String, Maybe String))
56 //TOPIC String (Maybe String)
57 //TRACE (Maybe String)
58 USER login mode rn = join " " ["USER", login, toString mode, "*", ":"+++rn]
60 //USERS (Maybe String)
61 //VERSION (Maybe String)
64 //WHOIS (Maybe String) [String]
65 //WHOWAS (Maybe String) [String]
69 instance toString IRCReplies where toString r = printToString r
70 instance toString IRCErrors where toString r = printToString r
72 instance fromInt IRCReplies where
80 201 = RPL_TRACECONNECTING
81 202 = RPL_TRACEHANDSHAKE
82 203 = RPL_TRACEUNKNOWN
83 204 = RPL_TRACEOPERATOR
86 207 = RPL_TRACESERVICE
87 208 = RPL_TRACENEWTYPE
89 210 = RPL_TRACERECONNECT
90 211 = RPL_STATSLINKINFO
91 212 = RPL_STATSCOMMANDS
100 253 = RPL_LUSERUNKNOWN
101 254 = RPL_LUSERCHANNELS
116 312 = RPL_WHOISSERVER
117 313 = RPL_WHOISOPERATOR
122 319 = RPL_WHOISCHANNELS
126 324 = RPL_CHANNELMODEIS
133 347 = RPL_ENDOFINVITELIST
135 349 = RPL_ENDOFEXCEPTLIST
143 368 = RPL_ENDOFBANLIST
144 369 = RPL_ENDOFWHOWAS
152 383 = RPL_YOURESERVICE
160 instance toInt IRCReplies where
168 RPL_TRACECONNECTING = 201
169 RPL_TRACEHANDSHAKE = 202
170 RPL_TRACEUNKNOWN = 203
171 RPL_TRACEOPERATOR = 204
173 RPL_TRACESERVER = 206
174 RPL_TRACESERVICE = 207
175 RPL_TRACENEWTYPE = 208
177 RPL_TRACERECONNECT = 210
178 RPL_STATSLINKINFO = 211
179 RPL_STATSCOMMANDS = 212
183 RPL_SERVLISTEND = 234
184 RPL_STATSUPTIME = 242
186 RPL_LUSERCLIENT = 251
188 RPL_LUSERUNKNOWN = 253
189 RPL_LUSERCHANNELS = 254
204 RPL_WHOISSERVER = 312
205 RPL_WHOISOPERATOR = 313
210 RPL_WHOISCHANNELS = 319
214 RPL_CHANNELMODEIS = 324
221 RPL_ENDOFINVITELIST = 347
223 RPL_ENDOFEXCEPTLIST = 349
231 RPL_ENDOFBANLIST = 367
232 RPL_ENDOFWHOWAS = 369
240 RPL_YOURESERVICE = 383
247 instance fromInt IRCErrors where
248 fromInt r = case r of
250 402 = ERR_NOSUCHSERVER
251 403 = ERR_NOSUCHCHANNEL
252 404 = ERR_CANNOTSENDTOCHAN
253 405 = ERR_TOOMANYCHANNELS
254 406 = ERR_WASNOSUCHNICK
255 407 = ERR_TOOMANYTARGETS
256 408 = ERR_NOSUCHSERVICE
258 411 = ERR_NORECIPIENT
259 412 = ERR_NOTEXTTOSEND
261 414 = ERR_WILDTOPLEVEL
263 421 = ERR_UNKNOWNCOMMAND
265 423 = ERR_NOADMININFO
267 431 = ERR_NONICKNAMEGIVEN
268 432 = ERR_ERRONEUSNICKNAME
269 433 = ERR_NICKNAMEINUSE
270 436 = ERR_NICKCOLLISION
271 437 = ERR_UNAVAILRESOURCE
272 441 = ERR_USERNOTINCHANNEL
273 442 = ERR_NOTONCHANNEL
274 443 = ERR_USERONCHANNEL
276 445 = ERR_SUMMONDISABLED
277 446 = ERR_USERSDISABLED
278 451 = ERR_NOTREGISTERED
279 461 = ERR_NEEDMOREPARAMS
280 462 = ERR_ALREADYREGISTRED
281 463 = ERR_NOPERMFORHOST
282 464 = ERR_PASSWDMISMATCH
283 465 = ERR_YOUREBANNEDCREEP
284 466 = ERR_YOUWILLBEBANNED
286 471 = ERR_CHANNELISFULL
287 472 = ERR_UNKNOWNMODE
288 473 = ERR_INVITEONLYCHAN
289 474 = ERR_BANNEDFROMCHAN
290 475 = ERR_BADCHANNELKEY
291 476 = ERR_BADCHANMASK
292 477 = ERR_NOCHANMODES
293 478 = ERR_BANLISTFULL
294 481 = ERR_NOPRIVILEGES
295 482 = ERR_CHANOPRIVSNEEDED
296 483 = ERR_CANTKILLSERVER
298 485 = ERR_UNIQOPPRIVSNEEDED
300 501 = ERR_UMODEUNKNOWNFLAG
301 502 = ERR_USERSDONTMATCH
303 instance toInt IRCErrors where
306 ERR_NOSUCHSERVER = 402
307 ERR_NOSUCHCHANNEL = 403
308 ERR_CANNOTSENDTOCHAN = 404
309 ERR_TOOMANYCHANNELS = 405
310 ERR_WASNOSUCHNICK = 406
311 ERR_TOOMANYTARGETS = 407
312 ERR_NOSUCHSERVICE = 408
314 ERR_NORECIPIENT = 411
315 ERR_NOTEXTTOSEND = 412
317 ERR_WILDTOPLEVEL = 414
319 ERR_UNKNOWNCOMMAND = 421
321 ERR_NOADMININFO = 423
323 ERR_NONICKNAMEGIVEN = 431
324 ERR_ERRONEUSNICKNAME = 432
325 ERR_NICKNAMEINUSE = 433
326 ERR_NICKCOLLISION = 436
327 ERR_UNAVAILRESOURCE = 437
328 ERR_USERNOTINCHANNEL = 441
329 ERR_NOTONCHANNEL = 442
330 ERR_USERONCHANNEL = 443
332 ERR_SUMMONDISABLED = 445
333 ERR_USERSDISABLED = 446
334 ERR_NOTREGISTERED = 451
335 ERR_NEEDMOREPARAMS = 461
336 ERR_ALREADYREGISTRED = 462
337 ERR_NOPERMFORHOST = 463
338 ERR_PASSWDMISMATCH = 464
339 ERR_YOUREBANNEDCREEP = 465
340 ERR_YOUWILLBEBANNED = 466
342 ERR_CHANNELISFULL = 471
343 ERR_UNKNOWNMODE = 472
344 ERR_INVITEONLYCHAN = 473
345 ERR_BANNEDFROMCHAN = 474
346 ERR_BADCHANNELKEY = 475
347 ERR_BADCHANMASK = 476
348 ERR_NOCHANMODES = 477
349 ERR_BANLISTFULL = 478
350 ERR_NOPRIVILEGES = 481
351 ERR_CHANOPRIVSNEEDED = 482
352 ERR_CANTKILLSERVER = 483
354 ERR_UNIQOPPRIVSNEEDED = 485
356 ERR_UMODEUNKNOWNFLAG = 501
357 ERR_USERSDONTMATCH = 502