import { DiscordBase } from './extra/DiscordBase';
export type GuildMemberData = APIGuildMember | Omit<APIGuildMember, 'user'> | GatewayGuildMemberUpdateDispatchData | GatewayGuildMemberAddDispatchData | APIInteractionDataResolvedGuildMember;
import { type DMChannelStructure, type GuildMemberStructure, type GuildStructure, type MessageStructure, type UserStructure, type VoiceStateStructure } from '../client/transformers';
import type { UsingClient } from '../commands';
import { type GuildMemberResolvable, type ImageOptions, type MessageCreateBodyRequest, type MethodContext, type ObjectToLower, type ToClass } from '../common';
import type { APIGuildMember, APIInteractionDataResolvedGuildMember, APIUser, GatewayGuildMemberAddDispatchData, GatewayGuildMemberUpdateDispatchData, RESTGetAPIGuildMembersQuery, RESTGetAPIGuildMembersSearchQuery, RESTPatchAPIGuildMemberJSONBody, RESTPutAPIGuildBanJSONBody, RESTPutAPIGuildMemberJSONBody } from '../types';
import type { GuildRole } from './GuildRole';
import { PermissionsBitField } from './extra/Permissions';
export interface BaseGuildMember extends DiscordBase, ObjectToLower<Omit<APIGuildMember, 'user' | 'roles'>> {
}
export declare class BaseGuildMember extends DiscordBase {
    /** the choosen guild id */
    readonly guildId: string;
    private _roles;
    joinedTimestamp?: number;
    communicationDisabledUntilTimestamp?: number | null;
    constructor(client: UsingClient, data: GuildMemberData, id: string, 
    /** the choosen guild id */
    guildId: string);
    guild(force?: boolean): Promise<GuildStructure<'api'>>;
    fetch(force?: boolean): Promise<GuildMemberStructure>;
    ban(body?: RESTPutAPIGuildBanJSONBody, reason?: string): Promise<void>;
    kick(reason?: string): Promise<void>;
    edit(body: RESTPatchAPIGuildMemberJSONBody, reason?: string): Promise<GuildMemberStructure>;
    presence(): import("..").ReturnCache<(Omit<import("../types").GatewayPresenceUpdate, "user"> & {
        id: string;
        user_id: string;
    } & {
        guild_id: string;
    }) | undefined>;
    voice(force?: boolean): Promise<VoiceStateStructure>;
    toString(): `<@${string}>`;
    timeout(time: null | number, reason?: string): Promise<GuildMemberStructure>;
    get hasTimeout(): false | number;
    private patch;
    get roles(): {
        keys: string[];
        list: (force?: boolean) => Promise<GuildRole[]>;
        add: (id: string) => Promise<never>;
        remove: (id: string) => Promise<never>;
        permissions: (force?: boolean) => Promise<PermissionsBitField>;
        sorted: (force?: boolean) => Promise<GuildRole[]>;
        highest: (force?: boolean) => Promise<GuildRole>;
    };
    static methods({ client, guildId }: MethodContext<{
        guildId: string;
    }>): {
        resolve: (resolve: GuildMemberResolvable) => Promise<GuildMemberStructure | undefined>;
        search: (query?: RESTGetAPIGuildMembersSearchQuery) => Promise<GuildMemberStructure[]>;
        unban: (id: string, reason?: string) => Promise<never>;
        ban: (id: string, body?: RESTPutAPIGuildBanJSONBody, reason?: string) => Promise<void>;
        kick: (id: string, reason?: string) => Promise<void>;
        edit: (id: string, body: RESTPatchAPIGuildMemberJSONBody, reason?: string) => Promise<GuildMemberStructure>;
        add: (id: string, body: RESTPutAPIGuildMemberJSONBody) => Promise<GuildMemberStructure | undefined>;
        addRole: (memberId: string, id: string) => Promise<never>;
        removeRole: (memberId: string, id: string) => Promise<never>;
        fetch: (memberId: string, force?: boolean) => Promise<GuildMemberStructure>;
        list: (query?: RESTGetAPIGuildMembersQuery, force?: boolean) => Promise<GuildMemberStructure[]>;
    };
}
export interface GuildMember extends ObjectToLower<Omit<APIGuildMember, 'user' | 'roles'>> {
}
/**
 * Represents a guild member
 * @link https://discord.com/developers/docs/resources/guild#guild-member-object
 */
export declare class GuildMember extends BaseGuildMember {
    /** the choosen guild id */
    readonly guildId: string;
    user: UserStructure;
    private __me?;
    constructor(client: UsingClient, data: GuildMemberData, user: APIUser, 
    /** the choosen guild id */
    guildId: string);
    get tag(): string;
    get bot(): boolean | undefined;
    get name(): string;
    get username(): string;
    get globalName(): string | null;
    /** gets the nickname or the username */
    get displayName(): string;
    dm(force?: boolean): Promise<DMChannelStructure>;
    write(body: MessageCreateBodyRequest): Promise<MessageStructure>;
    defaultAvatarURL(): string;
    avatarURL(options: ImageOptions & {
        exclude: true;
    }): string | null;
    avatarURL(options?: ImageOptions & {
        exclude?: false;
    }): string;
    bannerURL(options: ImageOptions & {
        exclude: true;
    }): string | undefined | null;
    bannerURL(options?: ImageOptions & {
        exclude?: false;
    }): string | undefined;
    fetchPermissions(force?: boolean): Promise<PermissionsBitField>;
    manageable(force?: boolean): Promise<boolean>;
    bannable(force?: boolean): Promise<boolean>;
    kickable(force?: boolean): Promise<boolean>;
    moderatable(force?: boolean): Promise<boolean>;
}
export interface UnavailableMember {
    pending: true;
}
export declare class UnavailableMember extends BaseGuildMember {
}
export interface InteractionGuildMember extends ObjectToLower<Omit<APIInteractionDataResolvedGuildMember, 'roles' | 'deaf' | 'mute' | 'permissions'>> {
}
declare const InteractionGuildMember_base: ToClass<Omit<GuildMember, "deaf" | "mute">, InteractionGuildMember>;
/**
 * Represents a guild member
 * @link https://discord.com/developers/docs/resources/guild#guild-member-object
 */
export declare class InteractionGuildMember extends InteractionGuildMember_base {
    permissions: PermissionsBitField;
    constructor(client: UsingClient, data: APIInteractionDataResolvedGuildMember, user: APIUser, 
    /** the choosen guild id */
    guildId: string);
}
export {};
