示例#1
0
        private async Task <MessageRedisLoginDataResponse> PublishToSlave(AccountModel am, LoginResponse lr, IPAddress clientAddress)
        {
            // Publish login to redis to notify appropriate slave
            try
            {
                var msg = new NetworkMessageContainer();
                msg.MessageData = new ClientLoginDataRequest(
                    _instanceId,
                    am.Id,
                    am.LastSystemID,
                    lr.IV,
                    lr.Key,
                    am.Username,
                    am.Password,
                    clientAddress.GetAddressBytes()
                    );
                msg.MessageType = MessageTypes.Redis_LoginDataRequest;
                _redisServer.PublishObject(MessageTypes.Redis_LoginDataRequest, msg);
            }
            catch (Exception e)
            {
                _logger.Log(e.Message, LogLevel.Error);
            }

            return(await _getResponse(am.Id));
        }
        void _GameStateNetworkingManager_MessageReceived(object sender, NetworkMessageContainer e)
        {
            switch (e.MessageType)
            {
            case MessageTypes.EnterColony:
            {
                _gameStateManager.SetState(GameStateType.Colony);
                break;
            }

            case MessageTypes.PortDockApproval:
            {
                _gameStateManager.SetState(GameStateType.Port);
                break;
            }

            case MessageTypes.PlanetLandApproval:
            {
                _gameStateManager.SetState(GameStateType.Planet);
                break;
            }

            case MessageTypes.StarSystemData:
            {
                _gameStateManager.SetState(GameStateType.Space);
                break;
            }

            case MessageTypes.WarpApproval:
            {
                _gameStateManager.SetState(GameStateType.Space);
                break;
            }
            }
        }
示例#3
0
        public List <OutboundChatMessage> ParseChatline(ChatMetaData meta)
        {
            if (meta.Arguments == null || meta.Arguments.Trim().Length == 0)
            {
                return(new List <OutboundChatMessage>()
                {
                    new OutboundChatMessage(meta.Player, new ChatlineObject("Invalid shout command.", ChatlineColor.White))
                });
            }

            var actionText = meta.Player.Username + " " + ChatText.Shout.ToString() + ": ";

            var message = new ChatlineObject(new List <ChatlineFragment>()
            {
                new ChatlineFragment(actionText, ChatlineColor.Lime),
                new ChatlineFragment(meta.Arguments, ChatlineColor.White)
            });

            NetworkMessageContainer msg = new NetworkMessageContainer();

            msg.MessageData = new MessageRedisShout(meta.Player.Id, message.ToClientJson());
            msg.MessageType = MessageTypes.Redis_Shout;

            _redisServer.PublishObject(
                MessageTypes.Redis_Shout,
                msg
                );

            return(null);
        }
        protected virtual void _playableStateManager_MessageReceived(object sender, NetworkMessageContainer e)
        {
            if (Status == GameStateStatus.Active || Status == GameStateStatus.Activating)
            {
                if (_checkActiveMessages(e.MessageData, e.MessageType))
                {
                    return;
                }
            }

            switch (e.MessageType)
            {
                #region Receieve Login Information (State, etc)

            case (MessageTypes.ClientLoginSuccess):       //Login Successful
            {
                _targetingService.DisableTargetSetting(); //Suspended until gamestate is read, where it should be enabled

                var data = e.MessageData as MessageClientLogin;

                _clientShipManager.RemoveAllShips();
                _clientShipManager.CurrentCash    = data.CurrentCash;
                _clientPlayerInfoManager.PlayerID = data.PlayerInfo.PlayerID;

                MessageReader.InstantiateShip(data.Ship, _physicsManager.World, _clientShipManager, true);


                string incomingMessage = data.LoginMessage;

                return;
            }
                #endregion
            }
        }
示例#5
0
        async Task <dynamic> _pushColonyData(dynamic parameters, CancellationToken cancellationToken)
        {
            var mockResponses = new MockResponses();

            // Not sure if this works if there are unassigned properties
            var pushColonyData = this.BindAndValidate <MessageColonyDataPush>();

            Console.WriteLine("Received Push Data Request ${0}", pushColonyData);

            var fakeResponse = mockResponses.GetFakeColonyData();

            var msg = new NetworkMessageContainer();

            msg.MessageData = pushColonyData;

            // Slave gets data here
            _redisServer.PublishObject(MessageTypes.Redis_ColonyDataPush, msg);


            // Dunno what you plan to do here Free, but the server will have received the push by this point

            //fakeResponse.Pages.Overview.Sliders = pushColonyData.Sliders;

            return(ReturnJsonResponse(fakeResponse));
        }
