2012-04-18 03:49:14 +02:00
|
|
|
package irc
|
|
|
|
|
2014-02-09 17:48:11 +01:00
|
|
|
import (
|
|
|
|
"errors"
|
2014-02-09 21:13:09 +01:00
|
|
|
"time"
|
2014-02-09 17:48:11 +01:00
|
|
|
)
|
|
|
|
|
2014-02-08 22:18:11 +01:00
|
|
|
var (
|
|
|
|
DEBUG_NET = false
|
|
|
|
DEBUG_CLIENT = false
|
|
|
|
DEBUG_CHANNEL = false
|
|
|
|
DEBUG_SERVER = false
|
2014-02-09 17:48:11 +01:00
|
|
|
|
|
|
|
ErrAlreadyDestroyed = errors.New("already destroyed")
|
2014-02-08 22:18:11 +01:00
|
|
|
)
|
|
|
|
|
2012-04-18 03:49:14 +02:00
|
|
|
const (
|
2014-02-10 04:41:00 +01:00
|
|
|
VERSION = "1.0.0"
|
2014-02-09 21:13:09 +01:00
|
|
|
CRLF = "\r\n"
|
|
|
|
MAX_REPLY_LEN = 512 - len(CRLF)
|
|
|
|
|
2014-02-13 22:19:26 +01:00
|
|
|
LOGIN_TIMEOUT = time.Minute / 2 // how long the client has to login
|
|
|
|
IDLE_TIMEOUT = time.Minute // how long before a client is considered idle
|
|
|
|
QUIT_TIMEOUT = time.Minute // how long after idle before a client is kicked
|
2012-04-18 03:49:14 +02:00
|
|
|
|
2012-12-09 22:47:02 +01:00
|
|
|
// numeric codes
|
2014-02-15 04:25:14 +01:00
|
|
|
RPL_WELCOME Numeric = 1
|
|
|
|
RPL_YOURHOST Numeric = 2
|
|
|
|
RPL_CREATED Numeric = 3
|
|
|
|
RPL_MYINFO Numeric = 4
|
|
|
|
RPL_BOUNCE Numeric = 5
|
|
|
|
RPL_TRACELINK Numeric = 200
|
|
|
|
RPL_TRACECONNECTING Numeric = 201
|
|
|
|
RPL_TRACEHANDSHAKE Numeric = 202
|
|
|
|
RPL_TRACEUNKNOWN Numeric = 203
|
|
|
|
RPL_TRACEOPERATOR Numeric = 204
|
|
|
|
RPL_TRACEUSER Numeric = 205
|
|
|
|
RPL_TRACESERVER Numeric = 206
|
|
|
|
RPL_TRACESERVICE Numeric = 207
|
|
|
|
RPL_TRACENEWTYPE Numeric = 208
|
|
|
|
RPL_TRACECLASS Numeric = 209
|
|
|
|
RPL_TRACERECONNECT Numeric = 210
|
|
|
|
RPL_STATSLINKINFO Numeric = 211
|
|
|
|
RPL_STATSCOMMANDS Numeric = 212
|
|
|
|
RPL_ENDOFSTATS Numeric = 219
|
|
|
|
RPL_UMODEIS Numeric = 221
|
|
|
|
RPL_SERVLIST Numeric = 234
|
|
|
|
RPL_SERVLISTEND Numeric = 235
|
|
|
|
RPL_STATSUPTIME Numeric = 242
|
|
|
|
RPL_STATSOLINE Numeric = 243
|
|
|
|
RPL_LUSERCLIENT Numeric = 251
|
|
|
|
RPL_LUSEROP Numeric = 252
|
|
|
|
RPL_LUSERUNKNOWN Numeric = 253
|
|
|
|
RPL_LUSERCHANNELS Numeric = 254
|
|
|
|
RPL_LUSERME Numeric = 255
|
|
|
|
RPL_ADMINME Numeric = 256
|
|
|
|
RPL_ADMINLOC1 Numeric = 257
|
|
|
|
RPL_ADMINLOC2 Numeric = 258
|
|
|
|
RPL_ADMINEMAIL Numeric = 259
|
|
|
|
RPL_TRACELOG Numeric = 261
|
|
|
|
RPL_TRACEEND Numeric = 262
|
|
|
|
RPL_TRYAGAIN Numeric = 263
|
|
|
|
RPL_AWAY Numeric = 301
|
|
|
|
RPL_USERHOST Numeric = 302
|
|
|
|
RPL_ISON Numeric = 303
|
|
|
|
RPL_UNAWAY Numeric = 305
|
|
|
|
RPL_NOWAWAY Numeric = 306
|
|
|
|
RPL_WHOISUSER Numeric = 311
|
|
|
|
RPL_WHOISSERVER Numeric = 312
|
|
|
|
RPL_WHOISOPERATOR Numeric = 313
|
|
|
|
RPL_WHOWASUSER Numeric = 314
|
|
|
|
RPL_ENDOFWHO Numeric = 315
|
|
|
|
RPL_WHOISIDLE Numeric = 317
|
|
|
|
RPL_ENDOFWHOIS Numeric = 318
|
|
|
|
RPL_WHOISCHANNELS Numeric = 319
|
|
|
|
RPL_LIST Numeric = 322
|
|
|
|
RPL_LISTEND Numeric = 323
|
|
|
|
RPL_CHANNELMODEIS Numeric = 324
|
|
|
|
RPL_UNIQOPIS Numeric = 325
|
|
|
|
RPL_NOTOPIC Numeric = 331
|
|
|
|
RPL_TOPIC Numeric = 332
|
|
|
|
RPL_INVITING Numeric = 341
|
|
|
|
RPL_SUMMONING Numeric = 342
|
|
|
|
RPL_INVITELIST Numeric = 346
|
|
|
|
RPL_ENDOFINVITELIST Numeric = 347
|
|
|
|
RPL_EXCEPTLIST Numeric = 348
|
|
|
|
RPL_ENDOFEXCEPTLIST Numeric = 349
|
|
|
|
RPL_VERSION Numeric = 351
|
|
|
|
RPL_WHOREPLY Numeric = 352
|
|
|
|
RPL_NAMREPLY Numeric = 353
|
|
|
|
RPL_LINKS Numeric = 364
|
|
|
|
RPL_ENDOFLINKS Numeric = 365
|
|
|
|
RPL_ENDOFNAMES Numeric = 366
|
|
|
|
RPL_BANLIST Numeric = 367
|
|
|
|
RPL_ENDOFBANLIST Numeric = 368
|
|
|
|
RPL_ENDOFWHOWAS Numeric = 369
|
|
|
|
RPL_INFO Numeric = 371
|
|
|
|
RPL_MOTD Numeric = 372
|
|
|
|
RPL_ENDOFINFO Numeric = 374
|
|
|
|
RPL_MOTDSTART Numeric = 375
|
|
|
|
RPL_ENDOFMOTD Numeric = 376
|
|
|
|
RPL_YOUREOPER Numeric = 381
|
|
|
|
RPL_REHASHING Numeric = 382
|
|
|
|
RPL_YOURESERVICE Numeric = 383
|
|
|
|
RPL_TIME Numeric = 391
|
|
|
|
RPL_USERSSTART Numeric = 392
|
|
|
|
RPL_USERS Numeric = 393
|
|
|
|
RPL_ENDOFUSERS Numeric = 394
|
|
|
|
RPL_NOUSERS Numeric = 395
|
|
|
|
ERR_NOSUCHNICK Numeric = 401
|
|
|
|
ERR_NOSUCHSERVER Numeric = 402
|
|
|
|
ERR_NOSUCHCHANNEL Numeric = 403
|
|
|
|
ERR_CANNOTSENDTOCHAN Numeric = 404
|
|
|
|
ERR_TOOMANYCHANNELS Numeric = 405
|
|
|
|
ERR_WASNOSUCHNICK Numeric = 406
|
|
|
|
ERR_TOOMANYTARGETS Numeric = 407
|
|
|
|
ERR_NOSUCHSERVICE Numeric = 408
|
|
|
|
ERR_NOORIGIN Numeric = 409
|
|
|
|
ERR_NORECIPIENT Numeric = 411
|
|
|
|
ERR_NOTEXTTOSEND Numeric = 412
|
|
|
|
ERR_NOTOPLEVEL Numeric = 413
|
|
|
|
ERR_WILDTOPLEVEL Numeric = 414
|
|
|
|
ERR_BADMASK Numeric = 415
|
|
|
|
ERR_UNKNOWNCOMMAND Numeric = 421
|
|
|
|
ERR_NOMOTD Numeric = 422
|
|
|
|
ERR_NOADMININFO Numeric = 423
|
|
|
|
ERR_FILEERROR Numeric = 424
|
|
|
|
ERR_NONICKNAMEGIVEN Numeric = 431
|
|
|
|
ERR_ERRONEUSNICKNAME Numeric = 432
|
|
|
|
ERR_NICKNAMEINUSE Numeric = 433
|
|
|
|
ERR_NICKCOLLISION Numeric = 436
|
|
|
|
ERR_UNAVAILRESOURCE Numeric = 437
|
|
|
|
ERR_USERNOTINCHANNEL Numeric = 441
|
|
|
|
ERR_NOTONCHANNEL Numeric = 442
|
|
|
|
ERR_USERONCHANNEL Numeric = 443
|
|
|
|
ERR_NOLOGIN Numeric = 444
|
|
|
|
ERR_SUMMONDISABLED Numeric = 445
|
|
|
|
ERR_USERSDISABLED Numeric = 446
|
|
|
|
ERR_NOTREGISTERED Numeric = 451
|
|
|
|
ERR_NEEDMOREPARAMS Numeric = 461
|
|
|
|
ERR_ALREADYREGISTRED Numeric = 462
|
|
|
|
ERR_NOPERMFORHOST Numeric = 463
|
|
|
|
ERR_PASSWDMISMATCH Numeric = 464
|
|
|
|
ERR_YOUREBANNEDCREEP Numeric = 465
|
|
|
|
ERR_YOUWILLBEBANNED Numeric = 466
|
|
|
|
ERR_KEYSET Numeric = 467
|
|
|
|
ERR_CHANNELISFULL Numeric = 471
|
|
|
|
ERR_UNKNOWNMODE Numeric = 472
|
|
|
|
ERR_INVITEONLYCHAN Numeric = 473
|
|
|
|
ERR_BANNEDFROMCHAN Numeric = 474
|
|
|
|
ERR_BADCHANNELKEY Numeric = 475
|
|
|
|
ERR_BADCHANMASK Numeric = 476
|
|
|
|
ERR_NOCHANMODES Numeric = 477
|
|
|
|
ERR_BANLISTFULL Numeric = 478
|
|
|
|
ERR_NOPRIVILEGES Numeric = 481
|
|
|
|
ERR_CHANOPRIVSNEEDED Numeric = 482
|
|
|
|
ERR_CANTKILLSERVER Numeric = 483
|
|
|
|
ERR_RESTRICTED Numeric = 484
|
|
|
|
ERR_UNIQOPPRIVSNEEDED Numeric = 485
|
|
|
|
ERR_NOOPERHOST Numeric = 491
|
|
|
|
ERR_UMODEUNKNOWNFLAG Numeric = 501
|
|
|
|
ERR_USERSDONTMATCH Numeric = 502
|
2014-02-09 07:06:10 +01:00
|
|
|
|
2014-02-09 07:42:14 +01:00
|
|
|
Add ModeOp = '+'
|
|
|
|
List ModeOp = '='
|
|
|
|
Remove ModeOp = '-'
|
2014-02-09 07:06:10 +01:00
|
|
|
|
|
|
|
Away UserMode = 'a'
|
|
|
|
Invisible UserMode = 'i'
|
|
|
|
LocalOperator UserMode = 'O'
|
2014-02-09 07:42:14 +01:00
|
|
|
Operator UserMode = 'o'
|
|
|
|
Restricted UserMode = 'r'
|
2014-02-09 07:06:10 +01:00
|
|
|
ServerNotice UserMode = 's'
|
2014-02-09 07:42:14 +01:00
|
|
|
WallOps UserMode = 'w'
|
2014-02-09 07:06:10 +01:00
|
|
|
|
2014-02-16 04:49:20 +01:00
|
|
|
Anonymous ChannelMode = 'a' // flag
|
|
|
|
BanMask ChannelMode = 'b' // arg
|
|
|
|
ChannelCreator ChannelMode = 'O' // flag
|
|
|
|
ChannelOperator ChannelMode = 'o' // arg
|
|
|
|
ExceptionMask ChannelMode = 'e' // arg
|
|
|
|
InviteMask ChannelMode = 'I' // arg
|
|
|
|
InviteOnly ChannelMode = 'i' // flag
|
|
|
|
Key ChannelMode = 'k' // flag arg
|
|
|
|
Moderated ChannelMode = 'm' // flag
|
|
|
|
NoOutside ChannelMode = 'n' // flag
|
|
|
|
OpOnlyTopic ChannelMode = 't' // flag
|
|
|
|
Private ChannelMode = 'p' // flag
|
|
|
|
Quiet ChannelMode = 'q' // flag
|
|
|
|
ReOp ChannelMode = 'r' // flag
|
|
|
|
Secret ChannelMode = 's' // flag
|
|
|
|
UserLimit ChannelMode = 'l' // flag arg
|
|
|
|
Voice ChannelMode = 'v' // arg
|
2012-04-18 03:49:14 +02:00
|
|
|
)
|
2014-02-15 03:28:36 +01:00
|
|
|
|
|
|
|
const (
|
|
|
|
Authorization Phase = iota
|
|
|
|
Registration Phase = iota
|
|
|
|
Normal Phase = iota
|
|
|
|
)
|