--- /dev/null
+module Irc
+
+require 'net/http'
+Net::HTTP.version_1_2
+
+# class for making http requests easier (mainly for plugins to use)
+# this class can check the bot proxy configuration to determine if a proxy
+# needs to be used, which includes support for per-url proxy configuration.
+class HttpUtil
+ def initialize(bot)
+ @bot = bot
+ end
+
+ # uri:: Uri to create a proxy for
+ #
+ # return a net/http Proxy object, which is configured correctly for
+ # proxying based on the bot's proxy configuration.
+ # This will include per-url proxy configuration based on the bot config
+ # +http_proxy_include/exclude+ options.
+ def get_proxy(uri)
+ proxy = nil
+ if (ENV['http_proxy'])
+ proxy = URI.parse ENV['http_proxy']
+ end
+ if (@bot.config["http_proxy"])
+ proxy = URI.parse ENV['http_proxy']
+ end
+
+ # if http_proxy_include or http_proxy_exclude are set, then examine the
+ # uri to see if this is a proxied uri
+ if uri
+ if @bot.config["http_proxy_exclude"]
+ # TODO
+ end
+ if @bot.config["http_proxy_include"]
+ end
+ end
+
+ proxy_host = nil
+ proxy_port = nil
+ proxy_user = nil
+ proxy_pass = nil
+ if @bot.config["http_proxy_user"]
+ proxy_user = @bot.config["http_proxy_user"]
+ if @bot.config["http_proxy_pass"]
+ proxy_pass = @bot.config["http_proxy_pass"]
+ end
+ end
+ if proxy
+ proxy_host = proxy.host
+ proxy_port = proxy.port
+ end
+
+ return Net::HTTP.new(uri.host, uri.port, proxy_host, proxy_port, proxy_user, proxy_port)
+ end
+
+ # uri:: uri to query (Uri object)
+ # readtimeout:: timeout for reading the response
+ # opentimeout:: timeout for opening the connection
+ #
+ # simple get request, returns response body if the status code is 200 and
+ # the request doesn't timeout.
+ def get(uri, readtimeout=10, opentimeout=5)
+ proxy = get_proxy(uri)
+ proxy.open_timeout = opentimeout
+ proxy.read_timeout = readtimeout
+
+ begin
+ proxy.start() {|http|
+ resp = http.get(uri)
+ if resp.code == "200"
+ return resp.body
+ end
+ return nil
+ }
+ rescue StandardError, Timeout::Error => e
+ $stderr.puts "HttpUtil.get exception: #{e}, while trying to get #{uri}"
+ end
+ return nil
+ end
+end
+
+end
require 'rbot/language'
require 'rbot/dbhash'
require 'rbot/registry'
+require 'rbot/httputil'
module Irc
# and restore objects in their own namespaces.)
attr_reader :registry
+ # bot's httputil help object, for fetching resources via http. Sets up
+ # proxies etc as defined by the bot configuration/environment
+ attr_reader :httputil
+
# create a new IrcBot with botclass +botclass+
def initialize(botclass)
@botclass = botclass.gsub(/\/$/, "")
@channels = Hash.new
@logs = Hash.new
+ @httputil = Irc::HttpUtil.new(self)
@lang = Irc::Language.new(@config["LANGUAGE"])
@keywords = Irc::Keywords.new(self)
@auth = Irc::IrcAuth.new(self)
return helpstr
end
+ def status
+ secs_up = Time.new - @startup_time
+ uptime = Utils.secs_to_string secs_up
+ return "Uptime #{uptime}, #{@plugins.length} plugins active, #{@registry.length} items stored in registry, #{@socket.lines_sent} lines sent, #{@socket.lines_received} received."
+ end
+
+
private
# handle help requests for "core" topics
puts @channels[m.channel].topic
end
- def status
- secs_up = Time.new - @startup_time
- uptime = Utils.secs_to_string secs_up
- return "Uptime #{uptime}, #{@plugins.length} plugins active, #{@registry.length} items stored in registry, #{@socket.lines_sent} lines sent, #{@socket.lines_received} received."
- end
-
# delegate a privmsg to auth, keyword or plugin handlers
def delegate_privmsg(message)
[@auth, @plugins, @keywords].each {|m|