You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2005/12/16 23:30:52 UTC

svn commit: r357245 [3/3] - in /maven/sandbox/issue/rbot/dist: ./ bin/ lib/ lib/site_ruby/ lib/site_ruby/1.8/ lib/site_ruby/1.8/rbot/ plugins/ share/ share/rbot/ share/rbot/languages/ share/rbot/templates/ share/rbot/templates/lart/

Added: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb (added)
+++ maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb Fri Dec 16 14:30:38 2005
@@ -0,0 +1,1107 @@
+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>"
+  RPL_ISUPPORT=005
+  # "005 nick PREFIX=(ov)@+ CHANTYPES=#& :are supported by this server"
+  # 
+  # - 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_LOCALUSERS=265
+  # ":Current local  users: 3  Max: 4"
+  RPL_GLOBALUSERS=266
+  # ":Current global users: 3  Max: 4"
+  RPL_STATSCONN=250
+  # "::Highest connection count: 4 (4 clients) (251 since server was
+  # (re)started)"
+  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
+  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:
+    #
+    # created::     when the server was started
+    # yourhost::    your host details (on connection)
+    # 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 'PONG'
+        data[:pingid] = argv[0]
+        handle(:pong, data)
+      when /^(\d+)$/		# numeric server message
+        num=command.to_i
+        case num
+        when RPL_YOURHOST
+          # "Your host is <servername>, running version <ver>"
+          # TODO how standard is this "version <ver>? should i parse it?
+          data[:message] = argv[1]
+          handle(:yourhost, data)
+        when RPL_CREATED
+          # "This server was created <date>"
+          data[:message] = argv[1]
+          handle(:created, data)
+        when RPL_MYINFO
+          # "<servername> <version> <available user modes>
+          # <available channel modes>"
+          data[:servername] = argv[1]
+          data[:version] = argv[2]
+          data[:usermodes] = argv[3]
+          data[:chanmodes] = argv[4]
+        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_ISUPPORT
+          # "PREFIX=(ov)@+ CHANTYPES=#& :are supported by this server"
+          # "MODES=4 CHANLIMIT=#:20 NICKLEN=16 USERLEN=10 HOSTLEN=63
+          # TOPICLEN=450 KICKLEN=450 CHANNELLEN=30 KEYLEN=23 CHANTYPES=#
+          # PREFIX=(ov)@+ CASEMAPPING=ascii CAPAB IRCD=dancer :are available
+          # on this server"
+          # 
+          argv.each {|a|
+            if a =~ /^(.*)=(.*)$/
+              data[$1.downcase.to_sym] = $2
+            end
+          }
+          handle(:isupport, data)
+        when RPL_LUSERCLIENT
+          # ":There are <integer> users and <integer>
+          # services on <integer> servers"
+          data[:message] = argv[1]
+          handle(:luserclient, data)
+        when RPL_LUSEROP
+          # "<integer> :operator(s) online"
+          data[:ops] = argv[1].to_i
+          handle(:luserop, data)
+        when RPL_LUSERUNKNOWN
+          # "<integer> :unknown connection(s)"
+          data[:unknown] = argv[1].to_i
+          handle(:luserunknown, data)
+        when RPL_LUSERCHANNELS
+          # "<integer> :channels formed"
+          data[:channels] = argv[1].to_i
+          handle(:luserchannels, data)
+        when RPL_LUSERME
+          # ":I have <integer> clients and <integer> servers"
+          data[:message] = argv[1]
+          handle(:luserme, data)
+        when ERR_NOMOTD
+          # ":MOTD File is missing"
+          data[:message] = argv[1]
+          handle(:motd_missing, data)
+        when RPL_LOCALUSERS
+          # ":Current local  users: 3  Max: 4"
+          data[:message] = argv[1]
+          handle(:localusers, data)
+        when RPL_GLOBALUSERS
+          # ":Current global users: 3  Max: 4"
+          data[:message] = argv[1]
+          handle(:globalusers, data)
+        when RPL_STATSCONN
+          # ":Highest connection count: 4 (4 clients) (251 since server was
+          # (re)started)"
+          data[:message] = argv[1]
+          handle(:statsconn, data)
+        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

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/rfc2812.rb
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb (added)
+++ maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb Fri Dec 16 14:30:38 2005
@@ -0,0 +1,205 @@
+module Timer
+
+  # timer event, something to do and when/how often to do it
+  class Action
+    
+    # when this action is due next (updated by tick())
+    attr_reader :in
+    
+    # is this action blocked? if so it won't be run
+    attr_accessor :blocked
+
+    # period:: how often (seconds) to run the action
+    # data::   optional data to pass to the proc
+    # once::   optional, if true, this action will be run once then removed
+    # func::   associate a block to be called to perform the action
+    # 
+    # create a new action
+    def initialize(period, data=nil, once=false, &func)
+      @blocked = false
+      @period = period
+      @in = period
+      @func = func
+      @data = data
+      @once = once
+      @last_tick = Time.new
+    end
+
+    def tick
+      diff = Time.new - @last_tick
+      @in -= diff
+      @last_tick = Time.new
+    end
+
+    def inspect 
+      "#<#{self.class}:#{@period}s:#{@once ? 'once' : 'repeat'}>"
+    end
+
+    def due?
+      @in <= 0
+    end
+
+    # run the action by calling its proc
+    def run
+      @in += @period
+      # really short duration timers can overrun and leave @in negative,
+      # for these we set @in to @period
+      @in = @period if @in <= 0
+      if(@data)
+        @func.call(@data)
+      else
+        @func.call
+      end
+      return @once
+    end
+  end
+  
+  # timer handler, manage multiple Action objects, calling them when required.
+  # The timer must be ticked by whatever controls it, i.e. regular calls to
+  # tick() at whatever granularity suits your application's needs.
+  # 
+  # Alternatively you can call run(), and the timer will spawn a thread and
+  # tick itself, intelligently shutting down the thread if there are no
+  # pending actions.
+  class Timer
+    def initialize(granularity = 0.1)
+      @granularity = granularity
+      @timers = Hash.new
+      @handle = 0
+      @lasttime = 0
+      @should_be_running = false
+      @thread = false
+      @next_action_time = 0
+    end
+    
+    # period:: how often (seconds) to run the action
+    # data::   optional data to pass to the action's proc
+    # func::   associate a block with add() to perform the action
+    # 
+    # add an action to the timer
+    def add(period, data=nil, &func)
+      debug "adding timer, period #{period}"
+      @handle += 1
+      @timers[@handle] = Action.new(period, data, &func)
+      start_on_add
+      return @handle
+    end
+
+    # period:: how long (seconds) until the action is run
+    # data::   optional data to pass to the action's proc
+    # func::   associate a block with add() to perform the action
+    # 
+    # add an action to the timer which will be run just once, after +period+
+    def add_once(period, data=nil, &func)
+      debug "adding one-off timer, period #{period}"
+      @handle += 1
+      @timers[@handle] = Action.new(period, data, true, &func)
+      start_on_add
+      return @handle
+    end
+
+    # remove action with handle +handle+ from the timer
+    def remove(handle)
+      @timers.delete(handle)
+    end
+    
+    # block action with handle +handle+
+    def block(handle)
+      @timers[handle].blocked = true
+    end
+
+    # unblock action with handle +handle+
+    def unblock(handle)
+      @timers[handle].blocked = false
+    end
+
+    # you can call this when you know you're idle, or you can split off a
+    # thread and call the run() method to do it for you.
+    def tick 
+      if(@lasttime == 0)
+        # don't do anything on the first tick
+        @lasttime = Time.now
+        return
+      end
+      @next_action_time = 0
+      diff = (Time.now - @lasttime).to_f
+      @lasttime = Time.now
+      @timers.each { |key,timer|
+        timer.tick
+        next if timer.blocked
+        if(timer.due?)
+          if(timer.run)
+            # run once
+            @timers.delete(key)
+          end
+        end
+        if @next_action_time == 0 || timer.in < @next_action_time
+          @next_action_time = timer.in
+        end
+      }
+      #debug "ticked. now #{@timers.length} timers remain"
+      #debug "next timer due at #{@next_action_time}"
+    end
+
+    # for backwards compat - this is a bit primitive
+    def run(granularity=0.1)
+      while(true)
+        sleep(granularity)
+        tick
+      end
+    end
+
+    def running?
+      @thread && @thread.alive?
+    end
+
+    # return the number of seconds until the next action is due, or 0 if
+    # none are outstanding - will only be accurate immediately after a
+    # tick()
+    def next_action_time
+      @next_action_time
+    end
+
+    # start the timer, it spawns a thread to tick the timer, intelligently
+    # shutting down if no events remain and starting again when needed.
+    def start
+      return if running?
+      @should_be_running = true
+      start_thread unless @timers.empty?
+    end
+
+    # stop the timer from ticking
+    def stop
+      @should_be_running = false
+      stop_thread
+    end
+    
+    private
+    
+    def start_on_add
+      if running?
+        stop_thread
+        start_thread
+      elsif @should_be_running
+        start_thread
+      end
+    end
+    
+    def stop_thread
+      return unless running?
+      @thread.kill
+    end
+    
+    def start_thread
+      return if running?
+      @thread = Thread.new do
+        while(true)
+          tick
+          exit if @timers.empty?
+          sleep(@next_action_time)
+        end
+      end
+    end
+
+  end
+end

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/timer.rb
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb (added)
+++ maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb Fri Dec 16 14:30:38 2005
@@ -0,0 +1,83 @@
+require 'net/http'
+require 'uri'
+
+module Irc
+
+  # miscellaneous useful functions
+  module Utils
+
+    # turn a number of seconds into a human readable string, e.g
+    # 2 days, 3 hours, 18 minutes, 10 seconds
+    def Utils.secs_to_string(secs)
+      ret = ""
+      days = (secs / (60 * 60 * 24)).to_i
+      secs = secs % (60 * 60 * 24)
+      hours = (secs / (60 * 60)).to_i
+      secs = (secs % (60 * 60))
+      mins = (secs / 60).to_i
+      secs = (secs % 60).to_i
+      ret += "#{days} days, " if days > 0
+      ret += "#{hours} hours, " if hours > 0 || days > 0
+      ret += "#{mins} minutes and " if mins > 0 || hours > 0 || days > 0
+      ret += "#{secs} seconds"
+      return ret
+    end
+
+
+    def Utils.safe_exec(command, *args)
+      IO.popen("-") {|p|
+        if(p)
+          return p.readlines.join("\n")
+        else
+          begin
+            $stderr = $stdout
+            exec(command, *args)
+          rescue Exception => e
+            puts "exec of #{command} led to exception: #{e}"
+            Kernel::exit! 0
+          end
+          puts "exec of #{command} failed"
+          Kernel::exit! 0
+        end
+      }
+    end
+
+    # returns a string containing the result of an HTTP GET on the uri
+    def Utils.http_get(uristr, readtimeout=8, opentimeout=4)
+
+      # ruby 1.7 or better needed for this (or 1.6 and debian unstable)
+      Net::HTTP.version_1_2
+      # (so we support the 1_1 api anyway, avoids problems)
+
+      uri = URI.parse uristr
+      query = uri.path
+      if uri.query
+        query += "?#{uri.query}"
+      end
+
+      proxy_host = nil
+      proxy_port = nil
+      if(ENV['http_proxy'] && proxy_uri = URI.parse(ENV['http_proxy']))
+        proxy_host = proxy_uri.host
+        proxy_port = proxy_uri.port
+      end
+
+      begin
+        http = Net::HTTP.new(uri.host, uri.port, proxy_host, proxy_port)
+        http.open_timeout = opentimeout
+        http.read_timeout = readtimeout
+
+        http.start {|http|
+          resp = http.get(query)
+          if resp.code == "200"
+            return resp.body
+          end
+        }
+      rescue => e
+        # cheesy for now
+        $stderr.puts "Utils.http_get exception: #{e}, while trying to get #{uristr}"
+        return nil
+      end
+    end
+  end
+end

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/issue/rbot/dist/lib/site_ruby/1.8/rbot/utils.rb
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/issue/rbot/dist/plugin_registry.db
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/plugin_registry.db?rev=357245&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/sandbox/issue/rbot/dist/plugin_registry.db
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/sandbox/issue/rbot/dist/plugins/jira.rb
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/plugins/jira.rb?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/plugins/jira.rb (added)
+++ maven/sandbox/issue/rbot/dist/plugins/jira.rb Fri Dec 16 14:30:38 2005
@@ -0,0 +1,86 @@
+require 'issue'
+require 'yaml'
+
+# faq counter: totals, by each contributor. a report would be nice.
+
+class JiraPlugin < Plugin
+
+  @server = nil
+
+  def jira(m,params)
+    unless(params)
+      m.reply "incorrect usage. " + help(m.plugin)
+    end
+    
+    # Using the jira library directly seems to crash rbot ...
+    # so i'm just exec'ing the command line tool used to query
+    # JIRA from the command line.
+
+    issue = getServer().getIssue( params[:issue].to_s.upcase )
+    puts issue
+    url = getServer().issueUrl(issue)
+    puts url
+    user = getServer().getUser( issue['reporter'] )
+    m.reply( " " )
+    string = ""
+    string << "     URL: #{url}\n"
+    string << "  Status: #{issue['status']}\n"
+    string << " Summary: #{issue['summary']}\n" 
+    string << "Reporter: #{user['fullname']} (#{issue['reporter']})"
+    m.reply( string )
+    m.reply( " " )
+  end
+
+  # Need to know which person submitted the entry 
+  def faqa(m,params)        
+    unless(m.params)
+      m.reply "incorrect usage. " + help(m.plugin)
+    end
+    who = params[:who]
+    summary = params[:phrase].join( " " )
+    fields = getServer().createIssue2( 'MNGFAQ', summary, 'none', '1', who, 'minor' )
+    getServer().closeIssue( fields )
+  end
+  
+  # Need to know which person submitted the entry 
+  def faqq(m,params)        
+    unless(m.params)
+      m.reply "incorrect usage. " + help(m.plugin)
+    end
+    who = params[:who]
+    summary = params[:phrase].join( " " )
+    puts who
+    puts summary
+    fields = getServer().createIssue2( 'MNGFAQ', summary, 'none', '1', who, 'minor' )
+  end  
+  
+  def faqc(m,params)
+    unless(m.params)
+      m.reply "incorrect usage. " + help(m.plugin)
+    end
+    issue = params[:issue]
+    fields = issue = getServer().getIssue( issue.upcase! )
+    puts fields
+    getServer().closeIssue( fields )    
+  end
+  
+  def issue(m,params)
+    fields = getServer().createIssue2( params[:project], params[:summary], params[:description], '1', params[:assignee], 'minor' )
+    m.reply( fields['key'] )
+    m.reply( " created." )    
+  end
+
+  def getServer
+    if @server == nil
+      @server = IssueManager.new()
+    end
+    @server
+  end
+end
+
+plugin = JiraPlugin.new
+plugin.map 'jira :issue'
+plugin.map 'faqa :who *phrase'
+plugin.map 'faqq :who *phrase'
+plugin.map 'faqc :issue'
+plugin.map 'issue :project :summary :description :assignee'

