Rubyで動くIRCクライアントを、Ruby1.9で動くようにしてみた
http://d.hatena.ne.jp/curi1119/20080506/1210062892
こちらのまんまコピーですが、変更点などが色々中途半端なことに。ま、動いたからいいやの精神で。ターミナルにIRCの内容が表示され、そこで入力したことが、IRCの発言となります。
ruby1.9では動かないなー、なんでかなーThreadが1.8と1.9で違うからかな?と思ってたら単純にエンコードの問題でした。UTF-8とJISの文字列を結合させようとしていて失敗といいったところです。
iso-2022-jpはダミーエンコーディングだとかなんだかで、色々うまくいかず結局String.encodeを使わずKconvのままだとなんとか動きました。
Thread.abort_on_exception = trueなんてのが残ってたり、motd終了時を検知して、write threadを始めようとしてるけど、結局やってないのが残ってたりするのはご愛嬌ということで。
Thread.stop,Thread.runを使いたく無かったということなんですが、まあまたの機会に。
#coding:utf-8 require 'socket' require 'kconv' @server = "hoge" @port = 6667 @eol = "\r\n" @nick = "curi_ruby" @channel = "#hoge" def send_cmd(cmd) print "Sending command..... :#{cmd}\n" @irc.write(Kconv.tojis("#{cmd}#{@eol}")) end def login_and_join #server password #send_cmd("PASS YOUR_PASSWORD") send_cmd("USER curi_ruby, #{@server}, ignore, Curi") send_cmd("NICK #{@nick}") send_cmd("JOIN #{@channel}") end Thread.abort_on_exception = true read = Thread.new do Thread.stop while msg = Kconv.toutf8(@irc.gets).split print "#{msg.join(' ')}\n" send_cmd("PONG #{msg[1]}") if msg[0] == 'PING' if msg[1] == '376' || msg[1] == '422' # 376:end of motd, 422:error no motd @write_start = true end end end write = Thread.new do Thread.stop while input = gets.chop send_cmd("PRIVMSG #{@channel} #{input}") end end @irc = TCPSocket.new(@server, @port) login_and_join read.run write.run read.join write.join