示例#6
0
        void _handleSlaveConnectionResponse(object sender, NetworkMessageContainer messageData)
        {
            if (!_awaitingConnectionResponse)
            {
                return;
            }

            var data = messageData.MessageData as MessageSlaveConnectionResponse;

            if (data.SlaveID != SlaveID.Value)
            {
                return;
            }

            if (data.IsSuccessful)
            {
                _awaitingConnectionResponse = false;
                _connected = true;
                _redisServer.Subscribe(ChannelTypes.MasterSlave, SlaveID.Value, _handleSlaveDisconnectionDetected);
                return;
            }

            // Attempt connection again
            _connectToServer();
        }
示例#7
0
        /// <summary>
        ///     The message recieved from the client will have the /t, /s, etc removed
        ///     Function handles chat message according to chat type which is sent as a byte by the client
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="server"></param>
        /// <param name="messageConnection"></param>
        public async void HandleMessage(NetworkMessageContainer message, Player player)
        {
            if (message == null)
            {
                ConsoleManager.WriteLine("Invalid chat message handled. Message is null.",
                                         ConsoleMessageType.Error);
            }

            var messageData = message.MessageData as MessageChatMessage;

            var chatMessageData = messageData.ChatMessageData;

            if (player == null)
            {
                ConsoleManager.WriteLine("Player connection not found while handling chat message.",
                                         ConsoleMessageType.Warning);
                return;
            }

            var outboundChats = await _chatCommandHandler.FetchOutboundChats(player, chatMessageData.ChatJson);

            if (outboundChats == null || outboundChats.Count == 0)
            {
                return;
            }

            SendChatList(outboundChats);
        }
示例#8
0
        void _slaveConnected(object sender, NetworkMessageContainer messageData)
        {
            var data = messageData.MessageData as MessageSlaveConnectionRequest;

            var response = new MessageSlaveConnectionResponse();

            response.SlaveID = data.SlaveID;

            if (!_slaveServers.ContainsKey(data.SlaveID))
            {
                SlaveServer s = new SlaveServer(data.SlaveID);
                _slaveServers.Add(s.ID, s);
                response.IsSuccessful   = true;
                _pendingRebalance       = true;
                _rebalanceWaitStartTime = TimeKeeper.MsSinceInitialization;
            }
            else
            {
                response.IsSuccessful = false;
            }

            NetworkMessageContainer msg = new NetworkMessageContainer();

            msg.MessageData = response;
            msg.MessageType = MessageTypes.Redis_SlaveConnectionResponse;
            _redisServer.PublishObject(MessageTypes.Redis_SlaveConnectionResponse, msg);
        }
        public void SendMessage(NetworkMessageContainer message)
        {
            var msg = _messageCreatorService.CreateMessage();

            message.WriteToLidgrenMessage_ToClient(message.MessageType, msg);
            Connection.SendMessage(msg, NetDeliveryMethod.ReliableUnordered, 0);//TODO: implement probably static method to get sequence channel and delivery method from message type
        }
        private void _handleMessageIDResponse(object sender, NetworkMessageContainer messageData)
        {
            var data = messageData?.MessageData as MessageIDResponse;

            if (data.SlaveServerID != _mySlaveID)
            {
                return;
            }
            else
            {
                switch (data.IDType)
                {
                case IDTypes.GalaxyID:
                    _galaxyIDManager.ReceiveServerIDs(data.IDs);
                    break;

                case IDTypes.TeamID:
                    _teamIDManager.ReceiveServerIDs(data.IDs);
                    break;

                case IDTypes.AccountID:
                    _accountIdManager.ReceiveServerIDs(data.IDs);
                    break;

                case IDTypes.TransactionID:
                    _transactionIdManager.ReceiveServerIDs(data.IDs);
                    break;

                default:
                    throw new NotImplementedException();
                    break;
                }
            }
        }
示例#11
0
        private void DrawablePortStateManager_ProcessMessage(object sender, NetworkMessageContainer message)
        {
            switch (message.MessageType)
            {
            case MessageTypes.PortDockApproval:
            {
                Clear();
                var data = message.MessageData as PortEntryData;

                // TODO: Implement reading this data, though much of this is used purely in the UI.

                break;
            }

            case MessageTypes.ClientLoginSuccess:
            {
                var data = message.MessageData as MessageClientLogin;
                if (data == null)
                {
                    ClientLogger.LogError("Could not deserialize MessageClientLogin: " + message.MessageData);
                    return;
                }

                _clientPlayerInfoManager.PlayerID     = data.PlayerInfo.PlayerID;
                _clientPlayerInfoManager.ActiveShipID = data.PlayerInfo.ActiveShipID;

                break;
            }
            }
        }
