#!/usr/bin/env ruby

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

PORT = 8293 # portを指定
join_member = {} # 参加者を管理するハッシュを初期化

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

EM::WebSocket.start({     # EventMachineを使用してWebSocket server を起動
    host: '0.0.0.0',        # すべてのネットワーク・インターフェースを表す
    port: PORT
}) do |em_ws|
    join_member[em_ws] = true
    puts "現在の参加者数: #{join_member.length}"

    em_ws.onopen do                 # クライエントが接続したときのイベント
        em_ws.send "Ruby:接続されたよ！"       # 接続したクライエントにメッセージを送る
        puts "Ruby:clientが接続されました"
    end

    em_ws.onmessage do |msg|          # クライエントからメッセージを受信したときのイベント
        begin
            # ここでjsonデータかの判別を行う（例）
            json_data = JSON.parse(msg)   # 例としてJSON形式に変換
            puts "受信したメッセージ: #{json_data}"
        rescue JSON::ParserError => error # JSONのパースに失敗した場合
            puts "JSONパースエラー: #{error.message}"
            puts "受信したメッセージ: #{msg}"
        end

        em_ws.send "Ruby:サーバにメッセージ届きました！" # メッセージが来たことをクライエントに知らせる
    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
