public JoinRoomResponseCode TryAddClientConnection(PlayerAuthenticationModel playerAuthModel, IClientConnection clientConnection, string roomPassword) { lock (_lock) { if (roomPassword != Password) { Log.Info("Invalid room password specified"); return(JoinRoomResponseCode.InvalidRoomPassword); } if (disposed) { Log.Info("Room has expired"); return(JoinRoomResponseCode.RoomExpired); } JoinRoomResponseCode responseCode = JoinRoomResponseCode.UnknownFailure; if (gameController.IsGameActive) { // TODO: rejoin if (!gameController.RejoinPlayer(playerAuthModel, clientConnection)) { return(responseCode); } responseCode = JoinRoomResponseCode.AddedToExistingGame; } else { // Add to lobby lobbyController.AddPlayerForConnection(playerAuthModel, clientConnection); responseCode = JoinRoomResponseCode.AddedToLobby; } if (responseCode != JoinRoomResponseCode.AddedToExistingGame && responseCode != JoinRoomResponseCode.AddedToLobby) { Log.Info("Failed to join room"); return(responseCode); } if (tearDownTimer.Enabled) { Log.Info(">>>> Player successfully joined room, disabling tearDownTimer."); tearDownTimer.Enabled = false; } Log.Info("Player ID: " + playerAuthModel.UserID + " joined room. State: " + responseCode.ToString()); connections.Add(clientConnection); clientConnection.Disconnected += onClientPeerDisconnected; return(responseCode); } }
public JoinRoomOpResponse(bool success, JoinRoomResponseCode responseCode) { Success = success; ResponseCode = responseCode; OperationResponse = new OperationResponse(JoinRoomOpResponse.OP_CODE, new Dictionary <byte, object>()); OperationResponse.ReturnCode = OP_CODE; OperationResponse.Parameters.Add(0, Success); OperationResponse.Parameters.Add(1, (int)ResponseCode); SendParameters = new SendParameters(); SendParameters.ChannelId = 0; SendParameters.Encrypted = false; SendParameters.Unreliable = false; }
private void onSessionValidated(PlayerAuthenticationModel playerAuthModel, IClientConnection clientConnection, JoinRoomOpRequest joinRoomOpRequest) { Log.Info("JoinRoomController: player session validated " + playerAuthModel.UserID + " ==> " + joinRoomOpRequest.RoomID); // Once client's session is validated, determine if the room will be a new or existing one. RoomContext roomContext = null; if (!roomIDToContext.TryGetValue(joinRoomOpRequest.RoomID, out roomContext)) { Log.Info("Creating new room with ID: " + joinRoomOpRequest.RoomID); roomContext = new RoomContext(joinRoomOpRequest.RoomID, joinRoomOpRequest.Password); RoomContext addedRoomContext = roomIDToContext.GetOrAdd(roomContext.ID, roomContext); if (roomContext == addedRoomContext) { roomContext.Destroyed += onRoomDestroyed; } else { roomContext = addedRoomContext; } } else { Log.Info("Joining existing room with ID: " + roomContext.ID); } // Try adding client to the determined room. JoinRoomOpResponse joinRoomOpResponse = null; JoinRoomResponseCode joinRoomResponseCode = roomContext.TryAddClientConnection(playerAuthModel, clientConnection, joinRoomOpRequest.Password); // If we couldn't place the client into the room, respond with failure code. if (joinRoomResponseCode != JoinRoomResponseCode.AddedToLobby && joinRoomResponseCode != JoinRoomResponseCode.AddedToExistingGame) { joinRoomOpResponse = new JoinRoomOpResponse(false, joinRoomResponseCode); clientConnection.SendOperationResponse(joinRoomOpResponse.OperationResponse, joinRoomOpResponse.SendParameters); clientConnection.DisconnectAfterDelay(); Log.Info("JoinRoomController: Couldn't add clientPeerConnection with ID " + clientConnection.ConnectionId + " to room with ID " + roomContext.ID + ". Code : " + joinRoomResponseCode); return; } // If we reach this point, the client was successfully added to a room, so respond with success. joinRoomOpResponse = new JoinRoomOpResponse(true, JoinRoomResponseCode.AddedToLobby); clientConnection.SendOperationResponse(joinRoomOpResponse.OperationResponse, joinRoomOpResponse.SendParameters); }