示例#12
0
 void HandleSimulatorNetworkMessage(object sender, NetworkMessageContainer message)
 {
     if (message.MessageType == MessageTypes.Redis_SimulatorConnectionResponse)
     {
         _connectedToServer = true;
         ConsoleManager.WriteLine("Connected to server.", ConsoleMessageType.NetworkMessage);
     }
 }
示例#13
0
        private void WarpPlayerToArea(PlayerModel player, int newAreaId)
        {
            var msg = new NetworkMessageContainer();

            msg.MessageType = MessageTypes.Redis_AdminWarpPlayer;
            msg.MessageData = new MessageAdminWarpPlayerRequest(player.ActiveShipId.Value, player.CurrentAreaID.Value, newAreaId);

            _redisServer.PublishObject(MessageTypes.Redis_AdminWarpPlayer, msg);
        }
示例#14
0
        void SendChatToPlayer(Player player, string chatJson, string meta)
        {
            var message = new NetworkMessageContainer();

            message.MessageData = CreateChatMessageContainer(chatJson, meta);
            message.MessageType = MessageTypes.ChatMessage;

            player.SendMessage(message);
        }
示例#15
0
        void _loginStateManager_MessageReceived(object sender, NetworkMessageContainer e)
        {
            switch (e.MessageType)
            {
            case MessageTypes.ClientLoginFailed:


                break;
            }
        }
        /// <summary>
        /// Handles redis request for login data.
        /// </summary>
        private void _handleLoginDataRequest(object sender, NetworkMessageContainer messageData)
        {
            var req = messageData?.MessageData as ClientLoginDataRequest;

            if (!_galaxyManager.IsLocalSystem(req.LastSystemID))
            {
                return;
            }

            _handleLoginDataRequestAsync(req);
        }
示例#17
0
        public void SendMessageToServer(NetworkMessageContainer message)
        {
#if ADMIN
            if (Debugging.DisableNetworking)
            {
                return;
            }
#endif

            _redisServer.PublishObject(ChannelTypes.SimulatorToServer_Data, AreaID, message);
        }
示例#18
0
        /// <summary>
        /// Generates an ID and publishes a connection request to redis
        /// </summary>
        void _connectToServer()
        {
            _awaitingConnectionResponse = true;
            NetworkMessageContainer msg = new NetworkMessageContainer();

            msg.MessageData = new MessageSlaveConnectionRequest()
            {
                SlaveID = SlaveID.Value
            };
            msg.MessageType = MessageTypes.Redis_SlaveConnectionRequest;
            _redisServer.PublishObject(MessageTypes.Redis_SlaveConnectionRequest, msg);
        }
        private void _handleHandoff(object sender, NetworkMessageContainer messageData)
        {
            MessageClientHandoff c = messageData?.MessageData as MessageClientHandoff;

            if (_galaxyManager.IsLocalArea(c.DestinationAreaID))
            {
                ConsoleManager.WriteLine("Received client handoff");

                Account refreshedAccount = _accountManager.GetAccountAsync(c.AccountID, true, true).Result;
                _connectionManager.AddPendingHandoff(c.IPAddress, refreshedAccount, c.DestinationAreaID, c.ShipID, c.ServerGameStateId);
            }
        }
示例#20
0
        public void RequestFreeIDs(int numToRequest, IDTypes IdType)
        {
            //Go through redis, regardless of whether this instance is the master server
            var request = new MessageIDRequest()
            {
                IDType = IdType, RequestingServerID = SlaveID.Value, NumIDsRequested = numToRequest
            };
            var msg = new NetworkMessageContainer();

            msg.MessageType = MessageTypes.Redis_IDRequest;
            msg.MessageData = request;
            _redisServer.PublishObject(MessageTypes.Redis_IDRequest, msg);
        }
示例#21
0
        public void SendMessageToServer(NetworkMessageContainer message)
        {
#if ADMIN
            if (Debugging.DisableNetworking)
            {
                return;
            }
#endif

            NetOutgoingMessage msg = _clientManager.Client.CreateMessage();
            message.WriteToLidgrenMessage_ToServer(message.MessageType, msg);
            _clientManager.Client.SendMessage(msg, _clientManager.CurrentSlaveConnection, NetDeliveryMethod.ReliableUnordered);//TODO: Implement GetNetDeliveryMethod method
        }
