WebSocketからIRC繋げるやつ作った

今日Web Audioのハッカソンというかまあそんな感じのをしてて、音のなるIRC Client(on Browser)を作りたいと思って、そのクライアントを作るのを簡単にするために、WebSocketからIRC見たり、ポストしたり出来るようにしようと思って作った。Web Audioの会なのに、Audio関係するところまでいかずに終わってしまった。

https://github.com/ToQoz/ircmad

IRC <-> WebSoket Server(ここ作った) <-> WebSocket Client

こんな感じで立ち上げる

# proxy.rb
require 'ircmad'
Ircmad.new do
  set :host, '127.0.0.1'
  set :port, 6667
  set :channel_list, [ '#channel', '#channel2' ]
  set :username, 'username'
  set :password, 'password'  # 必要であれば
  set :websocket_port, 3333
end.run!
$ ruby proxy.rb

普通にonmessageにコールバック登録しておいたら、JSONが渡ってくるし、sendでJSON送ったら投稿できる。

var socket = new WebSocket('ws://localhost:3333')

// Send
socket.send(JSON.stringify({ channel: '#channel1', body: 'yeah' }))

// Get
socket.onmessage = function(msg) { console.log(msg.data) };
// => '{"username":"ToQoz","channel":"#channel1","body":"hello world"}'

ブラウザでIRCクライアントを作るとなるとちょっと面倒そうだけど、 こんな感じでWebSocketから扱えれば、簡単に作り放題だし、好きなの作れるかなと思った。

追記

サーバからの:PINGに対する PONG ってどーしてるんすか?

とのことですが、使用しているzirconというgemがやってくれています。 https://github.com/r7kamura/zircon/blob/master/lib/zircon.rb#L69

というかそもそもIRCとのやりとりは今のところ完全に任せっきりですね。

まあそれはともかくとして、IRC Server側が落ちた時とか長時間スリープした時(?)とかに微妙な感じなの、直したいと思っております。。

追記 v0.0.3

やりとりするjsonのフィールド名変えました。

at v0.0.3

var socket = new WebSocket('ws://localhost:3333')

// Send
socket.send(JSON.stringify({ to: '#channel1', body: 'yeah', type: 'privmsg' }))
socket.send(JSON.stringify({ type: 'join', to: '#ruby'}))

// Get
socket.onmessage = function(msg) { console.log(msg.data) };
// => '{"from":"ToQoz","to":"#channel1","body":"hello world","type":"privmsg"}'

// => {"from":"ToQoz","to":"#ruby","body":null,"type":"join"}
// => {"from":"hybrid7.debian.local","to":"ToQoz","body":"@","type":"353"}
// => {"from":"hybrid7.debian.local","to":"ToQoz","body":"#ruby","type":"366"}

あとreconnect的なのとかちょこちょこ入れた。