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的なのとかちょこちょこ入れた。