import { Events, Social as SocialTypes } from "../../types";
import { APITypes } from "../../utils";
import type { Client } from "../client";
import { Relationship } from "./relationship";
export declare class Social {
    private client;
    /** The current number of people online */
    online: number;
    /** List of the client's friends */
    friends: Relationship[];
    /** List of "pending" relationships (shows in `other` tab on TETR.IO) */
    other: Relationship[];
    /** people you block */
    blocked: SocialTypes.Blocked[];
    /** Notifications */
    notifications: SocialTypes.Notification[];
    /** @hideconstructor */
    private constructor();
    static create(client: Client, initData: Events.in.Client["client.ready"]["social"]): Promise<Social>;
    private get api();
    private init;
    /**
     * Marks all notifications as read
     * @example
     * client.social.markNotificationsAsRead();
     */
    markNotificationsAsRead(): void;
    /**
     * Get a user + social data from the list of users and pending friends (OTHER tab in TETR.IO)
     * @example
     * const user = await client.social.get('halp')
     * @example
     * const user = await client.social.get('646f633d276f42a80ba44304');
     * @example
     * const user = await client.social.get({ username: 'halp' });
     * @example
     * const user = await client.social.get({ id: '646f633d276f42a80ba44304 });
     * @example
     * // You can then use the object to read user data and interact with the user
     * await user.dm('wanna play?');
     * await user.invite();
     */
    get(target: string): Relationship | null;
    get(target: {
        id: string;
    }): Relationship | null;
    get(target: {
        username: string;
    }): Relationship | null;
    /**
     * Get the user id given a username
     */
    resolve(username: string): Promise<string>;
    /** Get a users' information based on their userid or username
     * @example
     * const user = await client.social.who(await client.social.resolve('halp'));
     */
    who(id: string): Promise<APITypes.Users.User>;
    /**
     * Send a message to a specified user (based on id)
     * @example
     * await client.social.dm(await client.social.resolve('halp'), 'what\'s up?');
     */
    dm(userID: string, message: string): Promise<SocialTypes.DM>;
    /**
     * Send a user a friend request
     * @example
     * await client.social.friend(await client.social.resolve('halp'));
     * @returns false if the user is already friended, true otherwise
     * @throws {Error} If an error occurs (such as the user has blocked the client, etc)
     */
    friend(userID: string): Promise<boolean>;
    /**
     * Unfriend a user. Note: unfriending a user will unblock them if they are blocked.
     * @example
     * await client.social.unfriend(await client.social.resolve('halp'));
     * @returns false if the user is not unfriended, true otherwise
     */
    unfriend(userID: string): Promise<boolean>;
    /**
     * Block a user
     * @example
     * await client.social.block(await client.social.resolve('halp'));
     * @returns false if the user is already blocked, true otherwise
     */
    block(userID: string): Promise<false | undefined>;
    /**
     * Unblock a user. Note: unblocking a user will unfriend them if they are friended.
     * @example
     * await client.social.unblock(await client.social.resolve('halp'));
     * @returns false if the user is not unblocked, true otherwise
     */
    unblock(userID: string): Promise<void>;
    /**
     * Invite a user to your room
     * @example
     * await client.social.invite(await client.social.resolve('halp'));
     */
    invite(userID: string): Promise<void>;
    /**
     * Set the client's status
     * @example
     * client.social.status('online', 'lobby:X-QP');
     */
    status(status: SocialTypes.Status, detail?: SocialTypes.Detail | String): void;
}
export * from "./relationship";
