OpenNos.GameObject.ClientSession.HandlePackets C# (CSharp) Method

HandlePackets() private method

Handle the packet received by the Client.
private HandlePackets ( ) : void
return void
        private void HandlePackets()
        {
            byte[] packetData = null;
            while (_receiveQueue.TryDequeue(out packetData))
            {
                // determine first packet
                if (_encryptor.HasCustomParameter && this.SessionId == 0)
                {
                    string sessionPacket = _encryptor.DecryptCustomParameter(packetData);

                    string[] sessionParts = sessionPacket.Split(' ');
                    if (sessionParts.Count() < 1)
                    {
                        return;
                    }
                    this.LastKeepAliveIdentity = Convert.ToInt32(sessionParts[0]);

                    // set the SessionId if Session Packet arrives
                    if (sessionParts.Count() < 2)
                    {
                        return;
                    }
                    this.SessionId = Convert.ToInt32(sessionParts[1].Split('\\').FirstOrDefault());
                    Logger.Log.DebugFormat(Language.Instance.GetMessageFromKey("CLIENT_ARRIVED"), this.SessionId);

                    if (!_waitForPacketsAmount.HasValue)
                    {
                        TriggerHandler("OpenNos.EntryPoint", String.Empty, false);
                    }

                    return;
                }

                string packetConcatenated = _encryptor.Decrypt(packetData, (int)this.SessionId);

                foreach (string packet in packetConcatenated.Split(new char[] { (char)0xFF }, StringSplitOptions.RemoveEmptyEntries))
                {
                    string[] packetsplit = packet.Split(' ', '^');

                    if (_encryptor.HasCustomParameter)
                    {
                        // keep alive
                        string nextKeepAliveRaw = packetsplit[0];
                        Int32 nextKeepaliveIdentity;
                        if (!Int32.TryParse(nextKeepAliveRaw, out nextKeepaliveIdentity) && nextKeepaliveIdentity != (this.LastKeepAliveIdentity + 1))
                        {
                            Logger.Log.ErrorFormat(Language.Instance.GetMessageFromKey("CORRUPTED_KEEPALIVE"), _client.ClientId);
                            _client.Disconnect();
                            return;
                        }
                        else if (nextKeepaliveIdentity == 0)
                        {
                            if (LastKeepAliveIdentity == UInt16.MaxValue)
                            {
                                LastKeepAliveIdentity = nextKeepaliveIdentity;
                            }
                        }
                        else
                        {
                            LastKeepAliveIdentity = nextKeepaliveIdentity;
                        }

                        if (_waitForPacketsAmount.HasValue)
                        {
                            if (_waitForPacketList.Count != _waitForPacketsAmount - 1)
                            {
                                _waitForPacketList.Add(packet);
                            }
                            else
                            {
                                _waitForPacketList.Add(packet);
                                _waitForPacketsAmount = null;
                                string queuedPackets = String.Join(" ", _waitForPacketList.ToArray());
                                string header = queuedPackets.Split(' ', '^')[1];
                                TriggerHandler(header, queuedPackets, true);
                                _waitForPacketList.Clear();
                                return;
                            }
                        }
                        else
                        {
                            string[] packetHeader = packet.Split(new char[] { ' ', '^' }, StringSplitOptions.RemoveEmptyEntries);

                            // 1 is a keep alive packet with no content to handle
                            int permit = 1;
                            if (packetHeader.Length > 1)
                            {
                                if (packetHeader[1][0] == '$')
                                {
                                    if (Account != null && Account.Authority != AuthorityType.Admin)
                                    {
                                        permit = 0;
                                    }
                                }

                                if (packetHeader[1][0] == '/' || packetHeader[1][0] == ':' || packetHeader[1][0] == ';')
                                {
                                    TriggerHandler(packetHeader[1][0].ToString(), packet, false);
                                }
                                else
                                {
                                    if (permit == 1)
                                    {
                                        if (packetHeader[1] != "0")
                                        {
                                            TriggerHandler(packetHeader[1], packet, false);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        // simple messaging
                        string packetHeader = packet.Split(' ')[0];
                        if (packetHeader[0] == '/' || packetHeader[0] == ':' || packetHeader[0] == ';')
                        {
                            TriggerHandler(packetHeader[0].ToString(), packet, false);
                        }
                        else
                        {
                            TriggerHandler(packetHeader, packet, false);
                        }
                    }
                }
            }
        }