From b970f0d43f6bf69e4aec75120a9bf27b412ec331 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Wed, 14 Mar 2007 01:19:01 +0000 Subject: [PATCH] Socket IO filtering: rbot can now assume UTF-8 internally. --- ChangeLog | 8 ++++++++ lib/rbot/ircbot.rb | 8 ++++---- lib/rbot/ircsocket.rb | 25 +++++++++++++++++++++++-- 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 + + * 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 ). + 2007-03-10 Giuseppe Bilotta * 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 -- 2.39.2