class IrcReconnectGuard
Back off and stagger reconnects when Undernet throttles or G-lines the host.
Constants
- DEFAULT_DRONE_FLOOR
- DEFAULT_STAGGER_MAX_SEC
- DEFAULT_STAGGER_MIN_SEC
- DEFAULT_THROTTLE_FLOOR
- DRONE_PATTERN
- FALLBACK_POLL_INTERVAL_SEC
- GLINES_URL
- THROTTLE_PATTERN
Public Class Methods
Source
# File lib/irc_reconnect_guard.rb, line 43 def self.drone_reconnect_floor value = ENV.fetch("RABBOT_DRONE_RECONNECT_FLOOR", DEFAULT_DRONE_FLOOR).to_i value.positive? ? value : DEFAULT_DRONE_FLOOR end
Source
# File lib/irc_reconnect_guard.rb, line 30 def self.stagger_for(bot) return 0 if ENV["RABBOT_CONNECT_STAGGER"] == "0" seed = Zlib.crc32(bot.config.nick.to_s) max = ENV.fetch("RABBOT_CONNECT_STAGGER_MAX_SEC", DEFAULT_STAGGER_MAX_SEC).to_i min = ENV.fetch("RABBOT_CONNECT_STAGGER_MIN_SEC", DEFAULT_STAGGER_MIN_SEC).to_i max = DEFAULT_STAGGER_MAX_SEC if max <= 0 min = DEFAULT_STAGGER_MIN_SEC if min < 0 min = [min, max].min span = [max - min, 0].max min + (seed % (span + 1)) end
Source
# File lib/irc_reconnect_guard.rb, line 25 def self.throttle_reconnect_floor value = ENV.fetch("RABBOT_THROTTLE_RECONNECT_FLOOR", DEFAULT_THROTTLE_FLOOR).to_i value.positive? ? value : DEFAULT_THROTTLE_FLOOR end
Public Instance Methods
Source
# File lib/irc_reconnect_guard.rb, line 75 def on_connect(_m) IrcServerFallback.on_registered!(bot) end
Source
# File lib/irc_reconnect_guard.rb, line 67 def on_disconnect(_m) stagger = self.class.stagger_for(bot) return unless stagger.positive? bot.loggers.info("[reconnect] staggering retry by #{stagger}s") sleep stagger end
Source
# File lib/irc_reconnect_guard.rb, line 48 def on_server_line(m) text = m.to_s drone = drone_message?(text) return unless throttle_message?(text) || drone current = bot.instance_variable_get(:@reconnects).to_i floor = drone ? self.class.drone_reconnect_floor : self.class.throttle_reconnect_floor bumped = [current, floor].max bot.instance_variable_set(:@reconnects, bumped) if drone bot.loggers.warn( "[irc] BLOCKED by Undernet drone G-line — stop all bots and request removal: #{GLINES_URL}" ) end bot.loggers.info( "[reconnect] server rejected connection — backing off #{2**bumped}s (floor=#{floor})" ) end
Source
# File lib/irc_reconnect_guard.rb, line 79 def poll_server_fallback IrcServerFallback.tick!(bot) end