#!/usr/bin/env ruby

require 'em-websocket' #websoketライブラリ
require 'pp' #人間が読みやすいように表示してくれる
require 'json' #json形式にしたり、直したりする

PORT = 8080 #portを指定
join_member = {}

puts "参加者が入ったら表示するよ"

EM::WebSocket.start({ #EventMachienを使用してWebsocket server を起動 (簡単に言えば非同期処理できる)
    :host => '0.0.0.0', #すべてのネットワーク・インターフェースを表す、別ホストからでもアクセスできる
    :port => PORT
}) do |em_ws|
    puts em_ws
    join_member[em_ws] = true
    puts "現在の参加者数: #{join_member.length}"
    puts join_member.length 

    em_ws.onopen do #onopen:クライエントが接続したときに呼び出されるイベント
        printf("Ruby:clientが接続されました\n") #あとで誰が接続されたかデータ来るところにするーー
    end

    em_ws.onmessage do |msg| #onmassage:クライエントからメッセージを受信したときに呼び出されるイベント
        # jsonデータかの判別
        begin # 例外が発生する可能性のあるコードブロックの開始、このブロックでエラーがあれがrescue節に移る
            join_member.each do |key, value|
            key.send(msg)
            end
        rescue => error # beginブロック内で例外が発生した場合に実行される、エラーはerrorという変数に格納
            puts error.message
            puts msg
        end
    end

    em_ws.onclose do #クライエントが接続を閉じたときに呼び出されるイベント
        puts "Ruby:clientが接続を閉じました" #あとで誰抜けたかデータ持ってくるーー
        join_member.delete(em_ws)
        puts join_member.length
    end

    em_ws.onerror do |error| #エラーが発生したときに呼び出されるイベント
        puts "Ruby:Error: #{error.message}" 
    end

end