Propchange: maven/sandbox/issue/rbot/dist/plugins/jira.rb
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/issue/rbot/dist/plugins/jira.rb
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/issue/rbot/dist/rbot.sh
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/rbot.sh?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/rbot.sh (added)
+++ maven/sandbox/issue/rbot/dist/rbot.sh Fri Dec 16 14:30:38 2005
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+dir=`pwd`
+
+export JIRA_CONF_DIR=$dir
+
+(
+  cd bin
+  
+  exec ruby -I $dir/lib/site_ruby/1.8 rbot $dir $dir/share/rbot
+)

Propchange: maven/sandbox/issue/rbot/dist/rbot.sh
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/issue/rbot/dist/rbot.sh
------------------------------------------------------------------------------
    svn:executable = *

Propchange: maven/sandbox/issue/rbot/dist/rbot.sh
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/sandbox/issue/rbot/dist/share/rbot/languages/dutch.lang
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/languages/dutch.lang?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/languages/dutch.lang (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/languages/dutch.lang Fri Dec 16 14:30:38 2005
@@ -0,0 +1,73 @@
+okay:
+  ok
+  ok dan :)
+  goed
+  mooi
+  voila
+  in orde
+  't is gebeurd
+  zeker
+  dat kan ik!
+  komt in orde
+  k
+  ik zal het eens doen
+dunno:
+  geen idee
+  dat weet ik niet
+  dat gaat m'n petje te boven
+  *haal schouder op*
+  vraag dat aan iemand anders
+  dat moet je niet aan mij vragen
+  wie weet dat?
+  dat kan ik niet
+  laat je eens nakijken...
+  wat vraag je nu?
+dunno_about_X:
+  maar ik weet niks over %s
+  Ik heb nog nooit van %s gehoord :(
+  maar wat is %s?
+insult:
+  %s: idioot!
+  %s: :(
+  %s: Ik haat je:(
+  %s: val dood!
+  %s: Ik ben beledigd!
+hello:
+  hallo :)
+  hey!
+  hi
+  yo
+  yow
+  joe
+  jowjowjow
+hello_X:
+  hallo %s :)
+  %s: hallo
+  hey %s :)
+  %s: hi!
+  yo %s!
+  joe %s!
+  alles ok %s?
+  %s: alles goed?
+welcome:
+  geen probleem
+  't is niks
+  altijd welkom
+  graag gedaan
+  np :)
+thanks:
+  danku :)
+  bedankt!
+  thx :)
+  =D
+  je bent een schatje :)
+thanks_X:
+  %s: danku :)
+  %s: bedankt!
+  %s: =D
+  %s: thx :)
+  %s: je bent een schatje :)
+quit:
+  ok ik ben weg
+  yo
+  ciao

