1 implementation module IRC
9 from Text import class Text(..), instance Text String
10 from StdMisc import undef
12 derive gPrint IRCCommands, IRCReplies, IRCErrors, (,), Maybe, (), Either
14 instance toString IRCCommands where
15 toString r = flip (+++) "\r\n" case r of
16 //ADMIN (Maybe String)
18 //CONNECT String Int (Maybe String)
22 //INVITE String 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)
28 //LINKS (Maybe (Maybe String, String))
30 //LUSERS (Maybe (String, Maybe String))
34 NICK n = join " " ["NICK", n]
36 //NOTICE String String
42 PRIVMSG dest msg = join " " ["PRIVMSG", dest, msg]
43 QUIT msg = join " " ["QUIT":maybeToList msg]
47 //SERVICE String String String String
48 //SERVLIST (Maybe (String, Maybe String))
49 //SQUERY String String
52 //STATS (Maybe (String, Maybe String))
53 //SUMMON String (Maybe (String, Maybe String))
55 //TOPIC String (Maybe String)
56 //TRACE (Maybe String)
57 USER login mode rn = join " " ["USER", login, toString mode, "*", ":", rn]
59 //USERS (Maybe String)
60 //VERSION (Maybe String)
63 //WHOIS (Maybe String) [String]
64 //WHOWAS (Maybe String) [String]
68 instance toString IRCReplies where toString r = printToString r
69 instance toString IRCErrors where toString r = printToString r
71 instance fromInt IRCReplies where
79 201 = RPL_TRACECONNECTING
80 202 = RPL_TRACEHANDSHAKE
81 203 = RPL_TRACEUNKNOWN
82 204 = RPL_TRACEOPERATOR
85 207 = RPL_TRACESERVICE
86 208 = RPL_TRACENEWTYPE
88 210 = RPL_TRACERECONNECT
89 211 = RPL_STATSLINKINFO
90 212 = RPL_STATSCOMMANDS
99 253 = RPL_LUSERUNKNOWN
100 254 = RPL_LUSERCHANNELS
115 312 = RPL_WHOISSERVER
116 313 = RPL_WHOISOPERATOR
121 319 = RPL_WHOISCHANNELS
125 324 = RPL_CHANNELMODEIS
132 347 = RPL_ENDOFINVITELIST
134 349 = RPL_ENDOFEXCEPTLIST
142 368 = RPL_ENDOFBANLIST
143 369 = RPL_ENDOFWHOWAS
151 383 = RPL_YOURESERVICE
159 instance toInt IRCReplies where
167 RPL_TRACECONNECTING = 201
168 RPL_TRACEHANDSHAKE = 202
169 RPL_TRACEUNKNOWN = 203
170 RPL_TRACEOPERATOR = 204
172 RPL_TRACESERVER = 206
173 RPL_TRACESERVICE = 207
174 RPL_TRACENEWTYPE = 208
176 RPL_TRACERECONNECT = 210
177 RPL_STATSLINKINFO = 211
178 RPL_STATSCOMMANDS = 212
182 RPL_SERVLISTEND = 234
183 RPL_STATSUPTIME = 242
185 RPL_LUSERCLIENT = 251
187 RPL_LUSERUNKNOWN = 253
188 RPL_LUSERCHANNELS = 254
203 RPL_WHOISSERVER = 312
204 RPL_WHOISOPERATOR = 313
209 RPL_WHOISCHANNELS = 319
213 RPL_CHANNELMODEIS = 324
220 RPL_ENDOFINVITELIST = 347
222 RPL_ENDOFEXCEPTLIST = 349
230 RPL_ENDOFBANLIST = 367
231 RPL_ENDOFWHOWAS = 369
239 RPL_YOURESERVICE = 383
246 instance fromInt IRCErrors where
247 fromInt r = case r of
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
257 411 = ERR_NORECIPIENT
258 412 = ERR_NOTEXTTOSEND
260 414 = ERR_WILDTOPLEVEL
262 421 = ERR_UNKNOWNCOMMAND
264 423 = ERR_NOADMININFO
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
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
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
297 485 = ERR_UNIQOPPRIVSNEEDED
299 501 = ERR_UMODEUNKNOWNFLAG
300 502 = ERR_USERSDONTMATCH
302 instance toInt IRCErrors where
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
313 ERR_NORECIPIENT = 411
314 ERR_NOTEXTTOSEND = 412
316 ERR_WILDTOPLEVEL = 414
318 ERR_UNKNOWNCOMMAND = 421
320 ERR_NOADMININFO = 423
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
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
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
353 ERR_UNIQOPPRIVSNEEDED = 485
355 ERR_UMODEUNKNOWNFLAG = 501
356 ERR_USERSDONTMATCH = 502