@@ -33,9 +33,10 @@ const (
33
33
BadName = 6
34
34
BadEmulator = 7
35
35
BadAuth = 8
36
- BadIP = 9
36
+ BadPlayer = 9
37
37
BadRoomName = 10
38
- Other = 11
38
+ BadGameState = 11
39
+ Other = 12
39
40
)
40
41
41
42
const (
@@ -116,6 +117,15 @@ func (s *LobbyServer) findGameServer(port int) (string, *gameserver.GameServer)
116
117
return "" , nil
117
118
}
118
119
120
+ func (s * LobbyServer ) findRoomCreator (g * gameserver.GameServer ) * gameserver.Client {
121
+ for _ , v := range g .Players {
122
+ if v .Number == 0 {
123
+ return & v
124
+ }
125
+ }
126
+ return nil
127
+ }
128
+
119
129
func (s * LobbyServer ) updatePlayers (g * gameserver.GameServer ) {
120
130
if g == nil {
121
131
return
@@ -400,36 +410,20 @@ func (s *LobbyServer) wsHandler(ws *websocket.Conn) {
400
410
roomName , g := s .findGameServer (receivedMessage .Room .Port )
401
411
402
412
if g != nil {
403
- ip , _ , err := net .SplitHostPort (ws .Request ().RemoteAddr )
404
- if err != nil {
405
- g .Logger .Error (err , "could not parse IP" , "IP" , ws .Request ().RemoteAddr )
406
- }
413
+ roomCreator := s .findRoomCreator (g )
407
414
408
- var player = g .Players [receivedMessage .PlayerName ]
409
- if player .Number != 0 {
410
- sendMessage .Accept = BadName
411
- sendMessage .Message = "Player name must match room creator name"
412
- if err := s .sendData (ws , sendMessage ); err != nil {
413
- s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
414
- }
415
- } else if ip != player .IP {
416
- sendMessage .Accept = BadIP
417
- sendMessage .Message = "Player IP must match IP of room creator"
415
+ if roomCreator .Socket != ws {
416
+ sendMessage .Accept = BadPlayer
417
+ sendMessage .Message = "Player must be room creator"
418
418
if err := s .sendData (ws , sendMessage ); err != nil {
419
419
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
420
420
}
421
421
} else if g .Running {
422
- sendMessage .Accept = Other
422
+ sendMessage .Accept = BadGameState
423
423
sendMessage .Message = "Game is already running"
424
424
if err := s .sendData (ws , sendMessage ); err != nil {
425
425
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
426
426
}
427
- } else if receivedMessage .Emulator != g .Emulator {
428
- sendMessage .Accept = BadEmulator
429
- sendMessage .Message = "Emulator name must match room emulator"
430
- if err := s .sendData (ws , sendMessage ); err != nil {
431
- s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
432
- }
433
427
} else if receivedMessage .Room .RoomName != roomName {
434
428
sendMessage .Accept = BadRoomName
435
429
sendMessage .Message = "Room name must match"
@@ -621,13 +615,26 @@ func (s *LobbyServer) wsHandler(ws *websocket.Conn) {
621
615
sendMessage .Type = TypeReplyBeginGame
622
616
roomName , g := s .findGameServer (receivedMessage .Room .Port )
623
617
if g != nil {
624
- if g .Running {
625
- g .Logger .Error (fmt .Errorf ("game already running" ), "game running" , "message" , receivedMessage , "address" , ws .Request ().RemoteAddr )
618
+ roomCreator := s .findRoomCreator (g )
619
+
620
+ if roomCreator .Socket != ws {
621
+ sendMessage .Accept = BadPlayer
622
+ sendMessage .Message = "Player must be room creator"
623
+ if err := s .sendData (ws , sendMessage ); err != nil {
624
+ s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
625
+ }
626
+ } else if g .Running {
627
+ sendMessage .Accept = BadGameState
628
+ sendMessage .Message = "Game is already running"
629
+ if err := s .sendData (ws , sendMessage ); err != nil {
630
+ s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
631
+ }
626
632
} else {
627
633
g .Running = true
628
634
g .StartTime = time .Now ()
629
635
g .Logger .Info ("starting game" , "time" , g .StartTime .Format (time .RFC3339 ))
630
636
g .NumberOfPlayers = len (g .Players )
637
+ sendMessage .Accept = Accepted
631
638
go s .watchGameServer (roomName , g )
632
639
for _ , v := range g .Players {
633
640
if err := s .sendData (v .Socket , sendMessage ); err != nil {
0 commit comments