public static void HandleConnect(object packet, Session session)
        {
            var firstConnect = (PacketConnect)packet;
            string packetName = packet.GetType().Name.Remove(0, 6);

            // decrypt login information
            string username = Rsa.Decrypt(firstConnect.Username);
            string password = Rsa.Decrypt(firstConnect.Password);

            if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
            {
                LogManager.Write("Authentication", "Session {0} sent invalid account credentials (empty or whitespace)!", session.IpAddress);
                session.SendFatalFailPacket(packetName, "An internal error has occurred!");
                return;
            }

            // handle initial profile data from database
            SqlResult accountResult = DatabaseManager.Database.Select("SELECT id, password, salt, adminRole, flags FROM account_info WHERE username = ?", username);
            if (accountResult == null || accountResult.Count > 1)
            {
                LogManager.Write("Authentication", "Failed to lookup account {0} requested by session {1}!", username, session.IpAddress);
                session.SendFatalFailPacket(packetName, "Internal Error: Failed to lookup account information!");
                return;
            }

            AuthStatus authStatus = AuthStatus.InvalidCredentials;
            if (accountResult.Count == 1)
            {
                uint accountId = accountResult.Read<uint>(0, "id");

                authStatus = GetAuthStatus(accountId, accountResult.Read<string>(0, "password"), accountResult.Read<string>(0, "salt"), username, password);
                if (authStatus == AuthStatus.Ok)
                {
                    session.Player = new Player()
                    {
                        Id        = accountId,
                        Session   = session,
                        Username  = username,
                        AdminRole = accountResult.Read<AdminRole>(0, "adminRole"),
                        Flags     = accountResult.Read<PlayerFlags>(0, "flags"),
                    };

                    // send initial profile data to client
                    var profileInfo = new PacketProfileInfo
                    {
                        Profile = session.Player.GeneratePacketProfile()
                    };

                    session.Send(profileInfo);

                    if (packetName == "FirstConnect")
                    {
                        session.SendString(AssetManager.ScrollTemplateCache);
                        session.SendString(AssetManager.AvatarPartTemplateCache);

                        // TODO: send other assets here...
                        // session.SendString("{\"type\":\"GROWTH_START_DECK\",\"msg\":\"Message\"}");
                    }

                    // authentication was successful, send packets to move client to main menu
                    session.SendOkPacket(packetName);
                    session.Send(new PacketActivateGame());
                }
                else
                    session.SendFailPacket(packetName, GetAuthFailStatusString(authStatus));
            }
            else
                session.SendFailPacket(packetName, GetAuthFailStatusString(authStatus));
        }