/
game_hub.rb
55 lines (49 loc) · 1.01 KB
/
game_hub.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require 'thread'
class GameHub
def initialize(local=false)
@player_count = 0
@mutex = Mutex.new unless local
@sessions = []
end
def ping
"pong"
end
def join
# announcement = "?"
session = "UNSET"
sessions_lock do
@player_count += 1
session = GameSession.new(:game_hub => self, :player_number => @player_count)
@sessions << session
# announcement = "PLAYER:#{session.player_number} JOINED"
end
# broadcast announcement
return session
end
def broadcast(m)
# puts "(Broadcasting to all players: #{m})"
sessions_lock do
@sessions.each do |session|
session.message_to_client m
end
end
end
def quit(session)
announcement = "?"
sessions_lock do
@sessions.delete(session)
announcement = "PLAYER #{session.player_number} HAS QUIT"
end
broadcast announcement
end
private
def sessions_lock
if @mutex
@mutex.synchronize do
yield
end
else
yield
end
end
end