summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--lib/rbot/ircbot.rb8
-rw-r--r--lib/rbot/ircsocket.rb25
3 files changed, 35 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 1e74ab02..94795136 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-03-14 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+
+ * Socket filtering: socket data, both input and output, can now be
+ filtered. This is used for example to transcode all input and output
+ so that messages are internally managed as UTF-8. By default, the bot
+ will try cp1252 (Windows Western European) encoding for non-UTF-8
+ strings. Thanks to jsn (Dmitry Kim <dmitry.kim@gmail.com>).
+
2007-03-10 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
* IRC settings: ability to change the IRC name for the bot. Thanks to
diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb
index aee426b3..b58ebe2e 100644
--- a/lib/rbot/ircbot.rb
+++ b/lib/rbot/ircbot.rb
@@ -440,15 +440,15 @@ class Bot
@plugins = Plugins::pluginmanager
@plugins.bot_associate(self)
setup_plugins_path()
+
+ @socket = IrcSocket.new(@config['server.name'], @config['server.port'], @config['server.bindhost'], @config['server.sendq_delay'], @config['server.sendq_burst'], :ssl => @config['server.ssl'])
+ @client = Client.new
+
@plugins.scan
Utils.set_safe_save_dir("#{botclass}/safe_save")
@httputil = Utils::HttpUtil.new(self)
-
- @socket = IrcSocket.new(@config['server.name'], @config['server.port'], @config['server.bindhost'], @config['server.sendq_delay'], @config['server.sendq_burst'], :ssl => @config['server.ssl'])
- @client = Client.new
-
# Channels where we are quiet
# Array of channels names where the bot should be quiet
# '*' means all channels
diff --git a/lib/rbot/ircsocket.rb b/lib/rbot/ircsocket.rb
index 973ae9b8..5163e0ef 100644
--- a/lib/rbot/ircsocket.rb
+++ b/lib/rbot/ircsocket.rb
@@ -258,6 +258,26 @@ module Irc
# max lines to burst
attr_reader :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
+
+ # default trivial filter class
+ class IdentityFilter
+ def in(x)
+ x
+ end
+
+ def out(x)
+ x
+ end
+ end
+
+ # set filter to identity, not to nil
+ def filter=(f)
+ @filter = f || IdentityFilter.new
+ end
+
# server:: server to connect to
# port:: IRCd port
# host:: optional local host to bind to (ruby 1.7+ required)
@@ -271,6 +291,7 @@ module Irc
@port = port.to_i
@host = host
@sock = nil
+ @filter = IdentityFilter.new
@spooler = false
@lines_sent = 0
@lines_received = 0
@@ -380,7 +401,7 @@ module Irc
return nil
end
begin
- reply = @sock.gets
+ reply = @filter.in(@sock.gets)
@lines_received += 1
reply.strip! if reply
debug "RECV: #{reply.inspect}"
@@ -483,7 +504,7 @@ module Irc
if @sock.nil?
error "SEND attempted on closed socket"
else
- @sock.puts message
+ @sock.puts(@filter.out(message))
@last_send = Time.new
@flood_send += message.irc_send_penalty if penalty
@lines_sent += 1