import { Contactable } from "./internal";
import { Sendable, GroupMessage, ImageElem, Anonymous, Quotable } from "./message";
import { Gfs } from "./gfs";
import { DiscussMessageEvent, GroupAdminEvent, GroupInviteEvent, GroupSignEvent, GroupMessageEvent, GroupMuteEvent, GroupPokeEvent, GroupRecallEvent, GroupRequestEvent, GroupTransferEvent, MemberDecreaseEvent, MemberIncreaseEvent, MessageRet } from "./events";
import { GroupInfo, MemberInfo } from "./entities";
type Client = import("./client").Client;
export declare namespace Discuss {
    interface EventMap {
        message(e: DiscussMessageEvent): void;
    }
}
/** 讨论组 */
export declare class Discuss extends Contactable {
    readonly gid: number;
    static as(this: Client, gid: number): Discuss;
    /** {@link gid} 的别名 */
    get group_id(): number;
    protected constructor(c: Client, gid: number);
    /** 发送一条消息 */
    sendMsg(content: Sendable): Promise<MessageRet>;
}
/** 群聊消息事件 */
export interface GroupMessageEventMap {
    "message"(event: GroupMessageEvent): void;
    /** 普通消息 */
    "message.normal"(event: GroupMessageEvent): void;
    /** 匿名消息 */
    "message.anonymous"(event: GroupMessageEvent): void;
}
/** 群聊通知事件 */
export interface GroupNoticeEventMap {
    "notice"(event: MemberIncreaseEvent | GroupSignEvent | MemberDecreaseEvent | GroupRecallEvent | GroupAdminEvent | GroupMuteEvent | GroupTransferEvent | GroupPokeEvent): void;
    /** 群员新增 */
    "notice.increase"(event: MemberIncreaseEvent): void;
    /** 群员减少 */
    "notice.decrease"(event: MemberDecreaseEvent): void;
    /** 消息撤回 */
    "notice.recall"(event: GroupRecallEvent): void;
    /** 管理员变更 */
    "notice.admin"(event: GroupAdminEvent): void;
    /** 群禁言 */
    "notice.ban"(event: GroupMuteEvent): void;
    /** 群打卡 */
    "notice.sign"(event: GroupSignEvent): void;
    /** 群转让 */
    "notice.transfer"(event: GroupTransferEvent): void;
    /** 戳一戳 */
    "notice.poke"(event: GroupPokeEvent): void;
}
/** 群聊申请事件 */
export interface GroupRequestEventMap {
    "request"(event: GroupRequestEvent | GroupInviteEvent): void;
    /** 加群申请 */
    "request.add"(event: GroupRequestEvent): void;
    /** 群邀请 */
    "request.invite"(event: GroupInviteEvent): void;
}
/** 所有的群聊事件 */
export interface GroupEventMap extends GroupMessageEventMap, GroupNoticeEventMap, GroupRequestEventMap {
}
/** 群 */
export interface Group {
    /** 撤回消息 */
    recallMsg(msg: GroupMessage): Promise<boolean>;
    recallMsg(msgid: string): Promise<boolean>;
    recallMsg(seq: number, rand: number, pktnum?: number): Promise<boolean>;
}
/** 群 */
export declare class Group extends Discuss {
    private _info?;
    static as(this: Client, gid: number, strict?: boolean): Group;
    /** 群资料 */
    get info(): GroupInfo | undefined;
    /** 群名 */
    get name(): string | undefined;
    /** 我是否是群主 */
    get is_owner(): boolean;
    /** 我是否是管理 */
    get is_admin(): boolean;
    /** 是否全员禁言 */
    get all_muted(): boolean;
    /** 我的禁言剩余时间 */
    get mute_left(): number;
    /** 群文件系统 */
    readonly fs: Gfs;
    protected constructor(c: Client, gid: number, _info?: GroupInfo | undefined);
    /**
     * 获取群员实例
     * @param uid 群员账号
     * @param strict 严格模式，若群员不存在会抛出异常
     */
    pickMember(uid: number, strict?: boolean): import("./member").Member;
    /**
     * 获取群头像url
     * @param size 头像大小，默认`0`
     * @param history 历史头像记录，默认`0`，若要获取历史群头像则填写1,2,3...
     * @returns 头像的url地址
     */
    getAvatarUrl(size?: 0 | 40 | 100 | 140, history?: number): string;
    /** 强制刷新群资料 */
    renew(): Promise<GroupInfo>;
    private _fetchMembers;
    /** 获取群员列表 */
    getMemberMap(no_cache?: boolean): Promise<Map<number, MemberInfo>>;
    /**
     * 添加精华消息
     * @param seq 消息序号
     * @param rand 消息的随机值
     */
    addEssence(seq: number, rand: number): Promise<string>;
    /**
     * 移除精华消息
     * @param seq 消息序号
     * @param rand 消息的随机值
     */
    removeEssence(seq: number, rand: number): Promise<string>;
    /**
     * 发送一个文件
     * @param file `string`表示从该本地文件路径上传，`Buffer`表示直接上传这段内容
     * @param pid 上传的目标目录id，默认根目录
     * @param name 上传的文件名，`file`为`Buffer`时，若留空则自动以md5命名
     * @param callback 监控上传进度的回调函数，拥有一个"百分比进度"的参数
     * @returns 上传的文件属性
     */
    sendFile(file: string | Buffer | Uint8Array, pid?: string, name?: string, callback?: (percentage: string) => void): Promise<import("./gfs").GfsFileStat>;
    /**
     * 发送一条消息
     * @param content 消息内容
     * @param source 引用回复的消息
     * @param anony 是否匿名
     */
    sendMsg(content: Sendable, source?: Quotable, anony?: Omit<Anonymous, "flag"> | boolean): Promise<MessageRet>;
    private _sendMsgByLongMsg;
    private _sendMsgByFrag;
    /**
     * 设置当前群成员消息屏蔽状态
     * @param member_id
     * @param isScreen
     */
    setScreenMemberMsg(member_id: number, isScreen?: boolean): Promise<boolean>;
    /**
     * 撤回消息，cqhttp方法用
     */
    recallMsg(param: number, rand: number, pktnum: number): Promise<boolean>;
    /**
     * 撤回消息
     * @param message_id 消息id
     */
    recallMsg(message_id: string): Promise<boolean>;
    /**
     * 撤回消息
     * @param message 群聊消息对象
     */
    recallMsg(message: GroupMessage): Promise<boolean>;
    /** 设置群名 */
    setName(name: string): Promise<boolean>;
    /** 全员禁言 */
    muteAll(yes?: boolean): Promise<boolean>;
    /** 发送简易群公告 */
    announce(content: string): Promise<boolean>;
    private _setting;
    /** 允许/禁止匿名 */
    allowAnony(yes?: boolean): Promise<boolean>;
    /**
     * 设置发言限频
     * @param {number} times - 每分钟发言次数
     * - 10: 每分钟十条
     * - 5: 每分钟五条
     * - 0: 无限制
     */
    setMessageRateLimit(times: number): Promise<boolean>;
    /**
     * 设置加群方式
     * @param {string} type - 加群方式的类型。可选值包括：
     * - "AnyOne"：允许任何人加群
     * - "None"：不允许任何人加群
     * - "requireAuth"：需要身份验证
     * - "QAjoin"：需要回答问题并由管理员审核
     * - "Correct"：正确回答问题
     * @param {string} [question] - 在 `type` 为 "QAjoin" 或 "Correct" 时需要传入。问题的内容。
     * @param {string} [answer] - 在 `type` 为 "Correct" 时需要传入。正确回答的问题答案。
     */
    setGroupJoinType(type: string, question?: string, answer?: string): Promise<boolean | undefined>;
    /** 设置群备注 */
    setRemark(remark?: string): Promise<void>;
    /** 禁言匿名群员，默认1800秒 */
    muteAnony(flag: string, duration?: number): Promise<void>;
    /** 获取自己的匿名情报 */
    getAnonyInfo(): Promise<Omit<Anonymous, "flag">>;
    /** 获取 @全体成员 的剩余次数 */
    getAtAllRemainder(): Promise<number>;
    private _getLastSeq;
    /**
     * 标记`seq`之前的消息为已读
     * @param seq 消息序号，默认为`0`，表示标记所有消息
     */
    markRead(seq?: number): Promise<void>;
    /**
     * 获取`seq`之前的`cnt`条聊天记录，默认从最后一条发言往前，`cnt`默认20不能超过20
     * @param seq 消息序号，默认为`0`，表示从最后一条发言往前
     * @param cnt 聊天记录条数，默认`20`，超过`20`按`20`处理
     * @returns 群聊消息列表，服务器记录不足`cnt`条则返回能获取到的最多消息记录
     */
    getChatHistory(seq?: number, cnt?: number): Promise<GroupMessage[]>;
    /**
     * 获取群文件下载地址
     * @param fid 文件id
     */
    getFileUrl(fid: string): Promise<string>;
    /**
     * 获取群分享JSON
     */
    getShareJson(): Promise<any>;
    /** 设置群头像 */
    setAvatar(file: ImageElem["file"]): Promise<void>;
    /**
     * 邀请好友入群
     * @param uid 好友账号
     */
    invite(uid: number): Promise<boolean>;
    /** 打卡 */
    sign(): Promise<{
        result: number;
    }>;
    /** 退群，若为群主则解散该群 */
    quit(): Promise<boolean>;
    /**
     * 设置管理员，use {@link Member.setAdmin}
     * @param uid 群员账号
     * @param yes 是否设为管理员
     */
    setAdmin(uid: number, yes?: boolean): Promise<boolean>;
    /**
     * 设置头衔，use {@link Member.setTitle}
     * @param uid 群员账号
     * @param title 头衔名
     * @param duration 持续时间，默认`-1`，表示永久
     */
    setTitle(uid: number, title?: string, duration?: number): Promise<boolean>;
    /**
     * 设置名片，use {@link Member.setCard}
     * @param uid 群员账号
     * @param card 名片
     */
    setCard(uid: number, card?: string): Promise<boolean>;
    /**
     * 踢出此群，use {@link Member.kick}
     * @param uid 群员账号
     * @param msg @todo 未知参数
     * @param block 是否屏蔽群员
     */
    kickMember(uid: number, msg?: string, block?: boolean): Promise<boolean>;
    /**
     * 禁言群员，use {@link Member.mute}
     * @param uid 群员账号
     * @param duration 禁言时长（秒），默认`600`
     */
    muteMember(uid: number, duration?: number): Promise<void>;
    /**
     * 戳一戳
     * @param uid 群员账号
     */
    pokeMember(uid: number): Promise<boolean>;
    /**
     * 获取群内被禁言人
     * @returns
     */
    getMuteMemberList(): Promise<({
        uin: number | null;
        unMuteTime: string | null;
    } | null)[]>;
    /**
     * 添加表情表态，参考（https://bot.q.qq.com/wiki/develop/api-v2/openapi/emoji/model.html#EmojiType）
     * @param seq 消息序号
     * @param id 表情ID
     * @param type 表情类型 EmojiType
     */
    setReaction(seq: number, id: string, type?: number): Promise<any>;
    /**
     * 删除表情表态，参考（https://bot.q.qq.com/wiki/develop/api-v2/openapi/emoji/model.html#EmojiType）
     * @param seq 消息序号
     * @param id 表情ID
     * @param type 表情类型 EmojiType
     */
    delReaction(seq: number, id: string, type?: number): Promise<any>;
}
export {};
