diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-09-13 00:14:53 +0000 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-09-13 00:14:53 +0000 |
commit | 922c6a35bb34598da397d2a0078adc397e84a853 (patch) | |
tree | 1cf50d155810dfc2bb48818e624137e0cd44884e | |
parent | 211ec431c1fe0cd5eba3a45b90c9267da3c125ae (diff) |
more rdoc-ification
-rw-r--r-- | data/rbot/plugins/rss.rb | 18 | ||||
-rw-r--r-- | lib/rbot/core/utils/utils.rb | 41 | ||||
-rw-r--r-- | lib/rbot/irc.rb | 6 | ||||
-rw-r--r-- | lib/rbot/ircbot.rb | 6 | ||||
-rw-r--r-- | lib/rbot/rfc2812.rb | 975 | ||||
-rw-r--r-- | lib/rbot/timer.rb | 68 |
6 files changed, 634 insertions, 480 deletions
diff --git a/data/rbot/plugins/rss.rb b/data/rbot/plugins/rss.rb index 5a87e789..5e7eff21 100644 --- a/data/rbot/plugins/rss.rb +++ b/data/rbot/plugins/rss.rb @@ -283,15 +283,15 @@ class RSSFeedsPlugin < Plugin # the restore to work.
#
# This is actually pretty safe for a number of reasons:
- # * the code is only called if standard marshalling fails
- # * the string we look for is quite unlikely to appear randomly
- # * if the string appears somewhere and the patched string isn't recoverable
- # either, we'll get another (unrecoverable) error, which makes the rss
- # plugin unsable, just like it was if no recovery was attempted
- # * if the string appears somewhere and the patched string is recoverable,
- # we may get a b0rked feed, which is eventually overwritten by a clean
- # one, so the worst thing that can happen is that a feed update spams
- # the watchers once
+ # * the code is only called if standard marshalling fails
+ # * the string we look for is quite unlikely to appear randomly
+ # * if the string appears somewhere and the patched string isn't recoverable
+ # either, we'll get another (unrecoverable) error, which makes the rss
+ # plugin unsable, just like it was if no recovery was attempted
+ # * if the string appears somewhere and the patched string is recoverable,
+ # we may get a b0rked feed, which is eventually overwritten by a clean
+ # one, so the worst thing that can happen is that a feed update spams
+ # the watchers once
@registry.recovery = Proc.new { |val|
patched = val.sub(":\v@mutexo:\nMutex", ":\v@mutexo:\vObject")
ret = Marshal.restore(patched)
diff --git a/lib/rbot/core/utils/utils.rb b/lib/rbot/core/utils/utils.rb index a33f072f..a4f071a2 100644 --- a/lib/rbot/core/utils/utils.rb +++ b/lib/rbot/core/utils/utils.rb @@ -317,7 +317,7 @@ rescue LoadError else module ::Irc module Utils - # define some regular expressions to be used for first_html_par + # Define some regular expressions to be used by first_html_par # H1, H2, etc HX_REGEX = /<h(\d)(?:\s+[^>]*)?>(.*?)<\/h\1>/im @@ -337,15 +337,17 @@ end module ::Irc - # miscellaneous useful functions + # Miscellaneous useful functions module Utils @@bot = nil unless defined? @@bot @@safe_save_dir = nil unless defined?(@@safe_save_dir) + # The bot instance def Utils.bot @@bot end + # Set up some Utils routines which depend on the associated bot. def Utils.bot=(b) debug "initializing utils" @@bot = b @@ -353,12 +355,18 @@ module ::Irc end + # Seconds per minute SEC_PER_MIN = 60 + # Seconds per hour SEC_PER_HR = SEC_PER_MIN * 60 + # Seconds per day SEC_PER_DAY = SEC_PER_HR * 24 + # Seconds per (30-day) month SEC_PER_MNTH = SEC_PER_DAY * 30 + # Second per (30*12 = 360 day) year SEC_PER_YR = SEC_PER_MNTH * 12 + # Auxiliary method needed by Utils.secs_to_string def Utils.secs_to_string_case(array, var, string, plural) case var when 1 @@ -368,8 +376,8 @@ module ::Irc end end - # turn a number of seconds into a human readable string, e.g - # 2 days, 3 hours, 18 minutes, 10 seconds + # Turn a number of seconds into a human readable string, e.g + # 2 days, 3 hours, 18 minutes and 10 seconds def Utils.secs_to_string(secs) ret = [] years, secs = secs.divmod SEC_PER_YR @@ -395,9 +403,12 @@ module ::Irc end + # Execute an external program, returning a String obtained by redirecting + # the program's standards errors and output + # def Utils.safe_exec(command, *args) - IO.popen("-") {|p| - if(p) + IO.popen("-") { |p| + if p return p.readlines.join("\n") else begin @@ -414,6 +425,11 @@ module ::Irc end + # Safely (atomically) save to _file_, by passing a tempfile to the block + # and then moving the tempfile to its final location when done. + # + # call-seq: Utils.safe_save(file, &block) + # def Utils.safe_save(file) raise 'No safe save directory defined!' if @@safe_save_dir.nil? basename = File.basename(file) @@ -425,6 +441,9 @@ module ::Irc end + # Decode HTML entities in the String _str_, using HTMLEntities if the + # package was found, or UNESCAPE_TABLE otherwise. + # def Utils.decode_html_entities(str) if defined? ::HTMLEntities return HTMLEntities.decode_entities(str) @@ -447,9 +466,9 @@ module ::Irc # # It is possible to pass some options to determine how the stripping # occurs. Currently supported options are - # * :strip => Regex or String to strip at the beginning of the obtained - # text - # * :min_spaces => Minimum number of spaces a paragraph should have + # strip:: Regex or String to strip at the beginning of the obtained + # text + # min_spaces:: minimum number of spaces a paragraph should have # def Utils.ircify_first_html_par(xml_org, opts={}) if defined? ::Hpricot @@ -459,7 +478,7 @@ module ::Irc end end - # with hpricot + # HTML first par grabber using hpricot def Utils.ircify_first_html_par_wh(xml_org, opts={}) doc = Hpricot(xml_org) @@ -556,7 +575,7 @@ module ::Irc end end - # without hpricot + # HTML first par grabber without hpricot def Utils.ircify_first_html_par_woh(xml_org, opts={}) xml = xml_org.gsub(/<!--.*?-->/m, '').gsub(/<script(?:\s+[^>]*)?>.*?<\/script>/im, "").gsub(/<style(?:\s+[^>]*)?>.*?<\/style>/im, "") diff --git a/lib/rbot/irc.rb b/lib/rbot/irc.rb index 6a0bb2a2..371762cb 100644 --- a/lib/rbot/irc.rb +++ b/lib/rbot/irc.rb @@ -503,9 +503,9 @@ class Regexp # Irc::User nicks and users and Irc::Channel names
#
# For each of them we define two versions of the regular expression:
- # * a generic one, which should match for any server but may turn out to
- # match more than a specific server would accept
- # * an RFC-compliant matcher
+ # * a generic one, which should match for any server but may turn out to
+ # match more than a specific server would accept
+ # * an RFC-compliant matcher
#
module Irc
diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb index ca40e0d6..3b42a3aa 100644 --- a/lib/rbot/ircbot.rb +++ b/lib/rbot/ircbot.rb @@ -338,9 +338,9 @@ class Bot unless botclass and not botclass.empty? # We want to find a sensible default. - # * On POSIX systems we prefer ~/.rbot for the effective uid of the process - # * On Windows (at least the NT versions) we want to put our stuff in the - # Application Data folder. + # * On POSIX systems we prefer ~/.rbot for the effective uid of the process + # * On Windows (at least the NT versions) we want to put our stuff in the + # Application Data folder. # We don't use any particular O/S detection magic, exploiting the fact that # Etc.getpwuid is nil on Windows if Etc.getpwuid(Process::Sys.geteuid) diff --git a/lib/rbot/rfc2812.rb b/lib/rbot/rfc2812.rb index 2d4d323b..9de781a8 100644 --- a/lib/rbot/rfc2812.rb +++ b/lib/rbot/rfc2812.rb @@ -1,35 +1,50 @@ +#-- vim:sw=2:et +#++ +# +# :title: RFC 2821 Client Protocol module +# +# This module defines the Irc::Client class, a class that can handle and +# dispatch messages based on RFC 2821i (Internet Relay Chat: Client Protocol) + module Irc - # RFC 2812 Internet Relay Chat: Client Protocol - # - RPL_WELCOME=001 + # - The server sends Replies 001 to 004 to a user upon + # successful registration. + # "Welcome to the Internet Relay Network # <nick>!<user>@<host>" - RPL_YOURHOST=002 + # + RPL_WELCOME=001 + # "Your host is <servername>, running version <ver>" - RPL_CREATED=003 + RPL_YOURHOST=002 + # "This server was created <date>" + RPL_CREATED=003 + + # "<servername> <version> <available user modes> <available channel modes>" RPL_MYINFO=004 - # "<servername> <version> <available user modes> - # <available channel modes>" + + # "005 nick PREFIX=(ov)@+ CHANTYPES=#& :are supported by this server" # - # - The server sends Replies 001 to 004 to a user upon - # successful registration. + # defines the capabilities supported by the server. # - # RPL_BOUNCE=005 - # # "Try server <server name>, port <port number>" - RPL_ISUPPORT=005 - # "005 nick PREFIX=(ov)@+ CHANTYPES=#& :are supported by this server" + # Previous RFCs defined message 005 as follows: # # - 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. + # server. This is often used when the connection is + # refused because the server is already full. # - RPL_USERHOST=302 + # # "Try server <server name>, port <port number>" + # + # RPL_BOUNCE=005 + # + RPL_ISUPPORT=005 + # ":*1<reply> *( " " <reply> )" # # - Reply format used by USERHOST to list replies to - # the query list. The reply string is composed as - # follows: + # the query list. The reply string is composed as + # follows: # # reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname # @@ -38,138 +53,158 @@ module Irc # whether the client has set an AWAY message or not # respectively. # - RPL_ISON=303 + RPL_USERHOST=302 + # ":*1<nick> *( " " <nick> )" # # - Reply format used by ISON to list replies to the - # query list. + # query list. # - RPL_AWAY=301 + RPL_ISON=303 + + # - 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. + # "<nick> :<away message>" - RPL_UNAWAY=305 + RPL_AWAY=301 + # ":You are no longer marked as being away" - RPL_NOWAWAY=306 + RPL_UNAWAY=305 + # ":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 + RPL_NOWAWAY=306 + + # - 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. + # "<nick> <user> <host> * :<real name>" - RPL_WHOISSERVER=312 + RPL_WHOISUSER=311 + # "<nick> <server> :<server info>" - RPL_WHOISOPERATOR=313 + RPL_WHOISSERVER=312 + # "<nick> :is an IRC operator" - RPL_WHOISIDLE=317 + RPL_WHOISOPERATOR=313 + # "<nick> <integer> :seconds idle" - RPL_ENDOFWHOIS=318 + RPL_WHOISIDLE=317 + # "<nick> :End of WHOIS list" - RPL_WHOISCHANNELS=319 + RPL_ENDOFWHOIS=318 + # "<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 + RPL_WHOISCHANNELS=319 + + # - 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). + # "<nick> <user> <host> * :<real name>" - RPL_ENDOFWHOWAS=369 + RPL_WHOWASUSER=314 + # "<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 + RPL_ENDOFWHOWAS=369 + + # - 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. + # Obsolete. Not used. - # - RPL_LIST=322 + RPL_LISTSTART=321 + # "<channel> <# visible> :<topic>" - RPL_LISTEND=323 + RPL_LIST=322 + # ":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 + RPL_LISTEND=323 + # "<channel> <nickname>" - # - RPL_CHANNELMODEIS=324 + RPL_UNIQOPIS=325 + # "<channel> <mode> <mode params>" - # - RPL_NOTOPIC=331 + RPL_CHANNELMODEIS=324 + # "<channel> :No topic is set" - RPL_TOPIC=332 - # "<channel> :<topic>" - # + RPL_NOTOPIC=331 + # - 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 topic, one of two replies is sent. If + # the topic is set, RPL_TOPIC is sent back else + # RPL_NOTOPIC. + + # "<channel> :<topic>" + RPL_TOPIC=332 + # <channel> <set by> <unixtime> - RPL_INVITING=341 + RPL_TOPIC_INFO=333 + # "<channel> <nick>" # # - Returned by the server to indicate that the - # attempted INVITE message was successful and is - # being passed onto the end client. + # attempted INVITE message was successful and is + # being passed onto the end client. # - RPL_SUMMONING=342 + RPL_INVITING=341 + # "<user> :Summoning user to IRC" # # - Returned by a server answering a SUMMON message to - # indicate that it is summoning that user. + # indicate that it is summoning that user. # - RPL_INVITELIST=346 + RPL_SUMMONING=342 + # "<channel> <invitemask>" - RPL_ENDOFINVITELIST=347 + RPL_INVITELIST=346 + # "<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. + # 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 + RPL_ENDOFINVITELIST=347 + # "<channel> <exceptionmask>" - RPL_ENDOFEXCEPTLIST=349 + RPL_EXCEPTLIST=348 + # "<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. + # 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 + RPL_ENDOFEXCEPTLIST=349 + # "<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 @@ -178,276 +213,307 @@ module Irc # The "comments" field may contain any comments about # the version or further version details. # - RPL_WHOREPLY=352 + RPL_VERSION=351 + + # - 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. + # "<channel> <user> <host> <server> <nick> # ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] # :<hopcount> <real name>" # - RPL_ENDOFWHO=315 + RPL_WHOREPLY=352 + # "<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 + RPL_ENDOFWHO=315 + + # - 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. + # "( "=" / "*" / "@" ) <channel> # :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) # - "@" is used for secret channels, "*" for private # channels, and "=" for others (public channels). # - RPL_ENDOFNAMES=366 + RPL_NAMREPLY=353 + # "<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 + RPL_ENDOFNAMES=366 + + # - 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. + # "<mask> <server> :<hopcount> <server info>" - RPL_ENDOFLINKS=365 + RPL_LINKS=364 + # "<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 + RPL_ENDOFLINKS=365 + + # - 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. + # "<channel> <banmask>" - RPL_ENDOFBANLIST=368 + RPL_BANLIST=367 + # "<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 + RPL_ENDOFBANLIST=368 + + # - 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. + # ":<string>" - RPL_ENDOFINFO=374 + RPL_INFO=371 + # ":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" - # + RPL_ENDOFINFO=374 + # - 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 + + # ":- <server> Message of the day - " + RPL_MOTDSTART=375 + + # ":- <text>" + RPL_MOTD=372 + + # ":End of MOTD command" + RPL_ENDOFMOTD=376 + # ":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. + # just successfully issued an OPER message and gained + # operator status. # - RPL_REHASHING=382 + RPL_YOUREOPER=381 + # "<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. + # a REHASH message, an RPL_REHASHING is sent back to + # the operator. # - RPL_YOURESERVICE=383 + RPL_REHASHING=382 + # "You are service <servicename>" # # - Sent by the server to a service upon successful - # registration. + # registration. # - RPL_TIME=391 + RPL_YOURESERVICE=383 + # "<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. + # 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 + RPL_TIME=391 + + # - 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. + # ":UserID Terminal Host" - RPL_USERS=393 + RPL_USERSSTART=392 + # ":<username> <ttyline> <hostname>" - RPL_ENDOFUSERS=394 + RPL_USERS=393 + # ":End of users" - RPL_NOUSERS=395 + RPL_ENDOFUSERS=394 + # ":Nobody logged in" + RPL_NOUSERS=395 + + # - 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. # - # - 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 + # 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. + # "Link <version & debug level> <destination> # <next server> V<protocol version> # <link uptime in seconds> <backstream sendq> # <upstream sendq>" - RPL_TRACECONNECTING=201 + RPL_TRACELINK=200 + # "Try. <class> <server>" - RPL_TRACEHANDSHAKE=202 + RPL_TRACECONNECTING=201 + # "H.S. <class> <server>" - RPL_TRACEUNKNOWN=203 + RPL_TRACEHANDSHAKE=202 + # "???? <class> [<client IP address in dot form>]" - RPL_TRACEOPERATOR=204 + RPL_TRACEUNKNOWN=203 + # "Oper <class> <nick>" - RPL_TRACEUSER=205 + RPL_TRACEOPERATOR=204 + # "User <class> <nick>" - RPL_TRACESERVER=206 + RPL_TRACEUSER=205 + # "Serv <class> <int>S <int>C <server> # <nick!user|*!*>@<host|server> V<protocol version>" - RPL_TRACESERVICE=207 + RPL_TRACESERVER=206 + # "Service <class> <name> <type> <active type>" - RPL_TRACENEWTYPE=208 + RPL_TRACESERVICE=207 + # "<newtype> 0 <client name>" - RPL_TRACECLASS=209 + RPL_TRACENEWTYPE=208 + # "Class <class> <count>" - RPL_TRACERECONNECT=210 + RPL_TRACECLASS=209 + # Unused. - RPL_TRACELOG=261 + RPL_TRACERECONNECT=210 + # "File <logfile> <debug level>" - RPL_TRACEEND=262 + RPL_TRACELOG=261 + # "<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 + RPL_TRACEEND=262 + # ":Current local users: 3 Max: 4" - RPL_GLOBALUSERS=266 + RPL_LOCALUSERS=265 + # ":Current global users: 3 Max: 4" - RPL_STATSCONN=250 + RPL_GLOBALUSERS=266 + # "::Highest connection count: 4 (4 clients) (251 since server was # (re)started)" - RPL_STATSLINKINFO=211 + RPL_STATSCONN=250 + # "<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. + # 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 + RPL_STATSLINKINFO=211 + # "<command> <count> <byte count> <remote count>" # # - reports statistics on commands usage. # - RPL_ENDOFSTATS=219 + RPL_STATSCOMMANDS=212 + # "<stats letter> :End of STATS report" # - RPL_STATSUPTIME=242 + RPL_ENDOFSTATS=219 + # ":Server Up %d days %d:%02d:%02d" # # - reports the server uptime. # - RPL_STATSOLINE=243 + RPL_STATSUPTIME=242 + # "O <hostmask> * <name>" # # - reports the allowed hosts from where user may become IRC - # operators. + # operators. # - RPL_UMODEIS=221 + RPL_STATSOLINE=243 + # "<user mode string>" # # - To answer a query about a client's own mode, - # RPL_UMODEIS is sent back. + # RPL_UMODEIS is sent back. # - RPL_SERVLIST=234 + RPL_UMODEIS=221 + + # - 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. + # "<name> <server> <mask> <type> <hopcount> <info>" - # - RPL_SERVLISTEND=235 + RPL_SERVLIST=234 + # "<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 + RPL_SERVLISTEND=235 + + # - 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. + # ":There are <integer> users and <integer> # services on <integer> servers" - RPL_LUSEROP=252 + RPL_LUSERCLIENT=251 + # "<integer> :operator(s) online" - RPL_LUSERUNKNOWN=253 + RPL_LUSEROP=252 + # "<integer> :unknown connection(s)" - RPL_LUSERCHANNELS=254 + RPL_LUSERUNKNOWN=253 + # "<integer> :channels formed" + RPL_LUSERCHANNELS=254 + + # ":I have <integer> clients and <integer> servers" 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 @@ -458,323 +524,385 @@ module Irc # and finally the administrative contact for the # server (an email address here is REQUIRED) # in RPL_ADMINEMAIL. - # - RPL_TRYAGAIN=263 + + # "<server> :Administrative info" + RPL_ADMINME=256 + + # ":<admin info>" + RPL_ADMINLOC1=257 + + # ":<admin info>" + RPL_ADMINLOC2=258 + + # ":<admin info>" + RPL_ADMINEMAIL=259 + # "<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. - # + # it MUST use the reply RPL_TRYAGAIN to inform the + # originating client. + RPL_TRYAGAIN=263 + # 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. + # command is currently unused. # - ERR_NOSUCHSERVER=402 + ERR_NOSUCHNICK=401 + # "<server name> :No such server" # # - Used to indicate the server name given currently - # does not exist. + # does not exist. # - ERR_NOSUCHCHANNEL=403 + ERR_NOSUCHSERVER=402 + # "<channel name> :No such channel" # # - Used to indicate the given channel name is invalid. # - ERR_CANNOTSENDTOCHAN=404 + ERR_NOSUCHCHANNEL=403 + # "<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. + # 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 + ERR_CANNOTSENDTOCHAN=404 + # "<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. + # number of allowed channels and they try to join + # another channel. # - ERR_WASNOSUCHNICK=406 + ERR_TOOMANYCHANNELS=405 + # "<nickname> :There was no such nickname" # # - Returned by WHOWAS to indicate there is no history - # information for that nickname. + # information for that nickname. # - ERR_TOOMANYTARGETS=407 + ERR_WASNOSUCHNICK=406 + # "<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. + # 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. + # 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. + # channel using the shortname when there are more than one + # such channel. # - ERR_NOSUCHSERVICE=408 + ERR_TOOMANYTARGETS=407 + # "<service name> :No such service" # # - Returned to a client which is attempting to send a SQUERY - # to a service which does not exist. + # to a service which does not exist. # - ERR_NOORIGIN=409 + ERR_NOSUCHSERVICE=408 + # ":No origin specified" # # - PING or PONG message missing the originator parameter. # - ERR_NORECIPIENT=411 + ERR_NOORIGIN=409 + # ":No recipient given (<command>)" - ERR_NOTEXTTOSEND=412 + ERR_NORECIPIENT=411 + + # - 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. + # ":No text to send" - ERR_NOTOPLEVEL=413 + ERR_NOTEXTTOSEND=412 + # "<mask> :No toplevel domain specified" - ERR_WILDTOPLEVEL=414 + ERR_NOTOPLEVEL=413 + # "<mask> :Wildcard in toplevel domain" - ERR_BADMASK=415 + ERR_WILDTOPLEVEL=414 + # "<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 + ERR_BADMASK=415 + # "<command> :Unknown command" # # - Returned to a registered client to indicate that the - # command sent is unknown by the server. + # command sent is unknown by the server. # - ERR_NOMOTD=422 + ERR_UNKNOWNCOMMAND=421 + # ":MOTD File is missing" # # - Server's MOTD file could not be opened by the server. # - ERR_NOADMININFO=423 + ERR_NOMOTD=422 + # "<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. + # when there is an error in finding the appropriate + # information. # - ERR_FILEERROR=424 + ERR_NOADMININFO=423 + # ":File error doing <file op> on <file>" # # - Generic error message used to report a failed file - # operation during the processing of a message. + # operation during the processing of a message. # - ERR_NONICKNAMEGIVEN=431 + ERR_FILEERROR=424 + # ":No nickname given" # # - Returned when a nickname parameter expected for a - # command and isn't found. + # command and isn't found. # - ERR_ERRONEUSNICKNAME=432 + ERR_NONICKNAMEGIVEN=431 + # "<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. + # characters which do not fall in the defined set. See + # section 2.3.1 for details on valid nicknames. # - ERR_NICKNAMEINUSE=433 + ERR_ERRONEUSNICKNAME=432 + # "<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. + # in an attempt to change to a currently existing + # nickname. # - ERR_NICKCOLLISION=436 + ERR_NICKNAMEINUSE=433 + # "<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). + # nickname collision (registered of a NICK that + # already exists by another server). # - ERR_UNAVAILRESOURCE=437 + ERR_NICKCOLLISION=436 + # "<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. + # 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. + # when the desired nickname is blocked by the nick delay + # mechanism. # - ERR_USERNOTINCHANNEL=441 + ERR_UNAVAILRESOURCE=437 + # "<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. + # user of the command is not on the given channel. # - ERR_NOTONCHANNEL=442 + ERR_USERNOTINCHANNEL=441 + # "<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. + # perform a channel affecting command for which the + # client isn't a member. # - ERR_USERONCHANNEL=443 + ERR_NOTONCHANNEL=442 + # "<user> <channel> :is already on channel" # # - Returned when a client tries to invite a user to a - # channel they are already on. + # channel they are already on. # - ERR_NOLOGIN=444 + ERR_USERONCHANNEL=443 + # "<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. - # + # user was unable to be performed since they were not + # logged in. # - ERR_SUMMONDISABLED=445 + ERR_NOLOGIN=444 + # ":SUMMON has been disabled" # # - Returned as a response to the SUMMON command. MUST be - # returned by any server which doesn't implement it. + # returned by any server which doesn't implement it. # - ERR_USERSDISABLED=446 + ERR_SUMMONDISABLED=445 + # ":USERS has been disabled" # # - Returned as a response to the USERS command. MUST be - # returned by any server which does not implement it. + # returned by any server which does not implement it. # - ERR_NOTREGISTERED=451 + ERR_USERSDISABLED=446 + # ":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. + # MUST be registered before the server will allow it + # to be parsed in detail. # - ERR_NEEDMOREPARAMS=461 + ERR_NOTREGISTERED=451 + # "<command> :Not enough parameters" # # - Returned by the server by numerous commands to - # indicate to the client that it didn't supply enough - # parameters. + # indicate to the client that it didn't supply enough + # parameters. # - ERR_ALREADYREGISTRED=462 + ERR_NEEDMOREPARAMS=461 + # ":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). + # change part of the registered details (such as + # password or user details from second USER message). # - ERR_NOPERMFORHOST=463 + ERR_ALREADYREGISTRED=462 + # ":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. + # a server which does not been setup to allow + # connections from the host the attempted connection + # is tried. # - ERR_PASSWDMISMATCH=464 + ERR_NOPERMFORHOST=463 + # ":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. + # a connection for which a password was required and + # was either not given or incorrect. # - ERR_YOUREBANNEDCREEP=465 + ERR_PASSWDMISMATCH=464 + # ":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 + # yourself with a server which has been setup to + # explicitly deny connections to you. # + ERR_YOUREBANNEDCREEP=465 + # - Sent by a server to a user to inform that access to the - # server will soon be denied. + # server will soon be denied. # - ERR_KEYSET=467 + ERR_YOUWILLBEBANNED=466 + # "<channel> :Channel key already set" - ERR_CHANNELISFULL=471 + ERR_KEYSET=467 + # "<channel> :Cannot join channel (+l)" - ERR_UNKNOWNMODE=472 + ERR_CHANNELISFULL=471 + # "<char> :is unknown mode char to me for <channel>" - ERR_INVITEONLYCHAN=473 + ERR_UNKNOWNMODE=472 + # "<channel> :Cannot join channel (+i)" - ERR_BANNEDFROMCHAN=474 + ERR_INVITEONLYCHAN=473 + # "<channel> :Cannot join channel (+b)" - ERR_BADCHANNELKEY=475 + ERR_BANNEDFROMCHAN=474 + # "<channel> :Cannot join channel (+k)" - ERR_BADCHANMASK=476 + ERR_BADCHANNELKEY=475 + # "<channel> :Bad Channel Mask" - ERR_NOCHANMODES=477 + ERR_BADCHANMASK=476 + # "<channel> :Channel doesn't support modes" - ERR_BANLISTFULL=478 + ERR_NOCHANMODES=477 + # "<channel> <char> :Channel list is full" # - ERR_NOPRIVILEGES=481 + ERR_BANLISTFULL=478 + # ":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. + # MUST return this error to indicate the attempt was + # unsuccessful. # - ERR_CHANOPRIVSNEEDED=482 + ERR_NOPRIVILEGES=481 + # "<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. + # MODE messages) MUST return this error if the client + # making the attempt is not a chanop on the specified + # channel. # # - ERR_CANTKILLSERVER=483 + ERR_CHANOPRIVSNEEDED=482 + # ":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. + # are to be refused and this error returned directly + # to the client. # - ERR_RESTRICTED=484 + ERR_CANTKILLSERVER=483 + # ":Your connection is restricted!" # # - Sent by the server to a user upon connection to indicate - # the restricted nature of the connection (user mode "+r"). + # the restricted nature of the connection (user mode "+r"). # - ERR_UNIQOPPRIVSNEEDED=485 + ERR_RESTRICTED=484 + # ":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. + # return this error if the client making the attempt is not + # a chanop on the specified channel. # - ERR_NOOPERHOST=491 + ERR_UNIQOPPRIVSNEEDED=485 + # ":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. + # not been configured to allow connections from the + # client's host as an operator, this error MUST be + # returned. # - ERR_UMODEUNKNOWNFLAG=501 + ERR_NOOPERHOST=491 + # ":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. + # message was sent with a nickname parameter and that + # the a mode flag sent was not recognized. # - ERR_USERSDONTMATCH=502 + ERR_UMODEUNKNOWNFLAG=501 + # ":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. + # user mode for a user other than themselves. # + ERR_USERSDONTMATCH=502 + # 5.3 Reserved numerics # # These numerics are not described above since they fall into one of @@ -785,7 +913,8 @@ module Irc # 2. reserved for future planned use; # # 3. in current use but are part of a non-generic 'feature' of - # the current IRC server. + # the current IRC server. + # RPL_SERVICEINFO=231 RPL_ENDOFSERVICES=232 RPL_SERVICE=233 @@ -811,14 +940,18 @@ module Irc ERR_NOSERVICEHOST=492 RPL_DATASTR=290 - # implements RFC 2812 and prior IRC RFCs. - # clients register handler proc{}s for different server events and Client - # handles dispatch + # Implements RFC 2812 and prior IRC RFCs. + # + # Clients should register Proc{}s to handle the various server events, and + # the Client class will handle dispatch. class Client - attr_reader :server, :user + # the Server we're connected to + attr_reader :server + # the User representing us on that server + attr_reader :user - # create a new Client instance + # Create a new Client instance def initialize @server = Server.new # The Server @user = @server.user("") # The User representing the client on this Server @@ -830,7 +963,7 @@ module Irc @tmpusers = [] end - # clear the server and reset the User + # Clear the server and reset the user def reset @server.clear @user = @server.user("") diff --git a/lib/rbot/timer.rb b/lib/rbot/timer.rb index 10a6f318..8adb14d8 100644 --- a/lib/rbot/timer.rb +++ b/lib/rbot/timer.rb @@ -26,19 +26,19 @@ class Timer # Time when the Action should be called next attr_accessor :next - # options are: - # start:: Time when the Action should be run for the first time. - # Repeatable Actions will be repeated after that, see - # :period. One-time Actions will not (obviously) - # Default: Time.now + :period - # period:: How often repeatable Action should be run, in seconds. - # Default: 1 - # blocked:: if true, Action starts as blocked (i.e. will stay dormant - # until unblocked) - # args:: Arguments to pass to the Action callback. Default: [] - # repeat:: Should the Action be called repeatedly? Default: false - # code:: You can specify the Action body using &block, *or* using - # this option. + # Options are: + # start:: Time when the Action should be run for the first time. + # Repeatable Actions will be repeated after that, see + # :period. One-time Actions will not (obviously) + # Default: Time.now + :period + # period:: How often repeatable Action should be run, in seconds. + # Default: 1 + # blocked:: if true, Action starts as blocked (i.e. will stay dormant + # until unblocked) + # args:: Arguments to pass to the Action callback. Default: [] + # repeat:: Should the Action be called repeatedly? Default: false + # code:: You can specify the Action body using &block, *or* using + # this option. def initialize(options = {}, &block) opts = { @@ -129,11 +129,12 @@ class Timer self.start end - # creates and installs a new Action, repeatable by default. - # period:: Action period - # opts:: options for Action#new, see there - # block:: Action callback code - # returns the id of the created Action + # Creates and installs a new Action, repeatable by default. + # _period_:: Action period + # _opts_:: options for Action#new, see there + # _block_:: Action callback code + # + # Returns the id of the created Action def add(period, opts = {}, &block) a = Action.new({:repeat => true, :period => period}.merge(opts), &block) self.synchronize do @@ -143,24 +144,25 @@ class Timer return a.object_id end - # creates and installs a new Action, one-time by default. - # period:: Action delay - # opts:: options for Action#new, see there - # block:: Action callback code - # returns the id of the created Action + # Creates and installs a new Action, one-time by default. + # _period_:: Action delay + # _opts_:: options for Action#new, see there + # _block_:: Action callback code + # + # Returns the id of the created Action def add_once(period, opts = {}, &block) self.add(period, {:repeat => false}.merge(opts), &block) end # blocks an existing Action - # aid:: Action id, obtained previously from add() or add_once() + # _aid_:: Action id, obtained previously from add() or add_once() def block(aid) debug "blocking #{aid}" self.synchronize { self[aid].block } end # unblocks an existing blocked Action - # aid:: Action id, obtained previously from add() or add_once() + # _aid_:: Action id, obtained previously from add() or add_once() def unblock(aid) debug "unblocking #{aid}" self.synchronize do @@ -170,7 +172,7 @@ class Timer end # removes an existing blocked Action - # aid:: Action id, obtained previously from add() or add_once() + # _aid_:: Action id, obtained previously from add() or add_once() def remove(aid) self.synchronize do @actions.delete(aid) # or raise "nonexistent action #{aid}" @@ -180,9 +182,9 @@ class Timer alias :delete :remove # Provides for on-the-fly reconfiguration of Actions - # aid:: Action id, obtained previously from add() or add_once() - # opts:: see Action#new - # block:: (optional) new Action callback code + # _aid_:: Action id, obtained previously from add() or add_once() + # _opts_:: see Action#new + # _block_:: (optional) new Action callback code def configure(aid, opts = {}, &block) self.synchronize do self[aid].configure(opts, &block) @@ -191,9 +193,9 @@ class Timer end # changes Action period - # aid:: Action id - # period:: new period - # block:: (optional) new Action callback code + # _aid_:: Action id + # _period_:: new period + # _block_:: (optional) new Action callback code def reschedule(aid, period, &block) self.configure(aid, :period => period, &block) end @@ -244,7 +246,7 @@ class Timer ensure @current = nil end - + unless v @actions.delete k next |