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