// Copyright 2014 Vic Demuzere
//
// Use of this source code is governed by the MIT license.

package irc

// Various prefixes extracted from RFC1459.
const (
	Channel     = '#' // Normal channel
	Distributed = '&' // Distributed channel

	Owner        = '~' // Channel owner +q (non-standard)
	Admin        = '&' // Channel admin +a (non-standard)
	Operator     = '@' // Channel operator +o
	HalfOperator = '%' // Channel half operator +h (non-standard)
	Voice        = '+' // User has voice +v
)

// User modes as defined by RFC1459 section 4.2.3.2.
const (
	UserModeInvisible     = 'i' // User is invisible
	UserModeServerNotices = 's' // User wants to receive server notices
	UserModeWallops       = 'w' // User wants to receive Wallops
	UserModeOperator      = 'o' // Server operator
)

// Channel modes as defined by RFC1459 section 4.2.3.1
const (
	ModeOperator   = 'o' // Operator privileges
	ModeVoice      = 'v' // Ability to speak on a moderated channel
	ModePrivate    = 'p' // Private channel
	ModeSecret     = 's' // Secret channel
	ModeInviteOnly = 'i' // Users can't join without invite
	ModeTopic      = 't' // Topic can only be set by an operator
	ModeModerated  = 'm' // Only voiced users and operators can talk
	ModeLimit      = 'l' // User limit
	ModeKey        = 'k' // Channel password

	ModeOwner        = 'q' // Owner privileges (non-standard)
	ModeAdmin        = 'a' // Admin privileges (non-standard)
	ModeHalfOperator = 'h' // Half-operator privileges (non-standard)
)

// IRC commands extracted from RFC2812 section 3 and RFC2813 section 4.
const (
	PASS     = "PASS"
	NICK     = "NICK"
	USER     = "USER"
	OPER     = "OPER"
	MODE     = "MODE"
	SERVICE  = "SERVICE"
	QUIT     = "QUIT"
	SQUIT    = "SQUIT"
	JOIN     = "JOIN"
	PART     = "PART"
	TOPIC    = "TOPIC"
	NAMES    = "NAMES"
	LIST     = "LIST"
	INVITE   = "INVITE"
	KICK     = "KICK"
	PRIVMSG  = "PRIVMSG"
	NOTICE   = "NOTICE"
	MOTD     = "MOTD"
	LUSERS   = "LUSERS"
	VERSION  = "VERSION"
	STATS    = "STATS"
	LINKS    = "LINKS"
	TIME     = "TIME"
	CONNECT  = "CONNECT"
	TRACE    = "TRACE"
	ADMIN    = "ADMIN"
	INFO     = "INFO"
	SERVLIST = "SERVLIST"
	SQUERY   = "SQUERY"
	WHO      = "WHO"
	WHOIS    = "WHOIS"
	WHOWAS   = "WHOWAS"
	KILL     = "KILL"
	PING     = "PING"
	PONG     = "PONG"
	ERROR    = "ERROR"
	AWAY     = "AWAY"
	REHASH   = "REHASH"
	DIE      = "DIE"
	RESTART  = "RESTART"
	SUMMON   = "SUMMON"
	USERS    = "USERS"
	WALLOPS  = "WALLOPS"
	USERHOST = "USERHOST"
	ISON     = "ISON"
	SERVER   = "SERVER"
	NJOIN    = "NJOIN"
)