Added: maven/sandbox/issue/rbot/dist/share/rbot/languages/english.lang
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/languages/english.lang?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/languages/english.lang (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/languages/english.lang Fri Dec 16 14:30:38 2005
@@ -0,0 +1,75 @@
+okay:
+  okay
+  okay then :)
+  okies!
+  fine
+  done
+  can do!
+  alright
+  sure
+  aight
+  lemme take care of that for you
+dunno:
+  dunno
+  beats me
+  no idea
+  no clue
+  ...eh?
+  *shrug*
+  don't ask me
+  who knows?
+  I can't do that Dave.
+  you best check yo'self!
+dunno_about_X:
+  but I dunno anything about %s
+  I never heard of %s :(
+  %s? what's that then?
+  but what's %s?
+insult:
+  %s: wanker!
+  %s: :(
+  %s: I hate you :(
+  %s: die!
+  %s: I'm offended!
+  %s: you hurt my feelings
+hello:
+  hello :)
+  hola :)
+  salut
+  hey!
+  word.
+  hi
+  yo
+  'sup?
+hello_X:
+  hello %s :)
+  %s: hey there
+  %s: hola :)
+  %s: salut
+  hey %s :)
+  %s: word
+  %s: hi!
+  yo %s!
+  %s: 'sup?
+  'sup %s?
+welcome:
+  no probbie
+  you're welcome
+  de nada
+  any time
+  np :)
+thanks:
+  thanks :)
+  schweet!
+  ta :)
+  =D
+  cheers!
+thanks_X:
+  %s: thanks :)
+  %s: schweet!
+  %s: =D
+  %s: ta :)
+  %s: cheers
+quit:
+  okay bye
+  seeya

