class Process::Roulette::Croupier::JoinHandler
The JoinHandler
encapsulates the “join” state of the croupier state machine. It listens for new connections, builds up the lists of players controllers, and indicates the next state (either 'start' or 'finish') based on the input from the controllers.
Public Class Methods
new(driver)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 14 def initialize(driver) @driver = driver @pending = JoinPending.new(driver) @next_state = nil end
Public Instance Methods
_controller_disconnected(socket)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 107 def _controller_disconnected(socket) type = socket.spectator? ? 'spectator' : 'controller' @driver.broadcast_update("#{type} has disconnected") @driver.controllers.delete(socket) end
_controller_exit()
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 118 def _controller_exit puts 'command given to exit' @next_state = FinishHandler end
_controller_go()
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 113 def _controller_go puts 'command given to start' @next_state = StartHandler end
_player_disconnected(socket)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 131 def _player_disconnected(socket) @driver.broadcast_update "player #{socket.username} has disconnected" @driver.players.delete(socket) end
_process_controller_packet(socket, packet)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 81 def _process_controller_packet(socket, packet) if socket.spectator? _process_spectator_packet(socket, packet) else _process_real_controller_packet(socket, packet) end end
_process_current_state(listener)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 34 def _process_current_state(listener) until @next_state ready = _wait_for_connections(listener) _process_ready_list(ready, listener) @pending.reap! @driver.reap! end end
_process_new_connection(socket)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 62 def _process_new_connection(socket) puts 'new pending connection...' client = socket.accept @pending << Process::Roulette::EnhanceSocket(client) end
_process_participant_connection(socket)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 68 def _process_participant_connection(socket) packet = socket.read_packet socket.ping! if packet if @pending.include?(socket) @pending.process(socket, packet) elsif @driver.controllers.include?(socket) _process_controller_packet(socket, packet) else _process_player_packet(socket, packet) end end
_process_player_packet(socket, packet)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 123 def _process_player_packet(socket, packet) case packet when nil then _player_disconnected(socket) when 'PING' then # do nothing else puts "unexpected comment from player (#{packet.inspect})" end end
_process_ready_list(list, listener)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 52 def _process_ready_list(list, listener) list.each do |socket| if socket == listener _process_new_connection(socket) else _process_participant_connection(socket) end end end
_process_real_controller_packet(socket, packet)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 89 def _process_real_controller_packet(socket, packet) case packet when nil then _controller_disconnected(socket) when 'GO' then _controller_go when 'EXIT' then _controller_exit when 'PING' then nil else puts "unexpected command from controller (#{packet.inspect})" end end
_process_spectator_packet(socket, packet)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 99 def _process_spectator_packet(socket, packet) case packet when nil then _controller_disconnected(socket) when 'PING' then # do nothing else puts "unexpected comment from spectator (#{packet.inspect})" end end
_wait_for_connections(*extras)
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 44 def _wait_for_connections(*extras) ready, = IO.select( [*extras, *@pending, *@driver.sockets], [], [], 1) ready || [] end
run()
click to toggle source
# File lib/process/roulette/croupier/join_handler.rb, line 20 def run @driver.players.clear puts 'listening...' listener = TCPServer.new(@driver.port) _process_current_state(listener) @pending.cleanup! listener.close @next_state end