@@ -33,9 +33,10 @@ const (
3333 BadName = 6
3434 BadEmulator = 7
3535 BadAuth = 8
36- BadIP = 9
36+ BadPlayer = 9
3737 BadRoomName = 10
38- Other = 11
38+ BadGameState = 11
39+ Other = 12
3940)
4041
4142const (
@@ -116,6 +117,15 @@ func (s *LobbyServer) findGameServer(port int) (string, *gameserver.GameServer)
116117 return "" , nil
117118}
118119
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+
119129func (s * LobbyServer ) updatePlayers (g * gameserver.GameServer ) {
120130 if g == nil {
121131 return
@@ -400,36 +410,20 @@ func (s *LobbyServer) wsHandler(ws *websocket.Conn) {
400410 roomName , g := s .findGameServer (receivedMessage .Room .Port )
401411
402412 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 )
407414
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"
418418 if err := s .sendData (ws , sendMessage ); err != nil {
419419 s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
420420 }
421421 } else if g .Running {
422- sendMessage .Accept = Other
422+ sendMessage .Accept = BadGameState
423423 sendMessage .Message = "Game is already running"
424424 if err := s .sendData (ws , sendMessage ); err != nil {
425425 s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .Request ().RemoteAddr )
426426 }
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- }
433427 } else if receivedMessage .Room .RoomName != roomName {
434428 sendMessage .Accept = BadRoomName
435429 sendMessage .Message = "Room name must match"
@@ -621,13 +615,26 @@ func (s *LobbyServer) wsHandler(ws *websocket.Conn) {
621615 sendMessage .Type = TypeReplyBeginGame
622616 roomName , g := s .findGameServer (receivedMessage .Room .Port )
623617 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+ }
626632 } else {
627633 g .Running = true
628634 g .StartTime = time .Now ()
629635 g .Logger .Info ("starting game" , "time" , g .StartTime .Format (time .RFC3339 ))
630636 g .NumberOfPlayers = len (g .Players )
637+ sendMessage .Accept = Accepted
631638 go s .watchGameServer (roomName , g )
632639 for _ , v := range g .Players {
633640 if err := s .sendData (v .Socket , sendMessage ); err != nil {
0 commit comments