#!/usr/bin/env ruby require 'em-websocket' #websoketライブラリ require 'pp' #人間が読みやすいように表示してくれる require 'json' #json形式にしたり、直したりする PORT = 8888 #portを指定 button_clicker = [] clients_id_only = {} #クライエント puts "参加者が入ったら表示するよ" EM::WebSocket.start({ #EventMachienを使用してWebsocket server を起動 (簡単に言えば非同期処理できる) :host => '0.0.0.0', #すべてのネットワーク・インターフェースを表す、別ホストからでもアクセスできる :port => PORT, # :secure => true }) do |em_ws| clients_id_only[em_ws] = true printf("現在の接続人数は %d 人です\n", clients_id_only.length) em_ws.onopen do #onopen:クライエントが接続したときに呼び出されるイベント em_ws.send "Ruby:接続されたよ!" #接続したクライエントにメッセージを送る # printf("Ruby:clientが接続されました\n") #あとで誰が接続されたかデータ来るところにするーー em_ws.send(button_clicker.to_json) #途中参加した人も現在の早押しの順番を反映させるためにjsonを送る end em_ws.onmessage do |msg| #onmassage:クライエントからメッセージを受信したときに呼び出されるイベント # jsonデータかの判別 begin # 例外が発生する可能性のあるコードブロックの開始、このブロックでエラーがあれがrescue節に移る data = JSON.parse(msg) #json -> hash に変更 # puts data rescue => error # beginブロック内で例外が発生した場合に実行される、エラーはerrorという変数に格納 if msg.match(/ボタンを押しました/) msg.match(/(team\d)\sの\s([0-9a-z]+)\s/) hayaoshi(button_clicker, $1, $2) clients_id_only.each do |key, value| key.send(button_clicker.to_json) key.send("pushed button"); end p button_clicker elsif msg == "reset" button_clicker = [] p button_clicker clients_id_only.each do |key, value| key.send("reset"); end end # puts error.class puts error.message # puts error.backtrace # puts msg end # em_ws.send "Ruby:サーバにメッセージ届きました!" #メッセージが来たことをクライエントに知らせる end em_ws.onclose do #クライエントが接続を閉じたときに呼び出されるイベント puts "Ruby:clientが接続を閉じました" #あとで誰抜けたかデータ持ってくるーー clients_id_only.delete(em_ws) printf("現在の接続人数は %d 人です\n", clients_id_only.length) end em_ws.onerror do |error| #エラーが発生したときに呼び出されるイベント puts "Ruby:Error: #{error.message}" end def hayaoshi(array, team, name) flag = false array.each do |key, value| if key == team flag = true end end if flag == false array.push([team, name]) return "#{team} の #{name} さんがボタンを押しました!" else return "#{team} はもう押してます!" end end end