diff options
author | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-27 16:32:32 +0000 |
---|---|---|
committer | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-27 16:32:32 +0000 |
commit | 2a96c9198c1f6e13407d0999083f6ce5e0bc06fa (patch) | |
tree | b3b9247d275d9b554665bc22884104d266d2e757 /rbot/rfc2812.rb | |
parent | 21949774b91eaec6ecde4eaa8ad121e2c0a36b87 (diff) |
move rbot into lib - still rearranging for packaging/installation
Diffstat (limited to 'rbot/rfc2812.rb')
-rw-r--r-- | rbot/rfc2812.rb | 1027 |
1 files changed, 0 insertions, 1027 deletions
diff --git a/rbot/rfc2812.rb b/rbot/rfc2812.rb deleted file mode 100644 index 6f459c80..00000000 --- a/rbot/rfc2812.rb +++ /dev/null @@ -1,1027 +0,0 @@ -module Irc - # RFC 2812 Internet Relay Chat: Client Protocol - # - RPL_WELCOME=001 - # "Welcome to the Internet Relay Network - # <nick>!<user>@<host>" - RPL_YOURHOST=002 - # "Your host is <servername>, running version <ver>" - RPL_CREATED=003 - # "This server was created <date>" - RPL_MYINFO=004 - # "<servername> <version> <available user modes> - # <available channel modes>" - # - # - The server sends Replies 001 to 004 to a user upon - # successful registration. - # - RPL_BOUNCE=005 - # "Try server <server name>, port <port number>" - # - # - Sent by the server to a user to suggest an alternative - # server. This is often used when the connection is - # refused because the server is already full. - # - RPL_USERHOST=302 - # ":*1<reply> *( " " <reply> )" - # - # - Reply format used by USERHOST to list replies to - # the query list. The reply string is composed as - # follows: - # - # reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname - # - # The '*' indicates whether the client has registered - # as an Operator. The '-' or '+' characters represent - # whether the client has set an AWAY message or not - # respectively. - # - RPL_ISON=303 - # ":*1<nick> *( " " <nick> )" - # - # - Reply format used by ISON to list replies to the - # query list. - # - RPL_AWAY=301 - # "<nick> :<away message>" - RPL_UNAWAY=305 - # ":You are no longer marked as being away" - RPL_NOWAWAY=306 - # ":You have been marked as being away" - # - # - These replies are used with the AWAY command (if - # allowed). RPL_AWAY is sent to any client sending a - # PRIVMSG to a client which is away. RPL_AWAY is only - # sent by the server to which the client is connected. - # Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the - # client removes and sets an AWAY message. - # - RPL_WHOISUSER=311 - # "<nick> <user> <host> * :<real name>" - RPL_WHOISSERVER=312 - # "<nick> <server> :<server info>" - RPL_WHOISOPERATOR=313 - # "<nick> :is an IRC operator" - RPL_WHOISIDLE=317 - # "<nick> <integer> :seconds idle" - RPL_ENDOFWHOIS=318 - # "<nick> :End of WHOIS list" - RPL_WHOISCHANNELS=319 - # "<nick> :*( ( "@" / "+" ) <channel> " " )" - # - # - Replies 311 - 313, 317 - 319 are all replies - # generated in response to a WHOIS message. Given that - # there are enough parameters present, the answering - # server MUST either formulate a reply out of the above - # numerics (if the query nick is found) or return an - # error reply. The '*' in RPL_WHOISUSER is there as - # the literal character and not as a wild card. For - # each reply set, only RPL_WHOISCHANNELS may appear - # more than once (for long lists of channel names). - # The '@' and '+' characters next to the channel name - # indicate whether a client is a channel operator or - # has been granted permission to speak on a moderated - # channel. The RPL_ENDOFWHOIS reply is used to mark - # the end of processing a WHOIS message. - # - RPL_WHOWASUSER=314 - # "<nick> <user> <host> * :<real name>" - RPL_ENDOFWHOWAS=369 - # "<nick> :End of WHOWAS" - # - # - When replying to a WHOWAS message, a server MUST use - # the replies RPL_WHOWASUSER, RPL_WHOISSERVER or - # ERR_WASNOSUCHNICK for each nickname in the presented - # list. At the end of all reply batches, there MUST - # be RPL_ENDOFWHOWAS (even if there was only one reply - # and it was an error). - # - RPL_LISTSTART=321 - # Obsolete. Not used. - # - RPL_LIST=322 - # "<channel> <# visible> :<topic>" - RPL_LISTEND=323 - # ":End of LIST" - # - # - Replies RPL_LIST, RPL_LISTEND mark the actual replies - # with data and end of the server's response to a LIST - # command. If there are no channels available to return, - # only the end reply MUST be sent. - # - RPL_UNIQOPIS=325 - # "<channel> <nickname>" - # - RPL_CHANNELMODEIS=324 - # "<channel> <mode> <mode params>" - # - RPL_NOTOPIC=331 - # "<channel> :No topic is set" - RPL_TOPIC=332 - # "<channel> :<topic>" - # - # - When sending a TOPIC message to determine the - # channel topic, one of two replies is sent. If - # the topic is set, RPL_TOPIC is sent back else - # RPL_NOTOPIC. - # - RPL_TOPIC_INFO=333 - # <channel> <set by> <unixtime> - RPL_INVITING=341 - # "<channel> <nick>" - # - # - Returned by the server to indicate that the - # attempted INVITE message was successful and is - # being passed onto the end client. - # - RPL_SUMMONING=342 - # "<user> :Summoning user to IRC" - # - # - Returned by a server answering a SUMMON message to - # indicate that it is summoning that user. - # - RPL_INVITELIST=346 - # "<channel> <invitemask>" - RPL_ENDOFINVITELIST=347 - # "<channel> :End of channel invite list" - # - # - When listing the 'invitations masks' for a given channel, - # a server is required to send the list back using the - # RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A - # separate RPL_INVITELIST is sent for each active mask. - # After the masks have been listed (or if none present) a - # RPL_ENDOFINVITELIST MUST be sent. - # - RPL_EXCEPTLIST=348 - # "<channel> <exceptionmask>" - RPL_ENDOFEXCEPTLIST=349 - # "<channel> :End of channel exception list" - # - # - When listing the 'exception masks' for a given channel, - # a server is required to send the list back using the - # RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A - # separate RPL_EXCEPTLIST is sent for each active mask. - # After the masks have been listed (or if none present) - # a RPL_ENDOFEXCEPTLIST MUST be sent. - # - RPL_VERSION=351 - # "<version>.<debuglevel> <server> :<comments>" - # - # - Reply by the server showing its version details. - # The <version> is the version of the software being - # used (including any patchlevel revisions) and the - # <debuglevel> is used to indicate if the server is - # running in "debug mode". - # - # The "comments" field may contain any comments about - # the version or further version details. - # - RPL_WHOREPLY=352 - # "<channel> <user> <host> <server> <nick> - # ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] - # :<hopcount> <real name>" - # - RPL_ENDOFWHO=315 - # "<name> :End of WHO list" - # - # - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used - # to answer a WHO message. The RPL_WHOREPLY is only - # sent if there is an appropriate match to the WHO - # query. If there is a list of parameters supplied - # with a WHO message, a RPL_ENDOFWHO MUST be sent - # after processing each list item with <name> being - # the item. - # - RPL_NAMREPLY=353 - # "( "=" / "*" / "@" ) <channel> - # :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) - # - "@" is used for secret channels, "*" for private - # channels, and "=" for others (public channels). - # - RPL_ENDOFNAMES=366 - # "<channel> :End of NAMES list" - # - # - To reply to a NAMES message, a reply pair consisting - # of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the - # server back to the client. If there is no channel - # found as in the query, then only RPL_ENDOFNAMES is - # returned. The exception to this is when a NAMES - # message is sent with no parameters and all visible - # channels and contents are sent back in a series of - # RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark - # the end. - # - RPL_LINKS=364 - # "<mask> <server> :<hopcount> <server info>" - RPL_ENDOFLINKS=365 - # "<mask> :End of LINKS list" - # - # - In replying to the LINKS message, a server MUST send - # replies back using the RPL_LINKS numeric and mark the - # end of the list using an RPL_ENDOFLINKS reply. - # - RPL_BANLIST=367 - # "<channel> <banmask>" - RPL_ENDOFBANLIST=368 - # "<channel> :End of channel ban list" - # - # - When listing the active 'bans' for a given channel, - # a server is required to send the list back using the - # RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate - # RPL_BANLIST is sent for each active banmask. After the - # banmasks have been listed (or if none present) a - # RPL_ENDOFBANLIST MUST be sent. - # - RPL_INFO=371 - # ":<string>" - RPL_ENDOFINFO=374 - # ":End of INFO list" - # - # - A server responding to an INFO message is required to - # send all its 'info' in a series of RPL_INFO messages - # with a RPL_ENDOFINFO reply to indicate the end of the - # replies. - # - RPL_MOTDSTART=375 - # ":- <server> Message of the day - " - RPL_MOTD=372 - # ":- <text>" - RPL_ENDOFMOTD=376 - # ":End of MOTD command" - # - # - When responding to the MOTD message and the MOTD file - # is found, the file is displayed line by line, with - # each line no longer than 80 characters, using - # RPL_MOTD format replies. These MUST be surrounded - # by a RPL_MOTDSTART (before the RPL_MOTDs) and an - # RPL_ENDOFMOTD (after). - # - RPL_YOUREOPER=381 - # ":You are now an IRC operator" - # - # - RPL_YOUREOPER is sent back to a client which has - # just successfully issued an OPER message and gained - # operator status. - # - RPL_REHASHING=382 - # "<config file> :Rehashing" - # - # - If the REHASH option is used and an operator sends - # a REHASH message, an RPL_REHASHING is sent back to - # the operator. - # - RPL_YOURESERVICE=383 - # "You are service <servicename>" - # - # - Sent by the server to a service upon successful - # registration. - # - RPL_TIME=391 - # "<server> :<string showing server's local time>" - # - # - When replying to the TIME message, a server MUST send - # the reply using the RPL_TIME format above. The string - # showing the time need only contain the correct day and - # time there. There is no further requirement for the - # time string. - # - RPL_USERSSTART=392 - # ":UserID Terminal Host" - RPL_USERS=393 - # ":<username> <ttyline> <hostname>" - RPL_ENDOFUSERS=394 - # ":End of users" - RPL_NOUSERS=395 - # ":Nobody logged in" - # - # - If the USERS message is handled by a server, the - # replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and - # RPL_NOUSERS are used. RPL_USERSSTART MUST be sent - # first, following by either a sequence of RPL_USERS - # or a single RPL_NOUSER. Following this is - # RPL_ENDOFUSERS. - # - RPL_TRACELINK=200 - # "Link <version & debug level> <destination> - # <next server> V<protocol version> - # <link uptime in seconds> <backstream sendq> - # <upstream sendq>" - RPL_TRACECONNECTING=201 - # "Try. <class> <server>" - RPL_TRACEHANDSHAKE=202 - # "H.S. <class> <server>" - RPL_TRACEUNKNOWN=203 - # "???? <class> [<client IP address in dot form>]" - RPL_TRACEOPERATOR=204 - # "Oper <class> <nick>" - RPL_TRACEUSER=205 - # "User <class> <nick>" - RPL_TRACESERVER=206 - # "Serv <class> <int>S <int>C <server> - # <nick!user|*!*>@<host|server> V<protocol version>" - RPL_TRACESERVICE=207 - # "Service <class> <name> <type> <active type>" - RPL_TRACENEWTYPE=208 - # "<newtype> 0 <client name>" - RPL_TRACECLASS=209 - # "Class <class> <count>" - RPL_TRACERECONNECT=210 - # Unused. - RPL_TRACELOG=261 - # "File <logfile> <debug level>" - RPL_TRACEEND=262 - # "<server name> <version & debug level> :End of TRACE" - # - # - The RPL_TRACE* are all returned by the server in - # response to the TRACE message. How many are - # returned is dependent on the TRACE message and - # whether it was sent by an operator or not. There - # is no predefined order for which occurs first. - # Replies RPL_TRACEUNKNOWN, RPL_TRACECONNECTING and - # RPL_TRACEHANDSHAKE are all used for connections - # which have not been fully established and are either - # unknown, still attempting to connect or in the - # process of completing the 'server handshake'. - # RPL_TRACELINK is sent by any server which handles - # a TRACE message and has to pass it on to another - # server. The list of RPL_TRACELINKs sent in - # response to a TRACE command traversing the IRC - # network should reflect the actual connectivity of - # the servers themselves along that path. - # - # RPL_TRACENEWTYPE is to be used for any connection - # which does not fit in the other categories but is - # being displayed anyway. - # RPL_TRACEEND is sent to indicate the end of the list. - # - RPL_STATSLINKINFO=211 - # "<linkname> <sendq> <sent messages> - # <sent Kbytes> <received messages> - # <received Kbytes> <time open>" - # - # - reports statistics on a connection. <linkname> - # identifies the particular connection, <sendq> is - # the amount of data that is queued and waiting to be - # sent <sent messages> the number of messages sent, - # and <sent Kbytes> the amount of data sent, in - # Kbytes. <received messages> and <received Kbytes> - # are the equivalent of <sent messages> and <sent - # Kbytes> for received data, respectively. <time - # open> indicates how long ago the connection was - # opened, in seconds. - # - RPL_STATSCOMMANDS=212 - # "<command> <count> <byte count> <remote count>" - # - # - reports statistics on commands usage. - # - RPL_ENDOFSTATS=219 - # "<stats letter> :End of STATS report" - # - RPL_STATSUPTIME=242 - # ":Server Up %d days %d:%02d:%02d" - # - # - reports the server uptime. - # - RPL_STATSOLINE=243 - # "O <hostmask> * <name>" - # - # - reports the allowed hosts from where user may become IRC - # operators. - # - RPL_UMODEIS=221 - # "<user mode string>" - # - # - To answer a query about a client's own mode, - # RPL_UMODEIS is sent back. - # - RPL_SERVLIST=234 - # "<name> <server> <mask> <type> <hopcount> <info>" - # - RPL_SERVLISTEND=235 - # "<mask> <type> :End of service listing" - # - # - When listing services in reply to a SERVLIST message, - # a server is required to send the list back using the - # RPL_SERVLIST and RPL_SERVLISTEND messages. A separate - # RPL_SERVLIST is sent for each service. After the - # services have been listed (or if none present) a - # RPL_SERVLISTEND MUST be sent. - # - RPL_LUSERCLIENT=251 - # ":There are <integer> users and <integer> - # services on <integer> servers" - RPL_LUSEROP=252 - # "<integer> :operator(s) online" - RPL_LUSERUNKNOWN=253 - # "<integer> :unknown connection(s)" - RPL_LUSERCHANNELS=254 - # "<integer> :channels formed" - RPL_LUSERME=255 - # ":I have <integer> clients and <integer> - # servers" - # - # - In processing an LUSERS message, the server - # sends a set of replies from RPL_LUSERCLIENT, - # RPL_LUSEROP, RPL_USERUNKNOWN, - # RPL_LUSERCHANNELS and RPL_LUSERME. When - # replying, a server MUST send back - # RPL_LUSERCLIENT and RPL_LUSERME. The other - # replies are only sent back if a non-zero count - # is found for them. - # - RPL_ADMINME=256 - # "<server> :Administrative info" - RPL_ADMINLOC1=257 - # ":<admin info>" - RPL_ADMINLOC2=258 - # ":<admin info>" - RPL_ADMINEMAIL=259 - # ":<admin info>" - # - # - When replying to an ADMIN message, a server - # is expected to use replies RPL_ADMINME - # through to RPL_ADMINEMAIL and provide a text - # message with each. For RPL_ADMINLOC1 a - # description of what city, state and country - # the server is in is expected, followed by - # details of the institution (RPL_ADMINLOC2) - # and finally the administrative contact for the - # server (an email address here is REQUIRED) - # in RPL_ADMINEMAIL. - # - RPL_TRYAGAIN=263 - # "<command> :Please wait a while and try again." - # - # - When a server drops a command without processing it, - # it MUST use the reply RPL_TRYAGAIN to inform the - # originating client. - # - # 5.2 Error Replies - # - # Error replies are found in the range from 400 to 599. - # - ERR_NOSUCHNICK=401 - # "<nickname> :No such nick/channel" - # - # - Used to indicate the nickname parameter supplied to a - # command is currently unused. - # - ERR_NOSUCHSERVER=402 - # "<server name> :No such server" - # - # - Used to indicate the server name given currently - # does not exist. - # - ERR_NOSUCHCHANNEL=403 - # "<channel name> :No such channel" - # - # - Used to indicate the given channel name is invalid. - # - ERR_CANNOTSENDTOCHAN=404 - # "<channel name> :Cannot send to channel" - # - # - Sent to a user who is either (a) not on a channel - # which is mode +n or (b) not a chanop (or mode +v) on - # a channel which has mode +m set or where the user is - # banned and is trying to send a PRIVMSG message to - # that channel. - # - ERR_TOOMANYCHANNELS=405 - # "<channel name> :You have joined too many channels" - # - # - Sent to a user when they have joined the maximum - # number of allowed channels and they try to join - # another channel. - # - ERR_WASNOSUCHNICK=406 - # "<nickname> :There was no such nickname" - # - # - Returned by WHOWAS to indicate there is no history - # information for that nickname. - # - ERR_TOOMANYTARGETS=407 - # "<target> :<error code> recipients. <abort message>" - # - # - Returned to a client which is attempting to send a - # PRIVMSG/NOTICE using the user@host destination format - # and for a user@host which has several occurrences. - # - # - Returned to a client which trying to send a - # PRIVMSG/NOTICE to too many recipients. - # - # - Returned to a client which is attempting to JOIN a safe - # channel using the shortname when there are more than one - # such channel. - # - ERR_NOSUCHSERVICE=408 - # "<service name> :No such service" - # - # - Returned to a client which is attempting to send a SQUERY - # to a service which does not exist. - # - ERR_NOORIGIN=409 - # ":No origin specified" - # - # - PING or PONG message missing the originator parameter. - # - ERR_NORECIPIENT=411 - # ":No recipient given (<command>)" - ERR_NOTEXTTOSEND=412 - # ":No text to send" - ERR_NOTOPLEVEL=413 - # "<mask> :No toplevel domain specified" - ERR_WILDTOPLEVEL=414 - # "<mask> :Wildcard in toplevel domain" - ERR_BADMASK=415 - # "<mask> :Bad Server/host mask" - # - # - 412 - 415 are returned by PRIVMSG to indicate that - # the message wasn't delivered for some reason. - # ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that - # are returned when an invalid use of - # "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted. - # - ERR_UNKNOWNCOMMAND=421 - # "<command> :Unknown command" - # - # - Returned to a registered client to indicate that the - # command sent is unknown by the server. - # - ERR_NOMOTD=422 - # ":MOTD File is missing" - # - # - Server's MOTD file could not be opened by the server. - # - ERR_NOADMININFO=423 - # "<server> :No administrative info available" - # - # - Returned by a server in response to an ADMIN message - # when there is an error in finding the appropriate - # information. - # - ERR_FILEERROR=424 - # ":File error doing <file op> on <file>" - # - # - Generic error message used to report a failed file - # operation during the processing of a message. - # - ERR_NONICKNAMEGIVEN=431 - # ":No nickname given" - # - # - Returned when a nickname parameter expected for a - # command and isn't found. - # - ERR_ERRONEUSNICKNAME=432 - # "<nick> :Erroneous nickname" - # - # - Returned after receiving a NICK message which contains - # characters which do not fall in the defined set. See - # section 2.3.1 for details on valid nicknames. - # - ERR_NICKNAMEINUSE=433 - # "<nick> :Nickname is already in use" - # - # - Returned when a NICK message is processed that results - # in an attempt to change to a currently existing - # nickname. - # - ERR_NICKCOLLISION=436 - # "<nick> :Nickname collision KILL from <user>@<host>" - # - # - Returned by a server to a client when it detects a - # nickname collision (registered of a NICK that - # already exists by another server). - # - ERR_UNAVAILRESOURCE=437 - # "<nick/channel> :Nick/channel is temporarily unavailable" - # - # - Returned by a server to a user trying to join a channel - # currently blocked by the channel delay mechanism. - # - # - Returned by a server to a user trying to change nickname - # when the desired nickname is blocked by the nick delay - # mechanism. - # - ERR_USERNOTINCHANNEL=441 - # "<nick> <channel> :They aren't on that channel" - # - # - Returned by the server to indicate that the target - # user of the command is not on the given channel. - # - ERR_NOTONCHANNEL=442 - # "<channel> :You're not on that channel" - # - # - Returned by the server whenever a client tries to - # perform a channel affecting command for which the - # client isn't a member. - # - ERR_USERONCHANNEL=443 - # "<user> <channel> :is already on channel" - # - # - Returned when a client tries to invite a user to a - # channel they are already on. - # - ERR_NOLOGIN=444 - # "<user> :User not logged in" - # - # - Returned by the summon after a SUMMON command for a - # user was unable to be performed since they were not - # logged in. - # - # - ERR_SUMMONDISABLED=445 - # ":SUMMON has been disabled" - # - # - Returned as a response to the SUMMON command. MUST be - # returned by any server which doesn't implement it. - # - ERR_USERSDISABLED=446 - # ":USERS has been disabled" - # - # - Returned as a response to the USERS command. MUST be - # returned by any server which does not implement it. - # - ERR_NOTREGISTERED=451 - # ":You have not registered" - # - # - Returned by the server to indicate that the client - # MUST be registered before the server will allow it - # to be parsed in detail. - # - ERR_NEEDMOREPARAMS=461 - # "<command> :Not enough parameters" - # - # - Returned by the server by numerous commands to - # indicate to the client that it didn't supply enough - # parameters. - # - ERR_ALREADYREGISTRED=462 - # ":Unauthorized command (already registered)" - # - # - Returned by the server to any link which tries to - # change part of the registered details (such as - # password or user details from second USER message). - # - ERR_NOPERMFORHOST=463 - # ":Your host isn't among the privileged" - # - # - Returned to a client which attempts to register with - # a server which does not been setup to allow - # connections from the host the attempted connection - # is tried. - # - ERR_PASSWDMISMATCH=464 - # ":Password incorrect" - # - # - Returned to indicate a failed attempt at registering - # a connection for which a password was required and - # was either not given or incorrect. - # - ERR_YOUREBANNEDCREEP=465 - # ":You are banned from this server" - # - # - Returned after an attempt to connect and register - # yourself with a server which has been setup to - # explicitly deny connections to you. - # - ERR_YOUWILLBEBANNED=466 - # - # - Sent by a server to a user to inform that access to the - # server will soon be denied. - # - ERR_KEYSET=467 - # "<channel> :Channel key already set" - ERR_CHANNELISFULL=471 - # "<channel> :Cannot join channel (+l)" - ERR_UNKNOWNMODE=472 - # "<char> :is unknown mode char to me for <channel>" - ERR_INVITEONLYCHAN=473 - # "<channel> :Cannot join channel (+i)" - ERR_BANNEDFROMCHAN=474 - # "<channel> :Cannot join channel (+b)" - ERR_BADCHANNELKEY=475 - # "<channel> :Cannot join channel (+k)" - ERR_BADCHANMASK=476 - # "<channel> :Bad Channel Mask" - ERR_NOCHANMODES=477 - # "<channel> :Channel doesn't support modes" - ERR_BANLISTFULL=478 - # "<channel> <char> :Channel list is full" - # - ERR_NOPRIVILEGES=481 - # ":Permission Denied- You're not an IRC operator" - # - # - Any command requiring operator privileges to operate - # MUST return this error to indicate the attempt was - # unsuccessful. - # - ERR_CHANOPRIVSNEEDED=482 - # "<channel> :You're not channel operator" - # - # - Any command requiring 'chanop' privileges (such as - # MODE messages) MUST return this error if the client - # making the attempt is not a chanop on the specified - # channel. - # - # - ERR_CANTKILLSERVER=483 - # ":You can't kill a server!" - # - # - Any attempts to use the KILL command on a server - # are to be refused and this error returned directly - # to the client. - # - ERR_RESTRICTED=484 - # ":Your connection is restricted!" - # - # - Sent by the server to a user upon connection to indicate - # the restricted nature of the connection (user mode "+r"). - # - ERR_UNIQOPPRIVSNEEDED=485 - # ":You're not the original channel operator" - # - # - Any MODE requiring "channel creator" privileges MUST - # return this error if the client making the attempt is not - # a chanop on the specified channel. - # - ERR_NOOPERHOST=491 - # ":No O-lines for your host" - # - # - If a client sends an OPER message and the server has - # not been configured to allow connections from the - # client's host as an operator, this error MUST be - # returned. - # - ERR_UMODEUNKNOWNFLAG=501 - # ":Unknown MODE flag" - # - # - Returned by the server to indicate that a MODE - # message was sent with a nickname parameter and that - # the a mode flag sent was not recognized. - # - ERR_USERSDONTMATCH=502 - # ":Cannot change mode for other users" - # - # - Error sent to any user trying to view or change the - # user mode for a user other than themselves. - # - # 5.3 Reserved numerics - # - # These numerics are not described above since they fall into one of - # the following categories: - # - # 1. no longer in use; - # - # 2. reserved for future planned use; - # - # 3. in current use but are part of a non-generic 'feature' of - # the current IRC server. - RPL_SERVICEINFO=231 - RPL_ENDOFSERVICES=232 - RPL_SERVICE=233 - RPL_NONE=300 - RPL_WHOISCHANOP=316 - RPL_KILLDONE=361 - RPL_CLOSING=362 - RPL_CLOSEEND=363 - RPL_INFOSTART=373 - RPL_MYPORTIS=384 - RPL_STATSCLINE=213 - RPL_STATSNLINE=214 - RPL_STATSILINE=215 - RPL_STATSKLINE=216 - RPL_STATSQLINE=217 - RPL_STATSYLINE=218 - RPL_STATSVLINE=240 - RPL_STATSLLINE=241 - RPL_STATSHLINE=244 - RPL_STATSSLINE=244 - RPL_STATSPING=246 - RPL_STATSBLINE=247 - RPL_STATSDLINE=250 - ERR_NOSERVICEHOST=492 - - # implements RFC 2812 and prior IRC RFCs. - # clients register handler proc{}s for different server events and IrcClient - # handles dispatch - class IrcClient - # create a new IrcClient instance - def initialize - @handlers = Hash.new - @users = Array.new - end - - # key:: server event to handle - # value:: proc object called when event occurs - # set a handler for a server event - # - # ==server events currently supported: - # - # PING:: server pings you (default handler returns a pong) - # NICKTAKEN:: you tried to change nick to one that's in use - # BADNICK:: you tried to change nick to one that's invalid - # TOPIC:: someone changed the topic of a channel - # TOPICINFO:: on joining a channel or asking for the topic, tells you - # who set it and when - # NAMES:: server sends list of channel members when you join - # WELCOME:: server welcome message on connect - # MOTD:: server message of the day - # PRIVMSG:: privmsg, the core of IRC, a message to you from someone - # PUBLIC:: optionally instead of getting privmsg you can hook to only - # the public ones... - # MSG:: or only the private ones, or both - # KICK:: someone got kicked from a channel - # PART:: someone left a channel - # QUIT:: someone quit IRC - # JOIN:: someone joined a channel - # CHANGETOPIC:: the topic of a channel changed - # INVITE:: you are invited to a channel - # NICK:: someone changed their nick - # MODE:: a mode change - # NOTICE:: someone sends you a notice - # UNKNOWN:: any other message not handled by the above - def []=(key, value) - @handlers[key] = value - end - - # key:: event name - # remove a handler for a server event - def deletehandler(key) - @handlers.delete(key) - end - - # takes a server string, checks for PING, PRIVMSG, NOTIFY, etc, and parses - # numeric server replies, calling the appropriate handler for each, and - # sending it a hash containing the data from the server - def process(serverstring) - data = Hash.new - data["SERVERSTRING"] = serverstring - - unless serverstring =~ /^(:(\S+)\s)?(\S+)(\s(.*))?/ - raise "Unparseable Server Message!!!: #{serverstring}" - end - - prefix, command, params = $2, $3, $5 - - if prefix != nil - data['SOURCE'] = prefix - if prefix =~ /^(\S+)!(\S+)$/ - data['SOURCENICK'] = $1 - data['SOURCEADDRESS'] = $2 - end - end - - # split parameters in an array - argv = [] - params.scan(/(?!:)(\S+)|:(.*)/) { argv << ($1 || $2) } if params - - case command - when 'PING' - data['PINGID'] = argv[0] - handle('PING', data) - when /^(\d+)$/ # numeric server message - num=command.to_i - case num - when ERR_NICKNAMEINUSE - # "* <nick> :Nickname is already in use" - data['NICK'] = argv[1] - data['MESSAGE'] = argv[2] - handle('NICKTAKEN', data) - when ERR_ERRONEUSNICKNAME - # "* <nick> :Erroneous nickname" - data['NICK'] = argv[1] - data['MESSAGE'] = argv[2] - handle('BADNICK', data) - when RPL_TOPIC - data['CHANNEL'] = argv[1] - data['TOPIC'] = argv[2] - handle('TOPIC', data) - when RPL_TOPIC_INFO - data['NICK'] = argv[0] - data['CHANNEL'] = argv[1] - data['SOURCE'] = argv[2] - data['UNIXTIME'] = argv[3] - handle('TOPICINFO', data) - when RPL_NAMREPLY - # "( "=" / "*" / "@" ) <channel> - # :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) - # - "@" is used for secret channels, "*" for private - # channels, and "=" for others (public channels). - argv[3].scan(/\S+/).each { |u| - if(u =~ /^([@+])?(.*)$/) - umode = $1 || "" - user = $2 - @users << [user, umode] - end - } - when RPL_ENDOFNAMES - data['CHANNEL'] = argv[1] - data['USERS'] = @users - handle('NAMES', data) - @users = Array.new - when RPL_WELCOME - # "Welcome to the Internet Relay Network - # <nick>!<user>@<host>" - case argv[1] - when /((\S+)!(\S+))/ - data['NETMASK'] = $1 - data['NICK'] = $2 - data['ADDRESS'] = $3 - when /Welcome to the Internet Relay Network\s(\S+)/ - data['NICK'] = $1 - when /Welcome.*\s+(\S+)$/ - data['NICK'] = $1 - when /^(\S+)$/ - data['NICK'] = $1 - end - handle('WELCOME', data) - when RPL_MOTDSTART - # "<nick> :- <server> Message of the Day -" - if argv[1] =~ /^-\s+(\S+)\s/ - server = $1 - @motd = "" - end - when RPL_MOTD - if(argv[1] =~ /^-\s+(.*)$/) - @motd << $1 - @motd << "\n" - end - when RPL_ENDOFMOTD - data['MOTD'] = @motd - handle('MOTD', data) - else - handle('UNKNOWN', data) - end - # end of numeric replies - when 'PRIVMSG' - # you can either bind to 'PRIVMSG', to get every one and - # parse it yourself, or you can bind to 'MSG', 'PUBLIC', - # etc and get it all nicely split up for you. - data['TARGET'] = argv[0] - data['MESSAGE'] = argv[1] - handle('PRIVMSG', data) - - # Now we split it - if(data['TARGET'] =~ /^(#|&).*/) - handle('PUBLIC', data) - else - handle('MSG', data) - end - when 'KICK' - data['CHANNEL'] = argv[0] - data['TARGET'] = argv[1] - data['MESSAGE'] = argv[2] - handle('KICK', data) - when 'PART' - data['CHANNEL'] = argv[0] - data['MESSAGE'] = argv[1] - handle('PART', data) - when 'QUIT' - data['MESSAGE'] = argv[0] - handle('QUIT', data) - when 'JOIN' - data['CHANNEL'] = argv[0] - handle('JOIN', data) - when 'TOPIC' - data['CHANNEL'] = argv[0] - data['TOPIC'] = argv[1] - handle('CHANGETOPIC', data) - when 'INVITE' - data['TARGET'] = argv[0] - data['CHANNEL'] = argv[1] - handle('INVITE', data) - when 'NICK' - data['NICK'] = argv[0] - handle('NICK', data) - when 'MODE' - data['CHANNEL'] = argv[0] - data['MODESTRING'] = argv[1] - data['TARGETS'] = argv[2] - handle('MODE', data) - when 'NOTICE' - data['TARGET'] = argv[0] - data['MESSAGE'] = argv[1] - if data['SOURCENICK'] - handle('NOTICE', data) - else - # "server notice" (not from user, noone to reply to - handle('SNOTICE', data) - end - else - handle('UNKNOWN', data) - end - end - - private - - # key:: server event name - # data:: hash containing data about the event, passed to the proc - # call client's proc for an event, if they set one as a handler - def handle(key, data) - if(@handlers.has_key?(key)) - @handlers[key].call(data) - end - end - end -end |