098c7590de74ad4085685cffba7aae3becc350a6
[cloogle-irc.git] / IRC.icl
1 implementation module IRC
2
3 import StdList
4 import GenPrint
5 import StdOverloaded
6 import Data.Maybe
7 import Data.Either
8 import StdFunc
9 import StdString
10 from Text import class Text(..), instance Text String
11 from StdMisc import undef
12
13 derive gPrint IRCCommands, IRCReplies, IRCErrors, (,), Maybe, (), Either
14
15 instance toString IRCCommands where
16 toString r = flip (+++) "\r\n" case r of
17 //ADMIN (Maybe String)
18 //AWAY String
19 //CONNECT String Int (Maybe String)
20 //DIE
21 //ERROR String
22 //INFO (Maybe String)
23 //INVITE String String
24 //ISON [String]
25 JOIN chs = "JOIN " +++ (if (isEmpty chs) "0"
26 (join ", " [join " " [ch:maybeToList mk]\\(ch, mk)<-chs]))
27 //KICK String String (Maybe String)
28 //KILL String String
29 //LINKS (Maybe (Maybe String, String))
30 //LIST [String]
31 //LUSERS (Maybe (String, Maybe String))
32 //MODE String
33 //MOTD (Maybe String)
34 //NAMES [String]
35 NICK n = join " " ["NICK", n]
36 //NJOIN
37 //NOTICE String String
38 //OPER String String
39 //PART [String]
40 //PASS 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]
45 //REHASH
46 //RESTART
47 //SERVER
48 //SERVICE String String String String
49 //SERVLIST (Maybe (String, Maybe String))
50 //SQUERY String String
51 //SQUIRT
52 //SQUIT String String
53 //STATS (Maybe (String, Maybe String))
54 //SUMMON String (Maybe (String, Maybe String))
55 //TIME (Maybe String)
56 //TOPIC String (Maybe String)
57 //TRACE (Maybe String)
58 USER login mode rn = join " " ["USER", login, toString mode, "*", ":"+++rn]
59 //USERHOST [String]
60 //USERS (Maybe String)
61 //VERSION (Maybe String)
62 //WALLOPS String
63 //WHO (Maybe String)
64 //WHOIS (Maybe String) [String]
65 //WHOWAS (Maybe String) [String]
66 _ = printToString r
67
68
69 instance toString IRCReplies where toString r = printToString r
70 instance toString IRCErrors where toString r = printToString r
71
72 instance fromInt IRCReplies where
73 fromInt r = case r of
74 1 = RPL_WELCOME
75 2 = RPL_YOURHOST
76 3 = RPL_CREATED
77 4 = RPL_MYINFO
78 5 = RPL_BOUNCE
79 200 = RPL_TRACELINK
80 201 = RPL_TRACECONNECTING
81 202 = RPL_TRACEHANDSHAKE
82 203 = RPL_TRACEUNKNOWN
83 204 = RPL_TRACEOPERATOR
84 205 = RPL_TRACEUSER
85 206 = RPL_TRACESERVER
86 207 = RPL_TRACESERVICE
87 208 = RPL_TRACENEWTYPE
88 209 = RPL_TRACECLASS
89 210 = RPL_TRACERECONNECT
90 211 = RPL_STATSLINKINFO
91 212 = RPL_STATSCOMMANDS
92 219 = RPL_ENDOFSTATS
93 221 = RPL_UMODEIS
94 234 = RPL_SERVLIST
95 235 = RPL_SERVLISTEND
96 242 = RPL_STATSUPTIME
97 243 = RPL_STATSOLINE
98 251 = RPL_LUSERCLIENT
99 252 = RPL_LUSEROP
100 253 = RPL_LUSERUNKNOWN
101 254 = RPL_LUSERCHANNELS
102 255 = RPL_LUSERME
103 256 = RPL_ADMINME
104 257 = RPL_ADMINLOC1
105 258 = RPL_ADMINLOC2
106 259 = RPL_ADMINEMAIL
107 261 = RPL_TRACELOG
108 262 = RPL_TRACEEND
109 263 = RPL_TRYAGAIN
110 301 = RPL_AWAY
111 302 = RPL_USERHOST
112 303 = RPL_ISON
113 304 = RPL_UNAWAY
114 305 = RPL_NOWAWAY
115 311 = RPL_WHOISUSER
116 312 = RPL_WHOISSERVER
117 313 = RPL_WHOISOPERATOR
118 314 = RPL_WHOWASUSER
119 315 = RPL_ENDOFWHO
120 317 = RPL_WHOISIDLE
121 318 = RPL_ENDOFWHOIS
122 319 = RPL_WHOISCHANNELS
123 321 = RPL_LISTSTART
124 322 = RPL_LIST
125 323 = RPL_LISTEND
126 324 = RPL_CHANNELMODEIS
127 325 = RPL_UNIQOPIS
128 331 = RPL_NOTOPIC
129 332 = RPL_TOPIC
130 341 = RPL_INVITING
131 342 = RPL_SUMMONING
132 346 = RPL_INVITELIST
133 347 = RPL_ENDOFINVITELIST
134 348 = RPL_EXCEPTLIST
135 349 = RPL_ENDOFEXCEPTLIST
136 351 = RPL_VERSION
137 352 = RPL_WHOREPLY
138 353 = RPL_NAMREPLY
139 364 = RPL_LINKS
140 365 = RPL_ENDOFLINKS
141 366 = RPL_ENDOFNAMES
142 367 = RPL_BANLIST
143 368 = RPL_ENDOFBANLIST
144 369 = RPL_ENDOFWHOWAS
145 371 = RPL_INFO
146 372 = RPL_MOTD
147 374 = RPL_ENDOFINFO
148 375 = RPL_MOTDSTART
149 376 = RPL_ENDOFMOTD
150 381 = RPL_YOUREOPER
151 382 = RPL_REHASHING
152 383 = RPL_YOURESERVICE
153 391 = RPL_TIME
154 392 = RPL_USERSSTART
155 393 = RPL_USERS
156 394 = RPL_ENDOFUSERS
157 395 = RPL_NOUSERS
158 _ = undef
159
160 instance toInt IRCReplies where
161 toInt r = case r of
162 RPL_WELCOME = 1
163 RPL_YOURHOST = 2
164 RPL_CREATED = 3
165 RPL_MYINFO = 4
166 RPL_BOUNCE = 5
167 RPL_TRACELINK = 200
168 RPL_TRACECONNECTING = 201
169 RPL_TRACEHANDSHAKE = 202
170 RPL_TRACEUNKNOWN = 203
171 RPL_TRACEOPERATOR = 204
172 RPL_TRACEUSER = 205
173 RPL_TRACESERVER = 206
174 RPL_TRACESERVICE = 207
175 RPL_TRACENEWTYPE = 208
176 RPL_TRACECLASS = 209
177 RPL_TRACERECONNECT = 210
178 RPL_STATSLINKINFO = 211
179 RPL_STATSCOMMANDS = 212
180 RPL_ENDOFSTATS = 219
181 RPL_UMODEIS = 221
182 RPL_SERVLIST = 234
183 RPL_SERVLISTEND = 234
184 RPL_STATSUPTIME = 242
185 RPL_STATSOLINE = 243
186 RPL_LUSERCLIENT = 251
187 RPL_LUSEROP = 252
188 RPL_LUSERUNKNOWN = 253
189 RPL_LUSERCHANNELS = 254
190 RPL_LUSERME = 255
191 RPL_ADMINME = 256
192 RPL_ADMINLOC1 = 257
193 RPL_ADMINLOC2 = 258
194 RPL_ADMINEMAIL = 259
195 RPL_TRACELOG = 261
196 RPL_TRACEEND = 262
197 RPL_TRYAGAIN = 263
198 RPL_AWAY = 301
199 RPL_USERHOST = 302
200 RPL_ISON = 303
201 RPL_UNAWAY = 304
202 RPL_NOWAWAY = 305
203 RPL_WHOISUSER = 311
204 RPL_WHOISSERVER = 312
205 RPL_WHOISOPERATOR = 313
206 RPL_WHOWASUSER = 314
207 RPL_ENDOFWHO = 315
208 RPL_WHOISIDLE = 317
209 RPL_ENDOFWHOIS = 318
210 RPL_WHOISCHANNELS = 319
211 RPL_LISTSTART = 321
212 RPL_LIST = 322
213 RPL_LISTEND = 323
214 RPL_CHANNELMODEIS = 324
215 RPL_UNIQOPIS = 325
216 RPL_NOTOPIC = 331
217 RPL_TOPIC = 332
218 RPL_INVITING = 341
219 RPL_SUMMONING = 342
220 RPL_INVITELIST = 346
221 RPL_ENDOFINVITELIST = 347
222 RPL_EXCEPTLIST = 348
223 RPL_ENDOFEXCEPTLIST = 349
224 RPL_VERSION = 351
225 RPL_WHOREPLY = 352
226 RPL_NAMREPLY = 353
227 RPL_LINKS = 364
228 RPL_ENDOFLINKS = 365
229 RPL_ENDOFNAMES = 366
230 RPL_BANLIST = 367
231 RPL_ENDOFBANLIST = 367
232 RPL_ENDOFWHOWAS = 369
233 RPL_INFO = 371
234 RPL_MOTD = 372
235 RPL_ENDOFINFO = 374
236 RPL_MOTDSTART = 375
237 RPL_ENDOFMOTD = 376
238 RPL_YOUREOPER = 381
239 RPL_REHASHING = 382
240 RPL_YOURESERVICE = 383
241 RPL_TIME = 391
242 RPL_USERSSTART = 392
243 RPL_USERS = 393
244 RPL_ENDOFUSERS = 394
245 RPL_NOUSERS = 395
246
247 instance fromInt IRCErrors where
248 fromInt r = case r of
249 401 = ERR_NOSUCHNICK
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
257 409 = ERR_NOORIGIN
258 411 = ERR_NORECIPIENT
259 412 = ERR_NOTEXTTOSEND
260 413 = ERR_NOTOPLEVEL
261 414 = ERR_WILDTOPLEVEL
262 415 = ERR_BADMASK
263 421 = ERR_UNKNOWNCOMMAND
264 422 = ERR_NOMOTD
265 423 = ERR_NOADMININFO
266 424 = ERR_FILEERROR
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
275 444 = ERR_NOLOGIN
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
285 467 = ERR_KEYSET
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
297 484 = ERR_RESTRICTED
298 485 = ERR_UNIQOPPRIVSNEEDED
299 491 = ERR_NOOPERHOST
300 501 = ERR_UMODEUNKNOWNFLAG
301 502 = ERR_USERSDONTMATCH
302
303 instance toInt IRCErrors where
304 toInt r = case r of
305 ERR_NOSUCHNICK = 401
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
313 ERR_NOORIGIN = 409
314 ERR_NORECIPIENT = 411
315 ERR_NOTEXTTOSEND = 412
316 ERR_NOTOPLEVEL = 413
317 ERR_WILDTOPLEVEL = 414
318 ERR_BADMASK = 415
319 ERR_UNKNOWNCOMMAND = 421
320 ERR_NOMOTD = 422
321 ERR_NOADMININFO = 423
322 ERR_FILEERROR = 424
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
331 ERR_NOLOGIN = 444
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
341 ERR_KEYSET = 467
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
353 ERR_RESTRICTED = 484
354 ERR_UNIQOPPRIVSNEEDED = 485
355 ERR_NOOPERHOST = 491
356 ERR_UMODEUNKNOWNFLAG = 501
357 ERR_USERSDONTMATCH = 502