Class: Process::Roulette::Croupier::JoinHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/process/roulette/croupier/join_handler.rb

Overview

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.

Instance Method Summary collapse

Constructor Details

#initialize(driver) ⇒ JoinHandler

Returns a new instance of JoinHandler.



14
15
16
17
18
# File 'lib/process/roulette/croupier/join_handler.rb', line 14

def initialize(driver)
  @driver = driver
  @pending = JoinPending.new(driver)
  @next_state = nil
end

Instance Method Details

#_controller_disconnected(socket) ⇒ Object



107
108
109
110
111
# 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_exitObject



118
119
120
121
# File 'lib/process/roulette/croupier/join_handler.rb', line 118

def _controller_exit
  puts 'command given to exit'
  @next_state = FinishHandler
end

#_controller_goObject



113
114
115
116
# 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) ⇒ Object



131
132
133
134
# 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) ⇒ Object



81
82
83
84
85
86
87
# 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) ⇒ Object



34
35
36
37
38
39
40
41
42
# 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) ⇒ Object



62
63
64
65
66
# 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) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
# 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) ⇒ Object



123
124
125
126
127
128
129
# 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) ⇒ Object



52
53
54
55
56
57
58
59
60
# 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) ⇒ Object



89
90
91
92
93
94
95
96
97
# 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) ⇒ Object



99
100
101
102
103
104
105
# 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) ⇒ Object



44
45
46
47
48
49
50
# 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

#runObject



20
21
22
23
24
25
26
27
28
29
30
31
32
# 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