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);
}
}
}
}
}