示例#22
0
        void DrawableColonyStateManager_ProcessMessage(object sender, NetworkMessageContainer message)
        {
            switch (message.MessageType)
            {
            case MessageTypes.ClientLoginSuccess:
            {
                var data = message.MessageData as MessageClientLogin;
                _clientPlayerInfoManager.PlayerID     = data.PlayerInfo.PlayerID;
                _clientPlayerInfoManager.ActiveShipID = data.PlayerInfo.ActiveShipID;

                break;
            }
            }
        }
        private void _handleAdminWarpPlayer(object sender, NetworkMessageContainer messageData)
        {
            var request = messageData?.MessageData as MessageAdminWarpPlayerRequest;

            var currentArea = _galaxyManager.GetArea(request.CurrentAreaId);

            // If this is true, our server doesn't own the client.
            if (currentArea?.AreaType == AreaTypes.Limbo)
            {
                return;
            }

            _handleAdminWarpPlayerAsync(request);
        }
示例#24
0
 void _handleSimulatorMessage(object sender, NetworkMessageContainer message)
 {
     if (message.MessageType == MessageTypes.Redis_SimulatorConnectionRequest)
     {
         var data = message.MessageData as MessageSimulatorConnectionRequest;
         IsConnected = true;
         var response = new MessageSimulatorConnectionResponse()
         {
             SimulatorID = SimulatorID
         };
         _redisServer.PublishObject(ChannelTypes.ServerToSimulator_Network, SimulatorID, new NetworkMessageContainer(response, MessageTypes.Redis_SlaveConnectionResponse));
         ConsoleManager.WriteLine("Simulator spawn complete, ID " + data.SimulatorID, ConsoleMessageType.Startup);
     }
 }
示例#25
0
        private void _handleRedisLoginDataResponse(object sender, NetworkMessageContainer messageData)
        {
            var res = messageData.MessageData as MessageRedisLoginDataResponse;

            if (_IDToConnectionAddress.ContainsKey(res.AccountID))
            {
                Console.WriteLine("Error: Redis received multiple ClientLoginDataReponse objects");
            }

            //TODO:Figure out why this happens. If a player logs in more than once without restarting the server, this error state occurs.
            else
            {
                _IDToConnectionAddress.TryAdd(res.AccountID, res);
            }
        }
示例#26
0
        protected override void _playableStateManager_MessageReceived(object sender, NetworkMessageContainer e)
        {
            base._playableStateManager_MessageReceived(sender, e);

            switch (e.MessageType)
            {
            case MessageTypes.PlanetLandApproval:
            {
                var data = e.MessageData as PlanetEntryData;
                if (data == null)
                {
                    ClientLogger.LogError("Could not deserialize PlanetEntryData: " + e.MessageData);
                    return;
                }

                ReadIncomingPlanet(data);

                _targetingService.RegisterObject(_clientShipManager.PlayerShip);
                break;
            }

            case MessageTypes.ColonyCaptured:
            {
                var data = e.MessageData as MessageColonyCaptured;
                if (data == null)
                {
                    ClientLogger.LogError("Could not deserialize MessageColonyCaptured: " + e.MessageData);
                    return;
                }

                ColonyCaptured(data);
                break;
            }

            case MessageTypes.ColonizeRequestApproval:
            {
                var data = e.MessageData as MessageColonizeRequestApproval;
                if (data == null)
                {
                    ClientLogger.LogError("Could not deserialize MessageColonizeRequestApproval: " + e.MessageData);
                    return;
                }

                ColonizeRequestApproval(data);
                break;
            }
            }
        }
示例#27
0
        public void SendChatToServer(string chat)
        {
            var msg = _clientManager.Client.CreateMessage();

            var container = new NetworkMessageContainer();

            var data = new MessageChatMessage();

            data.ChatMessageData  = new ChatMessageData(chat);
            container.MessageType = MessageTypes.ChatMessage;
            container.MessageData = data;

            container.WriteToLidgrenMessage_ToServer(MessageTypes.ChatMessage, msg);

            _clientManager.Client.SendMessage(msg, _clientManager.CurrentSlaveConnection, NetDeliveryMethod.ReliableOrdered);
        }
        private void _handleMessageStartUpdatingSystems(object sender, NetworkMessageContainer messageData)
        {
            var data = messageData?.MessageData as MessageStartUpdatingSystems;

            // Return if this isn't the target slave
            if (data.SlaveServerID != _mySlaveID)
            {
                return;
            }

            PSystemsLoaded = false;

            if (data.ClearCurrentSystems)
            {
                _galaxyManager.ClearLocalSystems();
            }

#if DEBUG
            Stopwatch s1 = new Stopwatch();
            s1.Start();
#endif

            var loadedSystemModels = _databaseManager.GetAreasAsync(data.IDsToSimulate).Result;

            foreach (PSystemModel p in loadedSystemModels)
            {
                PSystem s = Deserializer.DeserializePSystemAsync(p, _redisServer, _locatorService, _registrationManager, _databaseManager).Result;
            }


            foreach (var a in _galaxyManager.AllAreas)
            {
                //Clear existing subscriptions to prevent doubles (for hot loading)
                _redisServer.UnSubscribe(ChannelTypes.WebToSlave, a.Value.Id, _routedMessageProcessor);

                //Subscribe
                _redisServer.Subscribe(ChannelTypes.WebToSlave, a.Value.Id, _routedMessageProcessor);
            }

#if DEBUG
            ConsoleManager.WriteLine(_galaxyManager.AllAreas.Count.ToString() + " total areas currently loaded.", ConsoleMessageType.Debug);
            s1.Stop();
            ConsoleManager.WriteLine(s1.ElapsedMilliseconds + " ms to load " + _galaxyManager.Systems.Count + " systems.", ConsoleMessageType.Debug);
#endif

            PSystemsLoaded = true;
        }
