class Process::Roulette::Croupier::StartHandler
The StartHandler
encapsulates the “start” state of the croupier state machine. It sends “GO” to all players, listens for their replies with the processes they intend to kill, and waits for all players to check in afterward. It manages the list if active players (removing those that fail to check-in) and transitions to the “restart” state when all players are dead.
Public Class Methods
new(driver)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 14 def initialize(driver) @driver = driver end
Public Instance Methods
_all_players_confirmed?()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 40 def _all_players_confirmed? @standing.all?(&:confirmed?) end
_handle_closed_socket(socket)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 83 def _handle_closed_socket(socket) if @standing.include?(socket) _player_died(socket) else @controllers.delete(socket) end end
_handle_player(socket, packet)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 98 def _handle_player(socket, packet) if socket.has_victim? && packet == 'OK' socket.confirmed! else socket.victim = packet end end
_is_player?(socket)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 79 def _is_player?(socket) @standing.include?(socket) end
_kill_unconfirmed_players()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 58 def _kill_unconfirmed_players @standing.select do |s| next true if s.confirmed? _player_died(s, remove: false) false end end
_player_died(socket, remove: true)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 91 def _player_died(socket, remove: true) socket.killed_at = Time.now socket.close @driver.broadcast_update("#{socket.username} died") @standing.delete(socket) if remove end
_prepare_live_players()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 44 def _prepare_live_players standing = @driver.players.select { |s| !s.killed? } @driver.controllers.each do |s| s.send_packet('GO') end standing.each do |s| s.victim = nil s.confirmed! false s.send_packet('GO') end end
_process_ready_sockets(list)
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 66 def _process_ready_sockets(list) list.each do |socket| packet = socket.read_packet socket.ping! if packet if packet.nil? then _handle_closed_socket(socket) elsif _is_player?(socket) then _handle_player(socket, packet) elsif packet != 'PING' puts "unexpected comment from controller #{packet.inspect}" end end end
_time_elapsed?()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 36 def _time_elapsed? (Time.now - @started) > 1.0 end
_wait_for_input()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 31 def _wait_for_input ready, = IO.select([*@standing, *@driver.controllers], [], [], 1) ready || [] end
run()
click to toggle source
# File lib/process/roulette/croupier/start_handler.rb, line 18 def run @standing = _prepare_live_players @started = Time.now until _all_players_confirmed? || _time_elapsed? ready = _wait_for_input _process_ready_sockets(ready) end remaining = _kill_unconfirmed_players remaining.any? ? StartHandler : RestartHandler end