Added: maven/sandbox/issue/rbot/dist/share/rbot/languages/french.lang
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/languages/french.lang?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/languages/french.lang (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/languages/french.lang Fri Dec 16 14:30:38 2005
@@ -0,0 +1,39 @@
+okay:
+  d'accord
+dunno:
+  de quoi est mort votre dernier esclave?
+  je vous aurais bien aide, mais je ne vous aime pas
+  faites-le vous-même
+  parle à mon cul, ma tête est malade
+  je ne sais pas
+  je ne peut pas faire ca Dave.
+dunno_about_X:
+  qu'est-ce c'est %s?
+insult:
+  %s: putin!
+  %s: :(
+  %s: je te déteste :(
+  %s: tu es completement debile
+  %s: mais t'as une tête a faire sauter les plaques d'egouts!
+  %s: est-ce que vous êtes ivre?
+hello:
+  bonjour
+  salut
+  bonsoir
+hello_X:
+  bonjour %s :)
+  %s: salut
+welcome:
+  de rien
+  aucun probleme
+thanks:
+  merci :)
+  tu es trop gentil!
+  je vous remerci bien
+thanks_X:
+  %s: merci :)
+  %s: tu es trop gentil!
+  %s: je vous remerci bien
+quit:
+  d'accord, au revoir
+  a demain

