require 'bundler/setup' Bundler.require require 'sinatra/reloader' if development? require 'sinatra-websocket' require 'active_support' require 'active_support/core_ext' require 'logger' enable :sessions configure do #どの環境でも起動時に1回だけ実行される set :flags => (1..6).to_a.map{|i| [i, 0]}.to_h #どのチームが押したか管理するためのハッシュ end set :server, 'thin' set :sockets, [] logger = Logger.new(STDOUT) get '/' do if session[:team].blank? #チームがsetされていないときに選択画面に遷移する erb :select else pushed=Array.new settings.flags.sort_by{|key,value| value}.each do |key, value| if value==0 next else pushed.push("<li>チーム#{key}</li>") end end @pushed=pushed.join("\n") erb :index end end get '/websocket' do if request.websocket? #WebSocket通信かどうかを確認 request.websocket do |ws| ws.onopen do #最初に開いたときの処理 settings.sockets << ws end ws.onmessage do |btn| #ボタン or resetが押された時の処理 logger.debug(btn) if session[:team].present? && btn=="Stop!" if session[:team]>=1 && session[:team]<=6 && settings.flags[session[:team]]==0 settings.flags[session[:team]] = settings.flags.values.inject(:+) + 1 t_name="チーム#{session[:team]}" logger.debug(settings.flags) settings.sockets.each do |s| s.send(t_name) end end elsif session[:admin].present? && btn=="Delete!" #controllerでresetを押された時の処理 if session[:admin]==8804912 settings.sockets.each do |s| settings.flags=(1..6).to_a.map{|i| [i, 0]}.to_h logger.debug(settings.flags) s.send("Delete!") end end end end ws.onclose do #ブラウザ閉じたりとかしてWebSocket通信が切れた時の処理 settings.sockets.delete(ws) end end end end post '/setteam' do #チーム決定ボタンを押した時の処理 t_num=params[:t_num].to_i if t_num>=1 && t_num<=6 session[:team]=t_num redirect "/" else session.clear erb :error end end get '/resetteam' do #チーム再選択ボタンを押した時の処理 session.clear #チーム番号を保持しているセッションを消す redirect "/" end get '/controller' do #出題者が操作するページ session[:admin]=8804912 pushed=Array.new settings.flags.sort_by{|key,value| value}.each do |key, value| if value==0 next else pushed.push("<li>チーム#{key}</li>") end end @pushed=pushed.join("\n") erb :controller end