public void Initialize()
        {
            // game invitation request for player 1
            _player1.PlayerState = PlayerState.Invitation;
            _player1.Connection.Send(DataPacketBuilder.RequestServerGameInvitation(_id, _token, _gameId, 1), Encoding.UTF8);

            // game invitation request for player 2
            _player2.PlayerState = PlayerState.Invitation;
            _player2.Connection.Send(DataPacketBuilder.RequestServerGameInvitation(_id, _token, _gameId, 2), Encoding.UTF8);
        }
        private void ProcessPowerHistoryData(int playerId, UserInfoData userInfoData, List <IPowerHistoryEntry> powerHistoryLast)
        {
            foreach (var historyEntry in powerHistoryLast)
            {
                userInfoData.Connection.Send(DataPacketBuilder.RequestServerGamePowerHistory(_id, _token, _gameId, playerId, historyEntry), Encoding.UTF8);
                //Log.Warn($"[_gameId:{_gameId}] should be stopped here, isn't implemented!!!");
                Thread.Sleep(50);
            }

            //userInfoData.Connection.Send(DataPacketBuilder.RequestServerGamePowerHistoryX(_id, "matchgame", _gameId, playerId, powerHistoryLast), Encoding.UTF8);
        }
        private string ResponseHandShake(ITcpConnection connection, int dataPacketId, string dataPacketToken, SendData sendData)
        {
            var handShake    = JsonConvert.DeserializeObject <HandShakeRequest>(sendData.MessageData);
            var requestState = RequestState.Success;

            // create token here
            int userIndex = Index;
            var salted    = (handShake.AccountName + userIndex).GetHashCode();
            var userToken = salted.ToString();
            //Console.WriteLine($"Hash: {salted} -> {token}");

            var newUserInfo = new UserInfoData
            {
                Id          = userIndex,
                Token       = userToken,
                AccountName = handShake.AccountName,
                Connection  = connection,
                UserState   = UserState.None,
                GameId      = -1,
                DeckType    = DeckType.None,
                DeckData    = string.Empty,
                PlayerState = PlayerState.None
            };

            var user = _registredUsers.Values.ToList().Find(p => p.AccountName == handShake.AccountName);

            if (user != null && user.Connection.Equals(connection))
            {
                Log.Warn($"Account {handShake.AccountName} already registred! EndPoint: {user.Connection.LocalEndPoint}, Key: {user.Connection.Key}, {user.Connection.Equals(connection)}");
                requestState = RequestState.Fail;
            }
            else if (user != null && !_registredUsers.TryUpdate(user.Token, newUserInfo, user))
            {
                Log.Warn($"Account {handShake.AccountName} couldn't be updated!");
                requestState = RequestState.Fail;
            }
            else if (!_registredUsers.TryAdd(userToken, newUserInfo))
            {
                Log.Warn($"Account {handShake.AccountName} couldn't be registred!");
                requestState = RequestState.Fail;
            }

            if (requestState == RequestState.Success)
            {
                Log.Info($"Registred account {handShake.AccountName}!");
            }

            return(DataPacketBuilder.ResponseServerHandShake(_id, _token, requestState, userIndex, userToken));
        }
        private string ResponseQueue(ITcpConnection connection, int dataPacketId, string dataPacketToken, SendData sendData)
        {
            var requestState = RequestState.Success;

            if (_registredUsers.TryGetValue(dataPacketToken, out UserInfoData userInfoData) && userInfoData.UserState == UserState.None)
            {
                ChangeUserState(userInfoData, UserState.Queued);
            }
            else
            {
                requestState = RequestState.Fail;
            }

            return(DataPacketBuilder.ResponseServerQueue(_id, _token, requestState, 0));
        }
        internal void RegisterEvent(CAServer server, uint sid, uint subscriptionId, int dataCount, Constants.EpicsType type)
        {
            CARecord record   = ((ServerTcpReceiver)this.Pipe.FirstFilter).FindRecord(server, sid);
            string   property = ((ServerTcpReceiver)this.Pipe.FirstFilter).FindProperty(server, sid);

            DataPacket response = DataPacketBuilder.Encode(
                type,
                record[property],
                record,
                dataCount
                );

            response.Command    = (ushort)CommandID.CA_PROTO_EVENT_ADD;
            response.Parameter1 = 1;
            response.Parameter2 = (uint)subscriptionId;
            ((TcpReceiver)this.Pipe.FirstFilter).Send(response);

            EventHandler newEvent = delegate(object obj, EventArgs evt)
            {
                if (!record.IsDirty)
                {
                    return;
                }
                DataPacket p = DataPacketBuilder.Encode(type, record[property], record, dataCount);
                p.Command    = (ushort)CommandID.CA_PROTO_EVENT_ADD;
                p.Parameter1 = 1;
                p.Parameter2 = (uint)subscriptionId;
                ((TcpReceiver)this.Pipe.FirstFilter).Send(p);
            };

            record.RecordProcessed += newEvent;

            lock (subscribedEvents)
            {
                subscribedEvents.Add(
                    subscriptionId,
                    new EpicsEvent {
                    Handler   = newEvent,
                    Record    = record,
                    DataCount = dataCount,
                    EpicsType = type,
                    SID       = sid
                }
                    );
            }
        }
        private string ResponseStats(ITcpConnection connection, int dataPacketId, string dataPacketToken, SendData sendData)
        {
            var list = new List <UserInfo>();

            _registredUsers.Values.ToList().ForEach(p =>
                                                    list.Add(new UserInfo()
            {
                Id          = p.Id,
                AccountName = p.AccountName,
                UserState   = p.UserState,
                GameId      = p.GameId,
                DeckType    = p.DeckType,
                DeckData    = p.DeckData,
                PlayerState = p.PlayerState
            }));

            return(DataPacketBuilder.ResponseServerStats(_id, _token, RequestState.Success, list));
        }
        private void ProcessGameResponse(int dataPacketId, string dataPacketToken, GameResponse gameResponse)
        {
            var userInfoData = UserById(dataPacketId);

            Log.Info($"GameResponse:{gameResponse.GameResponseType} from {userInfoData?.AccountName}, {gameResponse.RequestState}");

            if (userInfoData == null || gameResponse.RequestState != RequestState.Success)
            {
                Stop();
                return;
            }

            switch (gameResponse.GameResponseType)
            {
            case GameResponseType.Invitation:

                _gameServer.ChangeUserState(userInfoData, UserState.Prepared);
                userInfoData.Connection.Send(DataPacketBuilder.RequestServerGamePreparation(_id, _token, _gameId), Encoding.UTF8);
                break;

            case GameResponseType.Preparation:

                var gameResponsePreparation = JsonConvert.DeserializeObject <GameResponsePreparation>(gameResponse.GameResponseData);
                userInfoData.DeckType = gameResponsePreparation.DeckType;
                userInfoData.DeckData = gameResponsePreparation.DeckData;
                _gameServer.ChangeUserState(userInfoData, UserState.InGame);
                if (_player1.UserState == UserState.InGame && _player2.UserState == UserState.InGame)
                {
                    _player1.Connection.Send(DataPacketBuilder.RequestServerGameStart(_id, _token, _gameId, _player1, _player2), Encoding.UTF8);
                    _player2.Connection.Send(DataPacketBuilder.RequestServerGameStart(_id, _token, _gameId, _player1, _player2), Encoding.UTF8);
                    Thread.Sleep(500);
                    Start();
                }
                break;

            case GameResponseType.PowerOption:
                //ProcessPowerOptionsData();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Example #8
0
        internal void RegisterEvent(CAServer server, uint sid, uint subscriptionId, int nbElements, EpicsType type, MonitorMask mask)
        {
            CARecord record   = ((ServerTcpReceiver)this.Pipe.FirstFilter).FindRecord(server, sid);
            string   property = ((ServerTcpReceiver)this.Pipe.FirstFilter).FindProperty(server, sid);

            DataPacket response = DataPacketBuilder.Encode(type, record[property], record, (nbElements == 0) ? record.ElementsInRecord : Math.Min(nbElements, record.ElementsInRecord));

            response.Command    = (ushort)CommandID.CA_PROTO_EVENT_ADD;
            response.Parameter1 = 1;
            response.Parameter2 = (uint)subscriptionId;
            ((TcpReceiver)this.Pipe.FirstFilter).Send(response);

            var          lastStatus = record.AlarmStatus;
            EventHandler newEvent   = delegate(object obj, EventArgs evt)
            {
                if (!record.IsDirty)
                {
                    return;
                }
                // We have a alarm mask, if the status didn't change, don't send the event
                if (mask == MonitorMask.ALARM && lastStatus == record.AlarmStatus)
                {
                    return;
                }
                lastStatus = record.AlarmStatus;
                DataPacket p = DataPacketBuilder.Encode(type, record[property], record, (nbElements == 0) ? record.ElementsInRecord : Math.Min(nbElements, record.ElementsInRecord));
                p.Command    = (ushort)CommandID.CA_PROTO_EVENT_ADD;
                p.Parameter1 = 1;
                p.Parameter2 = (uint)subscriptionId;
                ((TcpReceiver)this.Pipe.FirstFilter).Send(p);
            };

            record.RecordProcessed += newEvent;

            lock (subscribedEvents)
            {
                subscribedEvents.Add(subscriptionId, new EpicsEvent {
                    Handler = newEvent, Record = record, DataCount = nbElements, EpicsType = type, SID = sid
                });
            }
        }
Example #9
0
        public override void ProcessData(DataPacket packet)
        {
            if (DateTime.Now < Server.WaitTill)
            {
                return;
            }
            //Console.WriteLine("Pipe " + (Pipe.FirstFilter is UdpReceiver ? "UDP" : "TCP") + ": " + ((CommandID)packet.Command));
            lock (lockObject)
            {
                switch ((CommandID)packet.Command)
                {
                case CommandID.CA_PROTO_VERSION:
                    break;

                case CommandID.CA_PROTO_ECHO:
                    // We sent the echo... we should therefore avoid to answer it
                    if (Pipe.GeneratedEcho)
                    {
                        Pipe.GeneratedEcho = false;
                    }
                    // Send back the echo
                    else
                    {
                        ((ServerTcpReceiver)Pipe[0]).Send(packet);
                    }
                    break;

                case CommandID.CA_PROTO_SEARCH:
                {
                    var fullChannelName = packet.GetDataAsString(0);
                    var channelName     = fullChannelName;
                    var property        = "VAL";
                    if (fullChannelName.IndexOf('.') != -1)
                    {
                        property    = fullChannelName.Split('.').Last();
                        channelName = fullChannelName.Split('.').First();
                    }
                    if (!Server.Records.Contains(channelName))
                    {
                        break;
                    }
                    if (Server.Records[channelName].FindType(property) == EpicsType.Invalid)
                    {
                        break;
                    }

                    DataPacket response = DataPacket.Create(8 + 16);
                    response.Command    = (ushort)CommandID.CA_PROTO_SEARCH;
                    response.DataType   = (ushort)Server.TcpPort;
                    response.DataCount  = 0;
                    response.Parameter1 = 0xffffffff;
                    response.Parameter2 = packet.Parameter1;
                    response.SetUInt16(16, (ushort)CAConstants.CA_MINOR_PROTOCOL_REVISION);
                    response.Destination = packet.Sender;
                    ((UdpReceiver)this.Pipe[0]).Send(response);
                }
                break;

                case CommandID.CA_PROTO_CREATE_CHAN:
                {
                    var fullChannelName = packet.GetDataAsString(0);
                    var channelName     = fullChannelName;
                    var property        = "VAL";
                    if (fullChannelName.IndexOf('.') != -1)
                    {
                        property    = fullChannelName.Split('.').Last();
                        channelName = fullChannelName.Split('.').First();
                    }
                    if (!Server.Records.Contains(channelName))
                    {
                        break;
                    }
                    if (Server.Records[channelName].FindType(property) == EpicsType.Invalid)
                    {
                        break;
                    }

                    DataPacket access = DataPacket.Create(16);
                    access.Command    = (ushort)CommandID.CA_PROTO_ACCESS_RIGHTS;
                    access.Parameter1 = packet.Parameter1;
                    access.Parameter2 = (int)AccessRights.ReadAndWrite;
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).Send(access);

                    DataPacket response = DataPacket.Create(16);
                    response.Command    = (ushort)CommandID.CA_PROTO_CREATE_CHAN;
                    response.DataType   = (ushort)Server.Records[channelName].FindType(property);
                    response.DataCount  = (uint)(property == "VAL" ? Server.Records[channelName].ElementsInRecord : 1);
                    response.Parameter1 = packet.Parameter1;
                    response.Parameter2 = ((ServerTcpReceiver)this.Pipe.FirstFilter).RegisterChannel(channelName + "." + property);
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).Send(response);
                }
                break;

                case CommandID.CA_PROTO_READ_NOTIFY:
                {
                    var    record = ((ServerTcpReceiver)this.Pipe.FirstFilter).FindRecord(this.Server, packet.Parameter1);
                    object val    = ((ServerTcpReceiver)this.Pipe.FirstFilter).RecordValue(this.Server, packet.Parameter1);

                    if (stringTypes.Contains((EpicsType)packet.DataType) && val == null)
                    {
                        val = "";
                    }

                    var        nbElements = packet.DataCount == 0 ? record.ElementsInRecord : Math.Min(record.ElementsInRecord, (int)packet.DataCount);
                    DataPacket response   = DataPacketBuilder.Encode((EpicsType)packet.DataType, val, record, nbElements);
                    response.Command    = (ushort)CommandID.CA_PROTO_READ_NOTIFY;
                    response.Parameter1 = 1;
                    response.Parameter2 = packet.Parameter2;
                    ((TcpReceiver)this.Pipe.FirstFilter).Send(response);
                }
                break;

                case CommandID.CA_PROTO_WRITE:
                {
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).PutValue(this.Server, packet);
                }
                break;

                case CommandID.CA_PROTO_WRITE_NOTIFY:
                {
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).PutValue(this.Server, packet);
                    DataPacket response = DataPacket.Create(16);
                    response.Command    = (ushort)CommandID.CA_PROTO_WRITE_NOTIFY;
                    response.DataType   = packet.DataType;
                    response.DataCount  = packet.DataCount;
                    response.Parameter1 = 1;
                    response.Parameter2 = packet.Parameter2;
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).Send(response);
                }
                break;

                case CommandID.CA_PROTO_EVENT_ADD:
                {
                    uint      sid            = packet.Parameter1;
                    uint      subscriptionId = packet.Parameter2;
                    uint      dataCount      = packet.DataCount;
                    EpicsType type           = (EpicsType)packet.DataType;

                    ((ServerTcpReceiver)this.Pipe.FirstFilter).RegisterEvent(this.Server, sid, subscriptionId, (int)dataCount, type, (MonitorMask)packet.GetUInt16((int)packet.HeaderSize + 12));
                }
                break;

                case CommandID.CA_PROTO_EVENT_CANCEL:
                {
                    ((ServerTcpReceiver)this.Pipe.FirstFilter).UnregisterEvent(this.Server, packet.Parameter2);
                }
                break;

                default:
                    break;
                }
            }
        }
 private void ProcessPowerOptionsData(int playerId, UserInfoData userInfoData, PowerAllOptions allOptions)
 {
     userInfoData.Connection.Send(DataPacketBuilder.RequestServerGamePowerOptions(_id, _token, _gameId, playerId, allOptions.Index, allOptions.PowerOptionList), Encoding.UTF8);
 }