Esempio n. 1
0
        public override void OnReceivePacketFromClient(IPEndPoint endPoint, DataPacket dataPacket)
        {
            GamePeer peer = null;

            try
            {
                peer = PeerCollection.Get(endPoint);
                var offsets = PacketInfo.GetOffsetInfo(dataPacket.Buffer, dataPacket.Offset);
                foreach (var item in offsets)
                {
                    try
                    {
                        var messageData = new Payload(dataPacket.Buffer, item.Offset, item.Length);
                        ProcessMessage(endPoint, messageData, dataPacket.DeliveryOptions, peer);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error($"Error processing message: {ex}");
                        if (peer != null)
                        {
                            _messageSender.Send(new ErrorResponse(ResultCode.MessageProcessingError), peer);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"OnReceivePacketFromClient: Error processing package: {ex}");
                if (peer != null)
                {
                    _messageSender.Send(new ErrorResponse(ResultCode.MessageProcessingError), peer);
                }
            }
        }
Esempio n. 2
0
        public override bool OnNewClientConnect(IPEndPoint endPoint)
        {
            try
            {
                if (!base.OnNewClientConnect(endPoint))
                {
                    return(false);
                }

                var peer = PeerCollection.Get(endPoint);
                if (peer == null)
                {
                    _logger.Error($"GamePeerListener.OnClientDisconnect error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}");
                    return(false);
                }

                // _logger.Error($"Sending ConnectedEvent to peer {peer.GetPeerId()}");
                _messageSender.Send(new ConnectedEvent(), peer);
                return(true);
            }
            catch (Exception e)
            {
                _logger.Error($"OnNewClientConnect error: {e}");
                return(false);
            }
        }
Esempio n. 3
0
        private BaseClient(string playerName, Rooms rooms, PlayerChannels playerChannels, RoomChannels roomChannels)
        {
            if (playerName == null)
            {
                throw new ArgumentNullException("playerName");
            }
            if (rooms == null)
            {
                throw new ArgumentNullException("rooms");
            }
            if (playerChannels == null)
            {
                throw new ArgumentNullException("playerChannels");
            }
            if (roomChannels == null)
            {
                throw new ArgumentNullException("roomChannels");
            }

            Log = Logs.Create(LogCategory.Network, GetType().Name);

            _playerName = playerName;

            _byteBufferPool = new ConcurrentPool <byte[]>(10, () => new byte[1024]);
            _queuedUnreliableTransmissions = new TransferBuffer <ArraySegment <byte> >(16);
            _queuedReliableTransmissions   = new TransferBuffer <ArraySegment <byte> >(16);
            _queuedEvents = new List <NetworkEvent>();

            _peers                = new PeerCollection(this);
            _channels             = new ChannelCollection(_peers.RoutingTable, playerChannels, roomChannels);
            _connectionNegotiator = new ConnectionNegotiator(this);
            _router               = new PacketRouter(this, _connectionNegotiator);
            _commsProcessor       = new CommsProcessor(this, _peers.RoutingTable, rooms, _channels);
            _roomsManager         = new RoomMembershipManager(this, _connectionNegotiator, rooms);
        }
Esempio n. 4
0
 public PeerStateManager(
     ILogger logger,
     PeerCollection peerCollection,
     IEnumerable <IPeerStateHandler> peerStateHandlers,
     IServiceProvider services)
 {
     _logger            = logger.ForContext <PeerStateManager>();
     _peerCollection    = peerCollection;
     _peerStateHandlers = peerStateHandlers;
     _services          = services;
 }
        public GameServerStats GetStats()
        {
            var oldestRoom = _roomManager.GetOldestRoom();

            var result = new GameServerStats()
            {
                RoomCount           = _roomManager.GetRoomsCount(),
                PeerCount           = PeerCollection.GetPeerCount(),
                RoomsPeerCount      = _roomManager.GetRoomPeerCount(),
                OldestRoomCreatedOn = oldestRoom?.GetCreatedOnDateTime()
            };

            result.PeersCountPerPort = new Dictionary <ushort, int>();
            foreach (var listener in GetListeners())
            {
                result.PeersCountPerPort.Add(listener.GetListenPort(), PeerCollection.GetPeerCount());
            }

            return(result);
        }
Esempio n. 6
0
 public PeerFactory(Application application, PeerCollection peerCollection)
 {
     this._application = application;
     this._peerCollection = peerCollection;
 }
Esempio n. 7
0
        private void ProcessMessage(IPEndPoint endPoint, byte[] buffer, int offset, int length, MmPeer peer)
        {
            //probably bad kind of using
            var operationCode = MessageBase.GetOperationCode(buffer, offset);

            _logger.Debug($"Message received. Operation code: {operationCode}");

            peer = PeerCollection.Get(endPoint);
            if (peer == null)
            {
                _logger.Warning($"GamePeerListener.OnReceivePacketFromClient error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}");
                return;
            }


            //listener handles only auth message, others are sent to roomManager
            switch (operationCode)
            {
            case ShamanOperationCode.Connect:
                _messageSender.Send(new ConnectedEvent(), peer);
                break;

            case ShamanOperationCode.Ping:
                //ping processing
                break;

            case ShamanOperationCode.Disconnect:
                OnClientDisconnect(endPoint, new SimpleDisconnectInfo(ShamanDisconnectReason.PeerLeave));
                break;

            case ShamanOperationCode.Authorization:
                var authMessage =
                    Serializer.DeserializeAs <AuthorizationRequest>(buffer, offset, length);

                if (!Config.IsAuthOn)
                {
                    //if success - send auth success
                    peer.IsAuthorizing = false;
                    peer.IsAuthorized  = true;
                    //this sessionID will be got from backend, after we send authToken, which will come in player properties
                    peer.SetSessionId(authMessage.SessionId);
                    _messageSender.Send(new AuthorizationResponse(), peer);
                }
                else
                {
                    //TODO authorizing logic
                    throw new NotImplementedException();
                }
                break;

            default:
                if (!peer.IsAuthorized && Config.IsAuthOn)
                {
                    _messageSender.Send(new AuthorizationResponse()
                    {
                        ResultCode = ResultCode.NotAuthorized
                    }, peer);
                    return;
                }
                else
                {
                    if (!peer.IsAuthorized)
                    {
                        _messageSender.Send(new AuthorizationResponse(), peer);
                    }
                }

                switch (operationCode)
                {
                case ShamanOperationCode.PingRequest:
                    _messageSender.Send(new PingResponse(), peer);
                    break;

                case ShamanOperationCode.CreateRoomFromClient:
                    var createRequest =
                        Serializer.DeserializeAs <CreateRoomFromClientRequest>(buffer, offset, length);
                    TaskScheduler.ScheduleOnceOnNow(async() =>
                    {
                        var createResult = await _matchMakingGroupsManager.CreateRoom(peer.GetSessionId(),
                                                                                      createRequest.MatchMakingProperties);
                        //parse create result and create response
                        var createResponse = new CreateRoomFromClientResponse(GetJoinInfo(createResult));
                        if (createResult.Result == RoomOperationResult.OK)
                        {
                            _logger.Info($"Room {createResult.RoomId} created");
                        }
                        _messageSender.Send(createResponse, peer);
                    });
                    break;

                case ShamanOperationCode.DirectJoin:
                    var joinRequest = Serializer.DeserializeAs <DirectJoinRequest>(buffer, offset, length);
                    TaskScheduler.ScheduleOnceOnNow(async() =>
                    {
                        //join existing room
                        var joinResult = await _roomManager.JoinRoom(joinRequest.RoomId,
                                                                     new Dictionary <Guid, Dictionary <byte, object> >
                        {
                            { peer.GetSessionId(), joinRequest.MatchMakingProperties }
                        }, joinRequest.MatchMakingWeight, joinRequest.MatchMakingWeight);
                        //parse join result and create response
                        var joinResponse = new DirectJoinResponse(GetJoinInfo(joinResult));
                        if (joinResult.Result == RoomOperationResult.OK)
                        {
                            _logger.Info($"Player direct joined room {joinResult.RoomId}");
                        }
                        _messageSender.Send(joinResponse, peer);
                    });
                    break;

                case ShamanOperationCode.GetRoomList:
                    var request = Serializer.DeserializeAs <GetRoomListRequest>(buffer, offset, length);
                    var rooms   = _matchMakingGroupsManager.GetRooms(request.MatchMakingProperties)
                                  .Select(r => new RoomInfo(r.Id, r.TotalWeightNeeded, r.CurrentWeight, r.Properties, r.State))
                                  .ToList();
                    var getRoomsResponse = new GetRoomListResponse();
                    getRoomsResponse.Rooms = rooms;
                    _messageSender.Send(getRoomsResponse, peer);
                    break;

                case ShamanOperationCode.EnterMatchMaking:
                    var enterMessage = Serializer.DeserializeAs <EnterMatchMakingRequest>(buffer, offset, length);
                    if (enterMessage == null)
                    {
                        throw new Exception("Can not deserialize EnterMatchMakingRequest. Result is null");
                    }


                    var properties = enterMessage.MatchMakingProperties;

                    var requiredProperties = _matchMaker.GetRequiredProperties();

                    foreach (var property in requiredProperties)
                    {
                        if (!properties.ContainsKey(property))
                        {
                            _logger.Error($"Player {peer.GetPeerId()} tried to enter matchmaking without property {property}");
                            _messageSender.Send(new EnterMatchMakingResponse(MatchMakingErrorCode.RequiredPlayerPropertyIsNotSet), peer);
                            return;
                        }
                    }

                    //add player
                    _matchMaker.AddPlayer(peer, enterMessage.MatchMakingProperties, enterMessage.MatchMakingWeight);

                    _messageSender.Send(new EnterMatchMakingResponse(), peer);

                    break;

                case ShamanOperationCode.LeaveMatchMaking:
                    //remove player
                    _matchMaker.RemovePlayer(peer.GetPeerId());
                    //send response
                    _messageSender.Send(new LeaveMatchMakingResponse(), peer);
                    break;

                default:
                    _messageSender.Send(new ErrorResponse(ResultCode.UnknownOperation), peer);
                    return;
                }

                break;
            }
        }
Esempio n. 8
0
 public ClientStateHandler(ILogger logger, PeerCollection peerCollection, IServiceProvider services)
 {
     _logger         = logger.ForContext <ClientStateHandler>();
     _peerCollection = peerCollection;
     _services       = services;
 }