From: Giuseppe Bilotta Date: Tue, 19 Aug 2008 18:19:45 +0000 (+0200) Subject: IRC socket: get rid of delay/burst X-Git-Url: https://git.netwichtig.de/gitweb/?a=commitdiff_plain;h=43b5cd9777cc13c6d3ac14a4015a0c8e8d9e5b50;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git IRC socket: get rid of delay/burst The penalty system should be enough to prevent the bot from being disconnected because of excess flood, making the old sendq delay/burst code unnecessary. So get rid of the latter altogether. (If the penalty system as implemented ever happens to be insufficient as implemented, it should just get fixed rather than rely on the sendq delay/burst assistance.) --- diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb index 4f5018e3..55b10d41 100644 --- a/lib/rbot/ircbot.rb +++ b/lib/rbot/ircbot.rb @@ -277,14 +277,6 @@ class Bot Config.register Config::IntegerValue.new('server.reconnect_wait', :default => 5, :validate => Proc.new{|v| v >= 0}, :desc => "Seconds to wait before attempting to reconnect, on disconnect") - Config.register Config::FloatValue.new('server.sendq_delay', - :default => 2.0, :validate => Proc.new{|v| v >= 0}, - :desc => "(flood prevention) the delay between sending messages to the server (in seconds)", - :on_change => Proc.new {|bot, v| bot.socket.sendq_delay = v }) - Config.register Config::IntegerValue.new('server.sendq_burst', - :default => 4, :validate => Proc.new{|v| v >= 0}, - :desc => "(flood prevention) max lines to burst to the server before throttling. Most ircd's allow bursts of up 5 lines", - :on_change => Proc.new {|bot, v| bot.socket.sendq_burst = v }) Config.register Config::IntegerValue.new('server.ping_timeout', :default => 30, :validate => Proc.new{|v| v >= 0}, :desc => "reconnect if server doesn't respond to PING within this many seconds (set to 0 to disable)") @@ -589,7 +581,7 @@ class Bot debug "server.list is now #{@config['server.list'].inspect}" end - @socket = Irc::Socket.new(@config['server.list'], @config['server.bindhost'], @config['server.sendq_delay'], @config['server.sendq_burst'], :ssl => @config['server.ssl']) + @socket = Irc::Socket.new(@config['server.list'], @config['server.bindhost'], :ssl => @config['server.ssl']) @client = Client.new @plugins.scan diff --git a/lib/rbot/ircsocket.rb b/lib/rbot/ircsocket.rb index 4ac98da3..81a7fd16 100644 --- a/lib/rbot/ircsocket.rb +++ b/lib/rbot/ircsocket.rb @@ -231,12 +231,6 @@ module Irc # accumulator for the throttle attr_reader :throttle_bytes - # delay between lines sent - attr_accessor :sendq_delay - - # max lines to burst - attr_accessor :sendq_burst - # an optional filter object. we call @filter.in(data) for # all incoming data and @filter.out(data) for all outgoing data attr_reader :filter @@ -263,7 +257,7 @@ module Irc # server_list:: list of servers to connect to # host:: optional local host to bind to (ruby 1.7+ required) # create a new Irc::Socket - def initialize(server_list, host, sendq_delay=2, sendq_burst=4, opts={}) + def initialize(server_list, host, opts={}) @server_list = server_list.dup @server_uri = nil @conn_count = 0 @@ -278,17 +272,6 @@ module Irc else @ssl = false end - - if sendq_delay - @sendq_delay = sendq_delay.to_f - else - @sendq_delay = 2 - end - if sendq_burst - @sendq_burst = sendq_burst.to_i - else - @sendq_burst = 4 - end end def connected? @@ -330,9 +313,8 @@ module Irc sock.connect end @sock = sock - @last_send = Time.new - @sendq_delay + @last_send = Time.new @flood_send = Time.new - @last_throttle = Time.new @burst = 0 @sock.extend(MonitorMixin) @sendq = MessageQueue.new @@ -405,7 +387,6 @@ module Irc error "error while shutting down: #{e.pretty_inspect}" end @sock = nil - @burst = 0 @sendq.clear end @@ -413,30 +394,17 @@ module Irc def writer_loop loop do - # we could wait for the message, then calculate the delay and sleep - # if necessary. however, if high-priority message is enqueued while - # we sleep, it won't be the first to go out when the sleep is over. - # thus, we have to call Time.now() twice, once to calculate the delay - # and once to adjust @burst / @flood_send. begin now = Time.now - if @sendq_delay > 0 - burst_delay = 0 - if @burst > @sendq_burst - burst_delay = @last_send + @sendq_delay - now - end - - flood_delay = @flood_send - MAX_IRC_SEND_PENALTY - now - delay = [burst_delay, flood_delay, 0].max - if delay > 0 - debug "sleep(#{delay}) # (f: #{flood_delay}, b: #{burst_delay})" - sleep(delay) - end + flood_delay = @flood_send - MAX_IRC_SEND_PENALTY - now + delay = [flood_delay, 0].max + if delay > 0 + debug "sleep(#{delay}) # (f: #{flood_delay})" + sleep(delay) end msg = @sendq.shift now = Time.now @flood_send = now if @flood_send < now - @burst = 0 if @last_send + @sendq_delay < now debug "got #{msg.inspect} from queue, sending" emergency_puts(msg, true) rescue Exception => e @@ -463,7 +431,6 @@ module Irc @last_send = Time.new @flood_send += message.irc_send_penalty if penalty @lines_sent += 1 - @burst += 1 end rescue Exception => e handle_socket_error(:SEND, e)