import { MumbleSocket } from './mumble-socket.js';
import { ServerConfig, UserList_User, Version } from '@tf2pickup-org/mumble-protocol';
import { User } from './user.js';
import { ChannelManager } from './channel-manager.js';
import { UserManager } from './user-manager.js';
import { ClientOptions } from './client-options.js';
import { Permissions } from './permissions.js';
import { TypedEventEmitter } from './typed-event-emitter.js';
import { Events } from './events.js';
import { MessageType } from '@protobuf-ts/runtime';
type PacketTuple<T extends object> = [MessageType<T>, T];
type ManyPackets<T extends object[]> = {
    [K in keyof T]: PacketTuple<T[K]>;
};
type CommandProps<Send extends object, Return extends object, SendMore extends object[] = []> = {
    expectPacket: [MessageType<Return>, (packet: Return) => boolean];
} & ({
    sendPacket: PacketTuple<Send>;
} | {
    sendPackets: ManyPackets<[Send, ...SendMore]>;
});
interface ConnectedClient extends Client {
    socket: MumbleSocket;
    session: number;
    user: User;
    self: User;
}
export declare class Client extends TypedEventEmitter<Events, Events> {
    channels: ChannelManager;
    users: UserManager;
    serverVersion?: Version;
    serverConfig?: ServerConfig;
    socket?: MumbleSocket;
    session?: number;
    welcomeText?: string;
    readonly options: ClientOptions;
    readonly permissions: Map<number, Permissions>;
    constructor(options: ClientOptions);
    get user(): User | undefined;
    get self(): User | undefined;
    isConnected(): this is ConnectedClient;
    assertConnected(): asserts this is ConnectedClient;
    connect(): Promise<this>;
    disconnect(): this;
    command<Send extends object, Return extends object, SendMore extends object[] = []>(name: string, props: CommandProps<Send, Return, SendMore>): Promise<Return>;
    fetchRegisteredUsers(): Promise<UserList_User[]>;
    deregisterUser(userId: number): Promise<void>;
    renameRegisteredUser(userId: number, name: string): Promise<void>;
}
export {};