Added: maven/sandbox/issue/rbot/dist/share/rbot/languages/german.lang
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/languages/german.lang?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/languages/german.lang (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/languages/german.lang Fri Dec 16 14:30:38 2005
@@ -0,0 +1,70 @@
+okay:
+  okay
+  okay na dann :)
+  gut
+  gemacht
+  wird gemacht!
+  also los
+  sicher
+  klar
+  lass mich sorge tragen :-)
+dunno:
+  kann nicht
+  schlag mich
+  habe keine Idee
+  habe keine Ahnung
+  *achselzuck*
+  frag mich nicht
+  wer weiss?
+  ich kann es nicht tun
+  am besten du schaust selber nach
+dunno_about_X:
+  ich weiss nichts über %s
+  ich habe nie von %s gehört :(
+  was zum Teufel ist %s?
+insult:
+  %s: Arsch!
+  %s: :(
+  %s: Ich hasse dich :(
+  %s: Stirb!
+  %s: Ich bin beleidigt!
+hello:
+  hallo :)
+  hola :)
+  salut
+  hey!
+  sag nichts.
+  hi
+  yo
+  Was geht?
+hello_X:
+  hallo %s :)
+  %s: guggus
+  %s: hola :)
+  %s: salut
+  hey %s :)
+  %s: sag nichts
+  %s: hi!
+  yo %s!
+  %s: Was geht?
+  Was geht %s?
+welcome:
+  no probbie
+  you're welcome
+  de nada
+  any time
+  np :)
+thanks:
+  Danke :)
+  Süss!
+  juhu :)
+  :-D
+  Prost!
+thanks_X:
+  %s: danke :)
+  %s: :-D
+  %s: süss!
+  %s: juhu :)
+  %s: Prost
+quit:
+  forkbomb rockt

