import { AsyncEventEmitter } from "@vladfrangu/async_event_emitter";
import { type AuthenticatorOptions, type ProxyOptions, Vector3 } from "./network";
import { Friends, Nearby, Region } from "./structures";
import { InstantMessages } from "./structures/instant-messages";
import { Regions } from "./structures/regions";
import { Self } from "./structures/self";
import { Constants } from "./utilities";
interface DebugHandlers {
    debug?: (message: string) => void;
    warn?: (warn: string) => void;
    error?: (error: Error) => void;
}
export interface ClientEvents {
    [Constants.ClientEvents.READY]: [];
    [Constants.ClientEvents.DEBUG]: [message: string];
    [Constants.ClientEvents.ERROR]: [error: Error];
    [Constants.ClientEvents.WARN]: [warning: string];
    [Constants.ClientEvents.CONNECTING]: [];
    [Constants.ClientEvents.RECONNECTING]: [];
    [Constants.ClientEvents.DISCONNECTING]: [];
    [Constants.ClientEvents.DISCONNECTED]: [];
}
/**
 * The starting point for the Homunculus client.
 */
export declare class Client extends AsyncEventEmitter<ClientEvents> {
    /**
     * Contains values relating to your own avatar.
     */
    get self(): Self;
    set self(value: Self);
    /**
     * Regions we are currently connected to, or recently have been.
     */
    readonly regions: Regions;
    /**
     * Friends interface.
     */
    readonly friends: Friends;
    /**
     * Instant messaging interface.
     */
    readonly instantMessages: InstantMessages;
    /**
     * Local communication interface.
     */
    readonly nearby: Nearby;
    /**
     * The Region representing the current region, as in the region that this
     * agent is standing within.
     *
     * @note Once teleporting is functional this value will be overwritten with a
     * new object. Always use `client.region` rather than storing a reference to
     * this value.
     */
    get region(): Region;
    /**
     * The Parcel representing the current parcel, as in the parcel that this
     * agent is standing within.
     *
     * @note This value changes with movement or parcel updates. Always use
     * `client.parcel` rather than storing a reference to this value.
     */
    get parcel(): import("./types").Parcel | undefined;
    get status(): number;
    private readonly _core;
    private _self?;
    constructor(options?: {
        logger?: DebugHandlers | false;
        proxy?: ProxyOptions;
    } | undefined);
    /**
     * The Parcel representing the current parcel, as in the parcel that this
     * agent is standing within.
     */
    /**
     * @param [options.login.start] `home`, `last`, or alternatively use `uri:Region Name&x&y&z`.
     */
    connect(options?: AuthenticatorOptions): Promise<{
        login: true;
        circuitCode: number;
        simIp: string;
        simPort: number;
        regionX: number;
        regionY: number;
        agentId: string;
        sessionId: string;
        firstName: string;
        lastName: string;
        agentAccess?: string | undefined;
        message?: string | undefined;
        maxAgentGroups?: number | undefined;
        openidUrl?: string | undefined;
        openidToken?: string | undefined;
        cofVersion?: number | undefined;
        agentAppearanceService?: string | undefined;
        inventoryRoot?: {
            folderId?: string | undefined;
        }[] | undefined;
        inventorySkeleton?: {
            name?: string | undefined;
            folderId?: string | undefined;
            parentId?: string | undefined;
            typeDefault?: number | undefined;
            version?: number | undefined;
        }[] | undefined;
        agentAccessMax?: string | undefined;
        agentRegionAccess?: string | undefined;
        premiumPackages?: Record<string, {
            benefits: {
                animatedObjectLimit?: number | undefined;
                animationUploadCost?: number | undefined;
                attachmentLimit?: number | undefined;
                betaGridLand?: number | undefined;
                createGroupCost?: number | undefined;
                createRepeatingEvents?: number | undefined;
                estateAccessToken?: string | undefined;
                gridwideExperienceLimit?: number | undefined;
                groupMembershipLimit?: number | undefined;
                landAuctionsAllowed?: number | undefined;
                lastnameChangeAllowed?: number | undefined;
                lastnameChangeCost?: number | undefined;
                lastnameChangeRate?: number | undefined;
                lindenBuyFee?: number | undefined;
                lindenHomes?: string[] | undefined;
                liveChat?: number | undefined;
                localExperiences?: number | undefined;
                mainlandTier?: number | undefined;
                marketplaceConciergeSupport?: number | undefined;
                marketplaceListingLimit?: number | undefined;
                marketplacePleLimit?: number | undefined;
                meshUploadCost?: number | undefined;
                objectAccountLevel?: number | undefined;
                oneTimeEventAllowed?: number | undefined;
                oneTimeEventCost?: number | undefined;
                partnerFee?: number | undefined;
                phoneSupport?: number | undefined;
                picksLimit?: number | undefined;
                placePages?: {
                    additionalListingCost?: number | undefined;
                    numFreeListings?: number | undefined;
                } | undefined;
                premiumAccess?: number | undefined;
                premiumAlts?: number | undefined;
                premiumGifts?: number | undefined;
                priorityEntry?: number | undefined;
                repeatingEventsCost?: number | undefined;
                scriptLimit?: number | undefined;
                signupBonus?: number | undefined;
                soundUploadCost?: number | undefined;
                stipend?: number | undefined;
                storedImLimit?: number | undefined;
                largeTextureUploadCost?: number[] | undefined;
                textureUploadCost?: number | undefined;
                transactionHistoryLimit?: number | undefined;
                unpartnerFee?: number | undefined;
                useAnimesh?: number | undefined;
                voiceMorphing?: number | undefined;
            };
            description: {
                name?: Record<string, string> | undefined;
            };
        }> | undefined;
        buddyList?: {
            buddyId?: string | undefined;
            buddyRightsHas?: number | undefined;
            buddyRightsGiven?: number | undefined;
        }[] | undefined;
        mapServerUrl?: string | undefined;
        loginFlags?: {
            stipendSinceLogin?: string | undefined;
            everLoggedIn?: string | undefined;
            gendered?: string | undefined;
            daylightSavings?: string | undefined;
        }[] | undefined;
        udpBlacklist?: string[] | undefined;
        accountLevelBenefits?: {
            animatedObjectLimit?: number | undefined;
            animationUploadCost?: number | undefined;
            attachmentLimit?: number | undefined;
            betaGridLand?: number | undefined;
            createGroupCost?: number | undefined;
            createRepeatingEvents?: number | undefined;
            estateAccessToken?: string | undefined;
            gridwideExperienceLimit?: number | undefined;
            groupMembershipLimit?: number | undefined;
            landAuctionsAllowed?: number | undefined;
            lastnameChangeAllowed?: number | undefined;
            lastnameChangeCost?: number | undefined;
            lastnameChangeRate?: number | undefined;
            lindenBuyFee?: number | undefined;
            lindenHomes?: string[] | undefined;
            liveChat?: number | undefined;
            localExperiences?: number | undefined;
            mainlandTier?: number | undefined;
            marketplaceConciergeSupport?: number | undefined;
            marketplaceListingLimit?: number | undefined;
            marketplacePleLimit?: number | undefined;
            meshUploadCost?: number | undefined;
            objectAccountLevel?: number | undefined;
            oneTimeEventAllowed?: number | undefined;
            oneTimeEventCost?: number | undefined;
            partnerFee?: number | undefined;
            phoneSupport?: number | undefined;
            picksLimit?: number | undefined;
            placePages?: {
                additionalListingCost?: number | undefined;
                numFreeListings?: number | undefined;
            } | undefined;
            premiumAccess?: number | undefined;
            premiumAlts?: number | undefined;
            premiumGifts?: number | undefined;
            priorityEntry?: number | undefined;
            repeatingEventsCost?: number | undefined;
            scriptLimit?: number | undefined;
            signupBonus?: number | undefined;
            soundUploadCost?: number | undefined;
            stipend?: number | undefined;
            storedImLimit?: number | undefined;
            largeTextureUploadCost?: number[] | undefined;
            textureUploadCost?: number | undefined;
            transactionHistoryLimit?: number | undefined;
            unpartnerFee?: number | undefined;
            useAnimesh?: number | undefined;
            voiceMorphing?: number | undefined;
        } | undefined;
        accountType?: string | undefined;
        lindenStatusCode?: string | undefined;
        agentFlags?: number | undefined;
        maxGodLevel?: number | undefined;
        godLevel?: number | undefined;
        lookAt?: Vector3 | undefined;
        homeInfo?: {
            regionHandle?: string | undefined;
            position?: Vector3 | undefined;
            lookAt?: Vector3 | undefined;
        } | undefined;
        home?: string | undefined;
        secondsSinceEpoch?: number | undefined;
        secureSessionId?: string | undefined;
        seedCapability?: string | undefined;
        startLocation?: string | undefined;
    }>;
    /**
     * Sends Packet (or multiple) to currently active Circuit.
     *
     * @param packets Packets to send
     */
    send(...args: Parameters<NonNullable<typeof this._core.circuit>["send"]>): void;
    /**
     * Sends Packet (or multiple) to currently active Circuit.
     *
     * @param packets Packets to send
     * @param timeout Timeout for reliable packets
     */
    sendReliable(...args: Parameters<NonNullable<typeof this._core.circuit>["sendReliable"]>): Promise<void[]>;
    disconnect(): Promise<void>;
}
export {};
