Commit 73e3f056 authored by Mart Lubbers's avatar Mart Lubbers Committed by GitHub
Browse files

Merge pull request #13 from clean-cloogle/pr-better-output

Pr better output
parents ad213068 ad6f64c9
......@@ -2,3 +2,5 @@ test
Clean System Files
cloogleirc
IRC
IRCBot
cloogle
......@@ -97,7 +97,7 @@ instance toInt IRCReplies, IRCErrors
RPL_ENDOFBANLIST | RPL_ENDOFWHOWAS | RPL_INFO | RPL_MOTD | RPL_ENDOFINFO |
RPL_MOTDSTART | RPL_ENDOFMOTD | RPL_YOUREOPER | RPL_REHASHING |
RPL_YOURESERVICE | RPL_TIME | RPL_USERSSTART | RPL_USERS | RPL_ENDOFUSERS |
RPL_NOUSERS
RPL_NOUSERS | RPL_UNKNOWN
:: IRCErrors = ERR_NOSUCHNICK | ERR_NOSUCHSERVER | ERR_NOSUCHCHANNEL |
ERR_CANNOTSENDTOCHAN | ERR_TOOMANYCHANNELS | ERR_WASNOSUCHNICK |
......@@ -115,4 +115,4 @@ instance toInt IRCReplies, IRCErrors
ERR_NOCHANMODES | ERR_BANLISTFULL | ERR_NOPRIVILEGES |
ERR_CHANOPRIVSNEEDED | ERR_CANTKILLSERVER | ERR_RESTRICTED |
ERR_UNIQOPPRIVSNEEDED | ERR_NOOPERHOST | ERR_UMODEUNKNOWNFLAG |
ERR_USERSDONTMATCH
ERR_USERSDONTMATCH | ERR_UNKNOWN
......@@ -100,7 +100,6 @@ parseCmd cs = fst $ gIRCParse{|*|} $ argfun $ split " " $ toString cs
| otherwise = [x:argfun xs]
//Reply
parseReply :: Parser Char IRCNumReply
parseReply = spaceParser
>>| (pMany (pToken '0') >>| pSome pDigit <* spaceParser)
......@@ -142,151 +141,290 @@ instance toString IRCErrors where toString r = printToString r
instance fromInt IRCReplies where
fromInt r = case r of
1 = RPL_WELCOME; 2 = RPL_YOURHOST;
3 = RPL_CREATED; 4 = RPL_MYINFO;
5 = RPL_BOUNCE; 200 = RPL_TRACELINK;
201 = RPL_TRACECONNECTING; 202 = RPL_TRACEHANDSHAKE;
203 = RPL_TRACEUNKNOWN; 204 = RPL_TRACEOPERATOR;
205 = RPL_TRACEUSER; 206 = RPL_TRACESERVER;
207 = RPL_TRACESERVICE; 208 = RPL_TRACENEWTYPE;
209 = RPL_TRACECLASS; 210 = RPL_TRACERECONNECT;
211 = RPL_STATSLINKINFO; 212 = RPL_STATSCOMMANDS;
219 = RPL_ENDOFSTATS; 221 = RPL_UMODEIS;
234 = RPL_SERVLIST; 235 = RPL_SERVLISTEND;
242 = RPL_STATSUPTIME; 243 = RPL_STATSOLINE;
251 = RPL_LUSERCLIENT; 252 = RPL_LUSEROP;
253 = RPL_LUSERUNKNOWN; 254 = RPL_LUSERCHANNELS;
255 = RPL_LUSERME; 256 = RPL_ADMINME;
257 = RPL_ADMINLOC1; 258 = RPL_ADMINLOC2;
259 = RPL_ADMINEMAIL; 261 = RPL_TRACELOG;
262 = RPL_TRACEEND; 263 = RPL_TRYAGAIN;
301 = RPL_AWAY; 302 = RPL_USERHOST;
303 = RPL_ISON; 304 = RPL_UNAWAY;
305 = RPL_NOWAWAY; 311 = RPL_WHOISUSER;
312 = RPL_WHOISSERVER; 313 = RPL_WHOISOPERATOR;
314 = RPL_WHOWASUSER; 315 = RPL_ENDOFWHO;
317 = RPL_WHOISIDLE; 318 = RPL_ENDOFWHOIS;
319 = RPL_WHOISCHANNELS; 321 = RPL_LISTSTART;
322 = RPL_LIST; 323 = RPL_LISTEND;
324 = RPL_CHANNELMODEIS; 325 = RPL_UNIQOPIS;
331 = RPL_NOTOPIC; 332 = RPL_TOPIC;
341 = RPL_INVITING; 342 = RPL_SUMMONING;
346 = RPL_INVITELIST; 347 = RPL_ENDOFINVITELIST;
348 = RPL_EXCEPTLIST; 349 = RPL_ENDOFEXCEPTLIST;
351 = RPL_VERSION; 352 = RPL_WHOREPLY;
353 = RPL_NAMREPLY; 364 = RPL_LINKS;
365 = RPL_ENDOFLINKS; 366 = RPL_ENDOFNAMES;
367 = RPL_BANLIST; 368 = RPL_ENDOFBANLIST;
369 = RPL_ENDOFWHOWAS; 371 = RPL_INFO;
372 = RPL_MOTD; 374 = RPL_ENDOFINFO;
375 = RPL_MOTDSTART; 376 = RPL_ENDOFMOTD;
381 = RPL_YOUREOPER; 382 = RPL_REHASHING;
383 = RPL_YOURESERVICE; 391 = RPL_TIME;
392 = RPL_USERSSTART; 393 = RPL_USERS;
394 = RPL_ENDOFUSERS; 395 = RPL_NOUSERS;
_ = abort $ "fromInt IRCReplies: " +++ toString r +++ " undef\n"
1 = RPL_WELCOME
2 = RPL_YOURHOST
3 = RPL_CREATED
4 = RPL_MYINFO
5 = RPL_BOUNCE
200 = RPL_TRACELINK
201 = RPL_TRACECONNECTING
202 = RPL_TRACEHANDSHAKE
203 = RPL_TRACEUNKNOWN
204 = RPL_TRACEOPERATOR
205 = RPL_TRACEUSER
206 = RPL_TRACESERVER
207 = RPL_TRACESERVICE
208 = RPL_TRACENEWTYPE
209 = RPL_TRACECLASS
210 = RPL_TRACERECONNECT
211 = RPL_STATSLINKINFO
212 = RPL_STATSCOMMANDS
219 = RPL_ENDOFSTATS
221 = RPL_UMODEIS
234 = RPL_SERVLIST
235 = RPL_SERVLISTEND
242 = RPL_STATSUPTIME
243 = RPL_STATSOLINE
251 = RPL_LUSERCLIENT
252 = RPL_LUSEROP
253 = RPL_LUSERUNKNOWN
254 = RPL_LUSERCHANNELS
255 = RPL_LUSERME
256 = RPL_ADMINME
257 = RPL_ADMINLOC1
258 = RPL_ADMINLOC2
259 = RPL_ADMINEMAIL
261 = RPL_TRACELOG
262 = RPL_TRACEEND
263 = RPL_TRYAGAIN
301 = RPL_AWAY
302 = RPL_USERHOST
303 = RPL_ISON
304 = RPL_UNAWAY
305 = RPL_NOWAWAY
311 = RPL_WHOISUSER
312 = RPL_WHOISSERVER
313 = RPL_WHOISOPERATOR
314 = RPL_WHOWASUSER
315 = RPL_ENDOFWHO
317 = RPL_WHOISIDLE
318 = RPL_ENDOFWHOIS
319 = RPL_WHOISCHANNELS
321 = RPL_LISTSTART
322 = RPL_LIST
323 = RPL_LISTEND
324 = RPL_CHANNELMODEIS
325 = RPL_UNIQOPIS
331 = RPL_NOTOPIC
332 = RPL_TOPIC
341 = RPL_INVITING
342 = RPL_SUMMONING
346 = RPL_INVITELIST
347 = RPL_ENDOFINVITELIST
348 = RPL_EXCEPTLIST
349 = RPL_ENDOFEXCEPTLIST
351 = RPL_VERSION
352 = RPL_WHOREPLY
353 = RPL_NAMREPLY
364 = RPL_LINKS
365 = RPL_ENDOFLINKS
366 = RPL_ENDOFNAMES
367 = RPL_BANLIST
368 = RPL_ENDOFBANLIST
369 = RPL_ENDOFWHOWAS
371 = RPL_INFO
372 = RPL_MOTD
374 = RPL_ENDOFINFO
375 = RPL_MOTDSTART
376 = RPL_ENDOFMOTD
381 = RPL_YOUREOPER
382 = RPL_REHASHING
383 = RPL_YOURESERVICE
391 = RPL_TIME
392 = RPL_USERSSTART
393 = RPL_USERS
394 = RPL_ENDOFUSERS
395 = RPL_NOUSERS
_ = RPL_UNKNOWN
instance toInt IRCReplies where
toInt r = case r of
RPL_WELCOME = 1; RPL_YOURHOST = 2;
RPL_CREATED = 3; RPL_MYINFO = 4;
RPL_BOUNCE = 5; RPL_TRACELINK = 200;
RPL_TRACECONNECTING = 201; RPL_TRACEHANDSHAKE = 202;
RPL_TRACEUNKNOWN = 203; RPL_TRACEOPERATOR = 204;
RPL_TRACEUSER = 205; RPL_TRACESERVER = 206;
RPL_TRACESERVICE = 207; RPL_TRACENEWTYPE = 208;
RPL_TRACECLASS = 209; RPL_TRACERECONNECT = 210;
RPL_STATSLINKINFO = 211; RPL_STATSCOMMANDS = 212;
RPL_ENDOFSTATS = 219; RPL_UMODEIS = 221;
RPL_SERVLIST = 234; RPL_SERVLISTEND = 234;
RPL_STATSUPTIME = 242; RPL_STATSOLINE = 243;
RPL_LUSERCLIENT = 251; RPL_LUSEROP = 252;
RPL_LUSERUNKNOWN = 253; RPL_LUSERCHANNELS = 254;
RPL_LUSERME = 255; RPL_ADMINME = 256;
RPL_ADMINLOC1 = 257; RPL_ADMINLOC2 = 258;
RPL_ADMINEMAIL = 259; RPL_TRACELOG = 261;
RPL_TRACEEND = 262; RPL_TRYAGAIN = 263;
RPL_AWAY = 301; RPL_USERHOST = 302;
RPL_ISON = 303; RPL_UNAWAY = 304;
RPL_NOWAWAY = 305; RPL_WHOISUSER = 311;
RPL_WHOISSERVER = 312; RPL_WHOISOPERATOR = 313;
RPL_WHOWASUSER = 314; RPL_ENDOFWHO = 315;
RPL_WHOISIDLE = 317; RPL_ENDOFWHOIS = 318;
RPL_WHOISCHANNELS = 319; RPL_LISTSTART = 321;
RPL_LIST = 322; RPL_LISTEND = 323;
RPL_CHANNELMODEIS = 324; RPL_UNIQOPIS = 325;
RPL_NOTOPIC = 331; RPL_TOPIC = 332;
RPL_INVITING = 341; RPL_SUMMONING = 342;
RPL_INVITELIST = 346; RPL_ENDOFINVITELIST = 347;
RPL_EXCEPTLIST = 348; RPL_ENDOFEXCEPTLIST = 349;
RPL_VERSION = 351; RPL_WHOREPLY = 352;
RPL_NAMREPLY = 353; RPL_LINKS = 364;
RPL_ENDOFLINKS = 365; RPL_ENDOFNAMES = 366;
RPL_BANLIST = 367; RPL_ENDOFBANLIST = 367;
RPL_ENDOFWHOWAS = 369; RPL_INFO = 371;
RPL_MOTD = 372; RPL_ENDOFINFO = 374;
RPL_MOTDSTART = 375; RPL_ENDOFMOTD = 376;
RPL_YOUREOPER = 381; RPL_REHASHING = 382;
RPL_YOURESERVICE = 383; RPL_TIME = 391;
RPL_USERSSTART = 392; RPL_USERS = 393;
RPL_ENDOFUSERS = 394; RPL_NOUSERS = 395;
RPL_WELCOME = 1
RPL_YOURHOST = 2
RPL_CREATED = 3
RPL_MYINFO = 4
RPL_BOUNCE = 5
RPL_TRACELINK = 200
RPL_TRACECONNECTING = 201
RPL_TRACEHANDSHAKE = 202
RPL_TRACEUNKNOWN = 203
RPL_TRACEOPERATOR = 204
RPL_TRACEUSER = 205
RPL_TRACESERVER = 206
RPL_TRACESERVICE = 207
RPL_TRACENEWTYPE = 208
RPL_TRACECLASS = 209
RPL_TRACERECONNECT = 210
RPL_STATSLINKINFO = 211
RPL_STATSCOMMANDS = 212
RPL_ENDOFSTATS = 219
RPL_UMODEIS = 221
RPL_SERVLIST = 234
RPL_SERVLISTEND = 234
RPL_STATSUPTIME = 242
RPL_STATSOLINE = 243
RPL_LUSERCLIENT = 251
RPL_LUSEROP = 252
RPL_LUSERUNKNOWN = 253
RPL_LUSERCHANNELS = 254
RPL_LUSERME = 255
RPL_ADMINME = 256
RPL_ADMINLOC1 = 257
RPL_ADMINLOC2 = 258
RPL_ADMINEMAIL = 259
RPL_TRACELOG = 261
RPL_TRACEEND = 262
RPL_TRYAGAIN = 263
RPL_AWAY = 301
RPL_USERHOST = 302
RPL_ISON = 303
RPL_UNAWAY = 304
RPL_NOWAWAY = 305
RPL_WHOISUSER = 311
RPL_WHOISSERVER = 312
RPL_WHOISOPERATOR = 313
RPL_WHOWASUSER = 314
RPL_ENDOFWHO = 315
RPL_WHOISIDLE = 317
RPL_ENDOFWHOIS = 318
RPL_WHOISCHANNELS = 319
RPL_LISTSTART = 321
RPL_LIST = 322
RPL_LISTEND = 323
RPL_CHANNELMODEIS = 324
RPL_UNIQOPIS = 325
RPL_NOTOPIC = 331
RPL_TOPIC = 332
RPL_INVITING = 341
RPL_SUMMONING = 342
RPL_INVITELIST = 346
RPL_ENDOFINVITELIST = 347
RPL_EXCEPTLIST = 348
RPL_ENDOFEXCEPTLIST = 349
RPL_VERSION = 351
RPL_WHOREPLY = 352
RPL_NAMREPLY = 353
RPL_LINKS = 364
RPL_ENDOFLINKS = 365
RPL_ENDOFNAMES = 366
RPL_BANLIST = 367
RPL_ENDOFBANLIST = 367
RPL_ENDOFWHOWAS = 369
RPL_INFO = 371
RPL_MOTD = 372
RPL_ENDOFINFO = 374
RPL_MOTDSTART = 375
RPL_ENDOFMOTD = 376
RPL_YOUREOPER = 381
RPL_REHASHING = 382
RPL_YOURESERVICE = 383
RPL_TIME = 391
RPL_USERSSTART = 392
RPL_USERS = 393
RPL_ENDOFUSERS = 394
RPL_NOUSERS = 395
RPL_UNKNOWN = 998
instance fromInt IRCErrors where
fromInt r = case r of
401 = ERR_NOSUCHNICK; 402 = ERR_NOSUCHSERVER;
403 = ERR_NOSUCHCHANNEL; 404 = ERR_CANNOTSENDTOCHAN;
405 = ERR_TOOMANYCHANNELS; 406 = ERR_WASNOSUCHNICK;
407 = ERR_TOOMANYTARGETS; 408 = ERR_NOSUCHSERVICE;
409 = ERR_NOORIGIN; 411 = ERR_NORECIPIENT;
412 = ERR_NOTEXTTOSEND; 413 = ERR_NOTOPLEVEL;
414 = ERR_WILDTOPLEVEL; 415 = ERR_BADMASK;
421 = ERR_UNKNOWNCOMMAND; 422 = ERR_NOMOTD;
423 = ERR_NOADMININFO; 424 = ERR_FILEERROR;
431 = ERR_NONICKNAMEGIVEN; 432 = ERR_ERRONEUSNICKNAME;
433 = ERR_NICKNAMEINUSE; 436 = ERR_NICKCOLLISION;
437 = ERR_UNAVAILRESOURCE; 441 = ERR_USERNOTINCHANNEL;
442 = ERR_NOTONCHANNEL; 443 = ERR_USERONCHANNEL;
444 = ERR_NOLOGIN; 445 = ERR_SUMMONDISABLED;
446 = ERR_USERSDISABLED; 451 = ERR_NOTREGISTERED;
461 = ERR_NEEDMOREPARAMS; 462 = ERR_ALREADYREGISTRED;
463 = ERR_NOPERMFORHOST; 464 = ERR_PASSWDMISMATCH;
465 = ERR_YOUREBANNEDCREEP; 466 = ERR_YOUWILLBEBANNED;
467 = ERR_KEYSET; 471 = ERR_CHANNELISFULL;
472 = ERR_UNKNOWNMODE; 473 = ERR_INVITEONLYCHAN;
474 = ERR_BANNEDFROMCHAN; 475 = ERR_BADCHANNELKEY;
476 = ERR_BADCHANMASK; 477 = ERR_NOCHANMODES;
478 = ERR_BANLISTFULL; 481 = ERR_NOPRIVILEGES;
482 = ERR_CHANOPRIVSNEEDED; 483 = ERR_CANTKILLSERVER;
484 = ERR_RESTRICTED; 485 = ERR_UNIQOPPRIVSNEEDED;
491 = ERR_NOOPERHOST; 501 = ERR_UMODEUNKNOWNFLAG;
502 = ERR_USERSDONTMATCH;
401 = ERR_NOSUCHNICK
402 = ERR_NOSUCHSERVER
403 = ERR_NOSUCHCHANNEL
404 = ERR_CANNOTSENDTOCHAN
405 = ERR_TOOMANYCHANNELS
406 = ERR_WASNOSUCHNICK
407 = ERR_TOOMANYTARGETS
408 = ERR_NOSUCHSERVICE
409 = ERR_NOORIGIN
411 = ERR_NORECIPIENT
412 = ERR_NOTEXTTOSEND
413 = ERR_NOTOPLEVEL
414 = ERR_WILDTOPLEVEL
415 = ERR_BADMASK
421 = ERR_UNKNOWNCOMMAND
422 = ERR_NOMOTD
423 = ERR_NOADMININFO
424 = ERR_FILEERROR
431 = ERR_NONICKNAMEGIVEN
432 = ERR_ERRONEUSNICKNAME
433 = ERR_NICKNAMEINUSE
436 = ERR_NICKCOLLISION
437 = ERR_UNAVAILRESOURCE
441 = ERR_USERNOTINCHANNEL
442 = ERR_NOTONCHANNEL
443 = ERR_USERONCHANNEL
444 = ERR_NOLOGIN
445 = ERR_SUMMONDISABLED
446 = ERR_USERSDISABLED
451 = ERR_NOTREGISTERED
461 = ERR_NEEDMOREPARAMS
462 = ERR_ALREADYREGISTRED
463 = ERR_NOPERMFORHOST
464 = ERR_PASSWDMISMATCH
465 = ERR_YOUREBANNEDCREEP
466 = ERR_YOUWILLBEBANNED
467 = ERR_KEYSET
471 = ERR_CHANNELISFULL
472 = ERR_UNKNOWNMODE
473 = ERR_INVITEONLYCHAN
474 = ERR_BANNEDFROMCHAN
475 = ERR_BADCHANNELKEY
476 = ERR_BADCHANMASK
477 = ERR_NOCHANMODES
478 = ERR_BANLISTFULL
481 = ERR_NOPRIVILEGES
482 = ERR_CHANOPRIVSNEEDED
483 = ERR_CANTKILLSERVER
484 = ERR_RESTRICTED
485 = ERR_UNIQOPPRIVSNEEDED
491 = ERR_NOOPERHOST
501 = ERR_UMODEUNKNOWNFLAG
502 = ERR_USERSDONTMATCH
_ = ERR_UNKNOWN
instance toInt IRCErrors where
toInt r = case r of
ERR_NOSUCHNICK = 401; ERR_NOSUCHSERVER = 402;
ERR_NOSUCHCHANNEL = 403; ERR_CANNOTSENDTOCHAN = 404;
ERR_TOOMANYCHANNELS = 405; ERR_WASNOSUCHNICK = 406;
ERR_TOOMANYTARGETS = 407; ERR_NOSUCHSERVICE = 408;
ERR_NOORIGIN = 409; ERR_NORECIPIENT = 411;
ERR_NOTEXTTOSEND = 412; ERR_NOTOPLEVEL = 413;
ERR_WILDTOPLEVEL = 414; ERR_BADMASK = 415;
ERR_UNKNOWNCOMMAND = 421; ERR_NOMOTD = 422;
ERR_NOADMININFO = 423; ERR_FILEERROR = 424;
ERR_NONICKNAMEGIVEN = 431; ERR_ERRONEUSNICKNAME = 432;
ERR_NICKNAMEINUSE = 433; ERR_NICKCOLLISION = 436;
ERR_UNAVAILRESOURCE = 437; ERR_USERNOTINCHANNEL = 441;
ERR_NOTONCHANNEL = 442; ERR_USERONCHANNEL = 443;
ERR_NOLOGIN = 444; ERR_SUMMONDISABLED = 445;
ERR_USERSDISABLED = 446; ERR_NOTREGISTERED = 451;
ERR_NEEDMOREPARAMS = 461; ERR_ALREADYREGISTRED = 462;
ERR_NOPERMFORHOST = 463; ERR_PASSWDMISMATCH = 464;
ERR_YOUREBANNEDCREEP = 465; ERR_YOUWILLBEBANNED = 466;
ERR_KEYSET = 467; ERR_CHANNELISFULL = 471;
ERR_UNKNOWNMODE = 472; ERR_INVITEONLYCHAN = 473;
ERR_BANNEDFROMCHAN = 474; ERR_BADCHANNELKEY = 475;
ERR_BADCHANMASK = 476; ERR_NOCHANMODES = 477;
ERR_BANLISTFULL = 478; ERR_NOPRIVILEGES = 481;
ERR_CHANOPRIVSNEEDED = 482; ERR_CANTKILLSERVER = 483;
ERR_RESTRICTED = 484; ERR_UNIQOPPRIVSNEEDED = 485;
ERR_NOOPERHOST = 491; ERR_UMODEUNKNOWNFLAG = 501;
ERR_USERSDONTMATCH = 502;
ERR_NOSUCHNICK = 401
ERR_NOSUCHSERVER = 402
ERR_NOSUCHCHANNEL = 403
ERR_CANNOTSENDTOCHAN = 404
ERR_TOOMANYCHANNELS = 405
ERR_WASNOSUCHNICK = 406
ERR_TOOMANYTARGETS = 407
ERR_NOSUCHSERVICE = 408
ERR_NOORIGIN = 409
ERR_NORECIPIENT = 411
ERR_NOTEXTTOSEND = 412
ERR_NOTOPLEVEL = 413
ERR_WILDTOPLEVEL = 414
ERR_BADMASK = 415
ERR_UNKNOWNCOMMAND = 421
ERR_NOMOTD = 422
ERR_NOADMININFO = 423
ERR_FILEERROR = 424
ERR_NONICKNAMEGIVEN = 431
ERR_ERRONEUSNICKNAME = 432
ERR_NICKNAMEINUSE = 433
ERR_NICKCOLLISION = 436
ERR_UNAVAILRESOURCE = 437
ERR_USERNOTINCHANNEL = 441
ERR_NOTONCHANNEL = 442
ERR_USERONCHANNEL = 443
ERR_NOLOGIN = 444
ERR_SUMMONDISABLED = 445
ERR_USERSDISABLED = 446
ERR_NOTREGISTERED = 451
ERR_NEEDMOREPARAMS = 461
ERR_ALREADYREGISTRED = 462
ERR_NOPERMFORHOST = 463
ERR_PASSWDMISMATCH = 464
ERR_YOUREBANNEDCREEP = 465
ERR_YOUWILLBEBANNED = 466
ERR_KEYSET = 467
ERR_CHANNELISFULL = 471
ERR_UNKNOWNMODE = 472
ERR_INVITEONLYCHAN = 473
ERR_BANNEDFROMCHAN = 474
ERR_BADCHANNELKEY = 475
ERR_BADCHANMASK = 476
ERR_NOCHANMODES = 477
ERR_BANLISTFULL = 478
ERR_NOPRIVILEGES = 481
ERR_CHANOPRIVSNEEDED = 482
ERR_CANTKILLSERVER = 483
ERR_RESTRICTED = 484
ERR_UNIQOPPRIVSNEEDED = 485
ERR_NOOPERHOST = 491
ERR_UMODEUNKNOWNFLAG = 501
ERR_USERSDONTMATCH = 502
ERR_UNKNOWN = 999
......@@ -22,6 +22,6 @@ from Data.Error import :: MaybeErrorString, :: MaybeError
* If the response is nothing the connection is closed
* All items in the list are sent back
* param: World
* return: Maybe the state together with the new world
* return: Maybe an error, the state and the new world
*/
bot :: (String, Int) [IRCMessage] [IRCMessage] a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString a, *World)
bot :: (String, Int) [IRCMessage] [IRCMessage] .a (IRCMessage -> (.a -> .(*World -> *(Maybe [IRCMessage], .a, *World)))) *World -> *(Maybe String, .a, *World)
......@@ -14,29 +14,31 @@ import StdBool
TIMEOUT :== Just 1000
bot :: (String, Int) [IRCMessage] [IRCMessage] a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString a, *World)
bot :: (String, Int) [IRCMessage] [IRCMessage] .a (IRCMessage -> (.a -> .(*World -> *(Maybe [IRCMessage], .a, *World)))) *World -> *(Maybe String, .a, *World)
bot (host, port) start end state bot w
//Lookup hostname
# (ip, w) = lookupIPAddress host w
| isNothing ip = (Error $ "DNS lookup for " +++ host +++ " failed", w)
| isNothing ip
= (Just $ "DNS lookup for " +++ host +++ " failed", state, w)
//Connect
# (rpt,chan,w) = connectTCP_MT TIMEOUT (fromJust ip, port) w
| rpt == TR_Expired = (Error $ "Connection to " +++ host +++ " timed out", w)
| rpt == TR_NoSuccess = (Error $ "Could not connect to " +++ host, w)
| rpt == TR_Expired
= (Just $ "Connection to " +++ host +++ " timed out", state, w)
| rpt == TR_NoSuccess
= (Just $ "Could not connect to " +++ host, state, w)
// Send startup commands
# (merr, chan, w) = send (map toString start) (fromJust chan) w
| isError merr = (Error $ fromError merr, w)
| isError merr = (Just $ fromError merr, state, w)
//Start processing function
# (mer, chan, state, w) = process chan "" state bot w
| isError mer = (Error $ fromError mer, w)
| isError mer = (Just $ fromError mer, state, w)
// Send shutdown commands
# (merr, {rChannel,sChannel}, w) = send (map toString end) chan w
| isError merr = (Error $ fromError merr, w)
| isError merr = (Just $ fromError merr, state, w)
//Close channels
= (Ok state, closeChannel sChannel (closeRChannel rChannel w))
= (Nothing, state, closeChannel sChannel (closeRChannel rChannel w))
import StdDebug,StdMisc
process :: TCP_DuplexChannel String a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString (), TCP_DuplexChannel, a, *World)
process :: TCP_DuplexChannel String .a (IRCMessage -> (.a -> .(*World -> *(Maybe [IRCMessage], .a, *World)))) *World -> (MaybeErrorString (), TCP_DuplexChannel, .a, *World)
process chan acc state bot w
//See if we have a message
= case split "\r\n" acc of
......@@ -51,7 +53,6 @@ process chan acc state bot w
//We have a successfull split and therefore we process at least one message
[m:xs]
# acc = join "\r\n" xs
| not (trace_tn $ "Full message: '" +++ m +++ "'") = undef
= case parseIRCMessage $ m +++ "\r\n" of
(Left err) = (Error $ "IRC Parsing error: " +++ join "\n" err, chan, state, w)
(Right msg)
......
CLEAN_HOME?=/opt/clean
CLM:=clm
override CLMFLAGS+=-nt -dynamics
override CLMFLAGS+=-nt -dynamics -lat -d -nsa -nou
GCCVERSIONGTEQ6:=$(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 6)
ifeq "$(GCCVERSIONGTEQ6)" "1"
override CLMFLAGS+=-l -no-pie
......@@ -15,7 +15,7 @@ CLMLIBS:=\
-I $(CLEAN_HOME)/lib/Dynamics\
-I ./libcloogle
BINARIES:=IRC cloogleirc #test
BINARIES:=IRC IRCBot cloogleirc #test
all: $(BINARIES)
......
......@@ -15,6 +15,7 @@ import Internet.HTTP
import Text.JSON
import Text.URI
import System.Time
import Control.Applicative
import qualified Control.Monad as CM
......@@ -32,8 +33,7 @@ import TCPIP
import IRC
import IRCBot
TIMEOUT :== Just 10000
SERVER :== "irc.freenode.net"
import StdMisc, StdDebug
shorten :: String *World -> (String, *World)
shorten s w
......@@ -94,9 +94,7 @@ cloogle data w
= join "\n" (map maxWidth lines)
maxWidth :: String -> String
maxWidth s
| size s > 80 = subString 0 77 s + "..."
= s
maxWidth s = if (size s > 80) (subString 0 77 s + "...") s
:: BotSettings =
{ bs_nick :: String
......@@ -104,15 +102,19 @@ cloogle data w
, bs_autojoin :: [String]
, bs_port :: Int
, bs_server :: String
, bs_strftime :: String
}
Start :: *World -> (MaybeErrorString (), *World)
Start :: *World -> (Maybe String, *World)
Start w
# ([arg0:args], w) = getCommandLine w
# (io, w) = stdio w
# io = io <<< "\n"
# bs = parseCLI args