2006年 11月 12日

偽 Ircv

http://lab.lowreal.net/trac/browser/c/mac/iicv.rb
いろいろ変えた。DRb のフロントオブジェクトである proc は write メソッド共通にしたので

class OutIO < IO
	def initialize(write_proc)
		@proc = write_proc
	end

	def write(arg)
		@proc.call(arg)
	end
end

$stdout = OutIO.new(DRb.new_with_uri(uri))

とかもできるはず。あとステータスアイテムを出すようにしたりとか、いろいろ変更した。

DRb クライアント側も

require 'drb/drb'
require "rice/irc"
require "rice/observer"

class Ircv < RICE::SimpleClient
	def initialize(uri, nick, user, username, pass, *channels)
		super(nick, user, username, pass, *channels)
		@o = DRbObject.new_with_uri(uri)
	end

	def uped(subject, message)
		super
	end

	def message(subject, message)
		_, nick, user, host = */(.*?)!(.*?)@(.*?)/.match(message.prefix)
		case message
		when RICE::Command::PRIVMSG
			line = "%s %s %s¥n" % [message.params[0], nick, message.params[1]]
			@o.call(line)
		when RICE::Command::NOTICE
			line = "%s %s %s¥n" % [message.params[0], nick, message.params[1]]
			@o.call(line)
		else
			type = "#{message.class.to_s.sub(/^.*::/o, '').downcase}"
			line = "%s %s %s¥n" % [type, nick, message.params.join(' ')]
			@o.call(line)
		end
	end

	def downed(subject, message)
		super
	end
end

o = Ircv.new("druby://localhost:9876", "ircv", "ircv", "ircv", "password")
c = RICE::Connection.new('host', 6667)
c.add_observer(o)

begin
	c.start
rescue RICE::Connection::Closed
	puts 'closed'
	sleep 30
	retry
end

みたいしてちょっと読みやすいようにした。