Newer
Older
server / ruby / a.rb
@Nakagawa.K Nakagawa.K on 4 Aug 2024 3 KB 追加
#!/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