Exemplo n.º 1
0
        private void ProcessPacket(byte[] data)
        {
            RgcPacket pck = RgcPacket.FromByteArray(data);

            if (_ignoredpackets.Contains(pck.Code))
            {
                return;
            }

            RgcPacket response1 = null;
            RgcPacket response2 = null;

            if (pck.Code == RGC.PPM_REQUEST_VERSION_VALIDATION)
            {
                response1 = new RgcPacketVersionValidation();
                Globals.Debug("Sending version validation...");
            }
            else if (pck.Code == RGC.BOT_REGISTRATION_REQUEST)
            {
                response1 = new RgcPacketBotRegistration();
                Globals.Debug("Sending bot registration...");
            }
            else if (pck.Code == RGC.CLIENT_VALIDATION_SUCCESS)
            {
                response1 = new RgcPacketLogin(_username, _password);
                Globals.Debug("Logging in as " + _username + "...");
            }
            else if (pck.Code == RGC.CLIENT_LOGIN_SUCCESS)
            {
                response1 = new RgcPacketChatJoinAllChannels();
                Globals.Debug("Joining all channels...");

                foreach (IRgcEventHandler handler in _handlers)
                {
                    handler.HandleLoggedIn(_username);
                }
            }
            else if (pck.Code == RGC.CLIENT_CHAT_CHANNEL_ADD)
            {
                string roomname = RgcPacket.DecodeString(pck.Strings[2]);

                foreach (IRgcEventHandler handler in _handlers)
                {
                    handler.HandleSelfJoinedRoom(pck.Strings[0], roomname);
                }
            }
            else if (pck.Code == RGC.CLIENT_USER_ADD)
            {
                int i = 2;
                while (i < pck.Strings.Count)
                {
                    i += 1; // skip ip
                    string username = RgcPacket.DecodeString(pck.Strings[i]);

                    foreach (IRgcEventHandler handler in _handlers)
                    {
                        handler.HandleJoinedRoom(pck.Strings[0], username);
                    }

                    i += 3; // skip name, level, color
                    if (i >= pck.Strings.Count)
                    {
                        break;
                    }
                    if (pck.Strings[i] == "0")
                    {
                        i += 1; // skip clan, doesn't have any
                    }
                    else
                    {
                        i += 1; // skip clan

                        if (i >= pck.Strings.Count)
                        {
                            break;
                        }

                        if (pck.Strings[i] == "0")
                        {
                            i += 1; // skip prefix, doesn't have one
                        }
                        else
                        {
                            i += 3; // skip prefix
                        }

                        if (i >= pck.Strings.Count)
                        {
                            break;
                        }

                        if (pck.Strings[i] == "0")
                        {
                            i += 1; // skip suffix, doesn't have one
                        }
                        else
                        {
                            i += 3; // skip suffix
                        }
                    }
                }
            }
            else if (pck.Code == RGC.CLIENT_USER_REM)
            {
                foreach (IRgcEventHandler handler in _handlers)
                {
                    handler.HandleLeftRoom(pck.Strings[0], RgcPacket.DecodeString(pck.Strings[1]));
                }
            }
            else if (pck.Code == RGC.CLIENT_CHAT_MESSAGE)
            {
                string message = RgcPacket.DecodeString(pck.Strings[3]);

                foreach (IRgcEventHandler handler in _handlers)
                {
                    handler.HandleMessage(pck.Strings[0], RgcPacket.DecodeString(pck.Strings[2]), message);
                }
            }
            else if (pck.Code == RGC.CLIENT_CHAT_ERROR)
            {
                string message = RgcPacket.DecodeString(pck.Strings[0]);
                Globals.Debug(message, ConsoleColor.Red);

                _connected = false;
                _stream.Close();
                _client.Close();
            }
            else
            {
                if (Globals.GetSetting("//settings/general/showwarnings") == "true")
                {
                    Globals.Debug("! Unknown packet type, code=" + pck.Code + ", length=" + pck.Length);
                }
            }

            if (response1 != null)
            {
                _stream.Write(response1.ToByteArray(), 0, response1.BytesLength());
            }
            if (response2 != null)
            {
                _stream.Write(response2.ToByteArray(), 0, response2.BytesLength());
            }
        }