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