Added: maven/sandbox/issue/rbot/dist/share/rbot/templates/keywords.rbot
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/templates/keywords.rbot?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/templates/keywords.rbot (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/templates/keywords.rbot Fri Dec 16 14:30:38 2005
@@ -0,0 +1,4 @@
+lb<=is=>http://linuxbrit.co.uk
+offended<=is=><reply><who> is offended!
+giblet<=is=><reply>daddy!
+rbot<=is=><reply>That's me! :-))

Added: maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/larts
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/larts?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/larts (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/larts Fri Dec 16 14:30:38 2005
@@ -0,0 +1,98 @@
+swaps <who>'s shampoo with nair
+installs windows on <who>'s machine
+forces <who> to use perl for 3 weeks
+registers <who>'s name with 50 known spammers
+resizes <who>'s terminal to 40x24
+takes <who>'s tea
+dispenses <who>'s email address to a few hundred 'bulk mailing services'
+pokes <who> in the eye
+beats <who> senseless with a 50lb Unix manual
+cats /dev/urandom into <who>'s ear
+signs <who> up for AOL
+enrolls <who> in Visual Basic 101
+sporks <who>
+drops a truckload of VAXen on <who>
+judo chops <who>
+resizes <who>'s terminal to 40x24
+formats <who>'s harddrive to fat12
+rm -rf's <who>
+stabs <who>
+steals <who>'s mojo
+strangles <who> with a doohicky mouse cord
+whacks <who> with the cluebat
+sells <who> on E-Bay
+uses <who> as a biological warfare study
+uses the "Customer Appreciation Bat" on <who>
+reads <who> some vogon poetry
+puts <who> in the Total Perspective Vortex
+casts <who> into the fires of Mt. Doom
+gives <who> a melvin
+turns over <who> to Agent Smith to be "bugged"
+takes away <who>'s internet connection
+pushes <who> past the Shoe Event Horizon
+counts "1, 2, 5... er... 3!" and hurls the Holy Handgrenade Of Antioch at <who>
+puts <who> in a nest of camel spiders
+makes <who> read slashdot at -1
+puts "alias vim=emacs" in <who>'s /etc/profile
+uninstalls ld from <who>'s system
+locks <who> in the Chateau d'If
+signs <who> up for getting hit on the head lessons
+makes <who> try to set up a Lexmark printer
+fills <who>'s Visene eyedrop bottle with lime juice
+casts <who> into the fires of Mt. Doom.
+gives <who> a Chicago Steamer
+rips off <who>'s arm, and uses it to beat them to death
+pierces <who>'s nose with a rusty paper hole puncher
+pokes <who> with a rusty nail
+puts sugar between <who>'s bedsheets
+pours sand into <who>'s oatmeal
+mixes epoxy into <who>'s toothpaste
+puts Icy-Hot in <who>'s lip balm
+straps <who> to a chair, and plays a endless low bitrate MP3 loop of "the world's most annoying sound" from "Dumb and Dumber"
+tells Dr. Dre that <who> was talking smack
+forces <who> to use a Commodore 64 for all their word processing
+smacks <who> in the face with a burlap sack full of broken glass
+puts <who> in a room with several heavily armed manic depressives
+makes <who> watch reruns of "Blue's Clues"
+puts lye in <who>'s coffee
+tattoos the Windows symbol on <who>'s ass
+lets Borg have his way with <who>
+signs <who> up for line dancing classes at the local senior center
+wakes <who> out of a sound sleep with some brand new nipple piercings
+gives <who> a 2 guage Prince Albert
+forces <who> to eat all their veggies
+covers <who>'s toilet paper with lemon-pepper
+fills <who>'s ketchup bottle with Dave's Insanity sauce
+forces <who> to stare at an incredibly frustrating and seemingly neverending IRC political debate
+knocks two of <who>'s teeth out with a 2x4
+removes debian from <who>'s system
+uses <who>'s debian cds for skeet shooting practice
+gives <who>'s phone number to Borg
+posts <who>'s IP and root password on alt.2600
+forces <who> to use words like "irregardless" and "administrate" (thereby sounding like a real dumbass)"
+tickles <who> until they wet their pants and pass out
+replaces <who>'s KY with elmer's clear wood glue
+replaces <who>'s TUMS with alka-seltzer tablets
+squeezes habanero pepper juice into <who>'s tub of vaseline for <who>
+submits <who>'s photo to the people at SA for photoshopping
+Forces <who> to learn the Win32 API
+gives <who> an atomic wedgie
+ties <who> to a chair and forces them to listen to 'N Sync at full blast
+forces <who> to use emacs for text editing
+frowns at <who> really really hard
+jabs a hot car lighter into <who>'s eye sockets
+forces <who> to browse the web with IE
+takes <who> out at the knees with a broken pool cue
+forces <who> to listen to only emo music
+signs <who> up for the Iowa State Ferret Legging Championship
+attempts to hotswap <who>'s RAM
+donkey punches <who>
+puts track spikes into <who>'s side
+replaces <who>'s Astroglide with JB Weld
+replaces <who>'s hypertension pills with rat poison pellets
+replaces <who>s jock itch cream with Nair
+does the Australian Death Grip on <who>
+dances upon the grave of <who>'s ancestors.
+farts in <who>'s general direction
+flogs <who> with stinging neddle
+hands <who> a poison ivy joint

Added: maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/praises
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/praises?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/praises (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/templates/lart/praises Fri Dec 16 14:30:38 2005
@@ -0,0 +1,5 @@
+hugs <who>
+gives <who> some love
+gives <who> a cookie
+slaps <who> heartily on the back
+tickles <who>

Added: maven/sandbox/issue/rbot/dist/share/rbot/templates/levels.rbot
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/templates/levels.rbot?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/templates/levels.rbot (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/templates/levels.rbot Fri Dec 16 14:30:38 2005
@@ -0,0 +1,30 @@
+100 auth
+90 quit
+90 restart
+85 config
+80 nick
+80 nickserv
+80 qauth
+80 http
+70 opme
+70 mode
+70 say
+70 action
+40 quiet
+40 talk
+50 part
+50 hide
+50 join
+15 delquote
+12 msginsult
+12 remind_other
+5 rmlart
+5 rmpraise
+5 keycmd
+5 lart
+5 addlart
+5 addpraise
+5 remind
+5 keyword
+5 addquote
+5 getquote

Added: maven/sandbox/issue/rbot/dist/share/rbot/templates/users.rbot
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/share/rbot/templates/users.rbot?rev=357245&view=auto
==============================================================================
--- maven/sandbox/issue/rbot/dist/share/rbot/templates/users.rbot (added)
+++ maven/sandbox/issue/rbot/dist/share/rbot/templates/users.rbot Fri Dec 16 14:30:38 2005
@@ -0,0 +1 @@
+10 *!*@*

Added: maven/sandbox/issue/rbot/dist/users.rbot
URL: http://svn.apache.org/viewcvs/maven/sandbox/issue/rbot/dist/users.rbot?rev=357245&view=auto
==============================================================================
    (empty)