// Numeric IRC replies extracted from RFC2812 section 5.
const (
	RPL_WELCOME           = "001"
	RPL_YOURHOST          = "002"
	RPL_CREATED           = "003"
	RPL_MYINFO            = "004"
	RPL_BOUNCE            = "005"
	RPL_ISUPPORT          = "005"
	RPL_USERHOST          = "302"
	RPL_ISON              = "303"
	RPL_AWAY              = "301"
	RPL_UNAWAY            = "305"
	RPL_NOWAWAY           = "306"
	RPL_WHOISUSER         = "311"
	RPL_WHOISSERVER       = "312"
	RPL_WHOISOPERATOR     = "313"
	RPL_WHOISIDLE         = "317"
	RPL_ENDOFWHOIS        = "318"
	RPL_WHOISCHANNELS     = "319"
	RPL_WHOWASUSER        = "314"
	RPL_ENDOFWHOWAS       = "369"
	RPL_LISTSTART         = "321"
	RPL_LIST              = "322"
	RPL_LISTEND           = "323"
	RPL_UNIQOPIS          = "325"
	RPL_CHANNELMODEIS     = "324"
	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_ENDOFWHO          = "315"
	RPL_NAMREPLY          = "353"
	RPL_ENDOFNAMES        = "366"
	RPL_LINKS             = "364"
	RPL_ENDOFLINKS        = "365"
	RPL_BANLIST           = "367"
	RPL_ENDOFBANLIST      = "368"
	RPL_INFO              = "371"
	RPL_ENDOFINFO         = "374"
	RPL_MOTDSTART         = "375"
	RPL_MOTD              = "372"
	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_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_TRACELOG          = "261"
	RPL_TRACEEND          = "262"
	RPL_STATSLINKINFO     = "211"
	RPL_STATSCOMMANDS     = "212"
	RPL_ENDOFSTATS        = "219"
	RPL_STATSUPTIME       = "242"
	RPL_STATSOLINE        = "243"
	RPL_UMODEIS           = "221"
	RPL_SERVLIST          = "234"
	RPL_SERVLISTEND       = "235"
	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_TRYAGAIN          = "263"
	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"
)

// IRC commands extracted from the IRCv3 spec at http://www.ircv3.org/.
const (
	CAP       = "CAP"
	CAP_LS    = "LS"    // Subcommand (param)
	CAP_LIST  = "LIST"  // Subcommand (param)
	CAP_REQ   = "REQ"   // Subcommand (param)
	CAP_ACK   = "ACK"   // Subcommand (param)
	CAP_NAK   = "NAK"   // Subcommand (param)
	CAP_CLEAR = "CLEAR" // Subcommand (param)
	CAP_END   = "END"   // Subcommand (param)

	AUTHENTICATE = "AUTHENTICATE"
)

// Numeric IRC replies extracted from the IRCv3 spec.
const (
	RPL_LOGGEDIN    = "900"
	RPL_LOGGEDOUT   = "901"
	RPL_NICKLOCKED  = "902"
	RPL_SASLSUCCESS = "903"
	ERR_SASLFAIL    = "904"
	ERR_SASLTOOLONG = "905"
	ERR_SASLABORTED = "906"
	ERR_SASLALREADY = "907"
	RPL_SASLMECHS   = "908"
)

// RFC2812, section 5.3
const (
	RPL_STATSCLINE    = "213"
	RPL_STATSNLINE    = "214"
	RPL_STATSILINE    = "215"
	RPL_STATSKLINE    = "216"
	RPL_STATSQLINE    = "217"
	RPL_STATSYLINE    = "218"
	RPL_SERVICEINFO   = "231"
	RPL_ENDOFSERVICES = "232"
	RPL_SERVICE       = "233"
	RPL_STATSVLINE    = "240"
	RPL_STATSLLINE    = "241"
	RPL_STATSHLINE    = "244"
	RPL_STATSSLINE    = "245"
	RPL_STATSPING     = "246"
	RPL_STATSBLINE    = "247"
	RPL_STATSDLINE    = "250"
	RPL_NONE          = "300"
	RPL_WHOISCHANOP   = "316"
	RPL_KILLDONE      = "361"
	RPL_CLOSING       = "362"
	RPL_CLOSEEND      = "363"
	RPL_INFOSTART     = "373"
	RPL_MYPORTIS      = "384"
	ERR_NOSERVICEHOST = "492"
)

// Other constants
const (
	ERR_TOOMANYMATCHES = "416" // Used on IRCNet
	RPL_TOPICWHOTIME   = "333" // From ircu, in use on Freenode
	RPL_LOCALUSERS     = "265" // From aircd, Hybrid, Hybrid, Bahamut, in use on Freenode
	RPL_GLOBALUSERS    = "266" // From aircd, Hybrid, Hybrid, Bahamut, in use on Freenode
)