示例#29
0
        /// <summary>
        /// Call this to begin changing area when handing off a local client.
        /// </summary>
        /// <param name="newArea"></param>
        /// <param name="ship"></param>
        /// <param name="isWarping"></param>
        async Task HandoffInitiateAreaChange(int destinationAreaID, AreaTypes newAreaType, IShip ship, Player warpingPlayer)
        {
            var shipSaveTask          = _databaseManager.SaveAsync(warpingPlayer);
            var playerSaveTask        = _databaseManager.SaveAsync(ship);
            var shipSaveHandoffTask   = _databaseManager.HandoffSaveAsync(ship);//If these collections aren't empty on server startup, a server crashed mid handoff and there could be ships/players which aren't stored in any area and might not be loaded.
            var playerSaveHandoffTask = _databaseManager.HandoffSaveAsync(warpingPlayer);

            //Ensure that db versions of ship and player are most recent, since they'll be loaded by slave
            List <Task> tasklist = new List <Task>
            {
                shipSaveTask,
                shipSaveHandoffTask,
                playerSaveTask,
                playerSaveHandoffTask,
            };

            await Task.WhenAll(tasklist);

            if (!(shipSaveTask.Result.IsAcknowledged && shipSaveHandoffTask.Result.IsAcknowledged && playerSaveTask.Result.IsAcknowledged && playerSaveHandoffTask.Result.IsAcknowledged))
            {
                throw new InvalidOperationException("Error: db write failed during handoff, handoff aborted.");
            }

            //Send handoff to be handled by server
            NetworkMessageContainer redismsg = new NetworkMessageContainer(new MessageClientHandoff((int)warpingPlayer.AccountID, (int)warpingPlayer.ActiveShipId, destinationAreaID, ((LidgrenOutgoingMessageService)warpingPlayer.MessageService).Connection.RemoteEndPoint.Address.GetAddressBytes()), MessageTypes.Redis_ClientHandoff);

            _redisServer.PublishObject(MessageTypes.Redis_ClientHandoff, redismsg);

            IArea currentArea = null;

            if (ship.CurrentAreaId != null)
            {
                currentArea = _areaLocator.GetArea((int)ship.CurrentAreaId);
            }

            OnAreaExit(ship, currentArea, newAreaType);

            currentArea.RemovePlayer(ship.GetPlayer()); //There doesn't seem to be a convenient way to avoid putting this here
            currentArea.RemoveShip(ship);               //Sends removeship Command to clients in area
            ConsoleManager.WriteLine("Initiated Handoff");
            ship.GetPlayer().IsHandedOff = true;

            _registrationManager.DeRegisterObject(warpingPlayer);
            _registrationManager.DeRegisterObject(ship);
            _accountManager.DeregisterAccount(warpingPlayer.GetAccount());
        }
示例#30
0
        void _handleIDRequest(object sender, NetworkMessageContainer messageData)
        {
            var data = messageData.MessageData as MessageIDRequest;


            if (GlobalIDManagers.ContainsKey(data.IDType))
            {
                var response = new MessageIDResponse();
                response.IDs           = GlobalIDManagers[data.IDType].GetFreeIDs(data.NumIDsRequested);
                response.SlaveServerID = data.RequestingServerID;
                response.IDType        = data.IDType;
                NetworkMessageContainer msg = new NetworkMessageContainer();
                msg.MessageData = response;
                msg.MessageType = MessageTypes.Redis_IDResponse;
                _redisServer.PublishObject(MessageTypes.Redis_IDResponse, msg);
            }
        }