class Game < HttpRouter def initialize(players: []) @players = players @http_debounce = 0 route do |routes| @players.each do |player| routes.get "/#{player.id}/progress" do |req| if @current_scene_name == :host_scene req.respond 200, "{ \"progress\": #{player.progress} }" end end routes.post "/#{player.id}/step" do |req| if @current_scene_name == :host_scene player.progress += 1 player.progress = player.progress % player.course.coords.size req.respond 200 end end end end end def tick super poll_progress unless @current_scene_name == :host_scene end private def poll_progress return if @http_debounce.elapsed_time < 30 @http_debounce = Kernel.tick_count @players.each do |player| @progress_result[player.id] ||= GTK.http_get "http://localhost:3000/#{player.id}/progress" # wait until response is complete if @progress_result[player.id] && @progress_result[player.id][:complete] if @progress_result[player.id][:http_response_code] == 200 new_progress = GTK.parse_json(@progress_result[player.id][:response_data])["progress"] # ... handle state update in "player" scenes end end end end end