contact_friend.js

import { Cache, Contact } from '../index.js';

/**
 * `Friend` 类型代表好友。
 * 
 * @property { String } #uid 好友的 **uid**。
 */
class Friend extends Contact {

    #uid;

    /**
     * 返回该联系人类型所对应的 **chatType**,值为 **1**。
     * 
     * @returns { Number } 该联系人类型所对应的 **chatType**,值为 **1**。
     */
    static getChatType() { 
        return 1;
    }

    /**
     * 构造一个 **qq号** 为 `uin`,**uid** 为 `uid` 的好友。
     * 
     * 该函数构造出的好友全局只有一个实例,相同的 `uin` 和 `uid` 将会返回相同的对象。
     * 
     * 在任何情况下,都应该使用该函数来构造好友,而非直接使用构造器。
     * 
     * @param { String } uin 好友的 **qq号**。
     * @param { String } uid 好友的 **uid**。
     * @returns { Friend } 构造出的好友。
     */
    static make(uin, uid) {
        return Cache.withCache(`friend-${ uin }-${ uid }`, () => new Friend(uin, uid));
    }

    /**
     * 通过 **qq号** 来获取一个好友。
     * 
     * 若不存在,则会返回 `null`。
     * 
     * @param { String } uin 要获取的好友的 **qq号**。
     * @returns { Friend } 获取到的好友。
     */
    static fromUin(uin) {
        const uid = euphonyNative.convertUinToUid(uin);
        if (!uid) {
            return null;
        }
        return Friend.make(uin, uid);
    }

    /**
     * 通过 **uid** 来获取一个好友。
     * 
     * 若不存在,则会返回 `null`。
     * 
     * @param { String } uid 要获取的好友的 **uid**。
     * @returns { Friend } 获取到的好友。
     */
    static fromUid(uid) {
        const uin = euphonyNative.convertUidToUin(uid);
        if (!uin) {
            return null;
        }
        return Friend.make(uin, uid);
    }

    /**
     * 构造一个 **qq号** 为 `uin`,**uid** 为 `uid` 的好友。
     * 
     * 注意:在任何情况下,都不应该直接使用该构造器来构造好友。相反地,你应该使用 `Friend.make(uin, uid)` 函数来构造好友。
     * 
     * @param { String } uin 好友的 **qq号**。
     * @param { String } uid 好友的 **uid**。
     */
    constructor(uin, uid) {
        super(uin);
        this.#uid = uid;
    }

    /**
     * 获取并返回该好友在原生qq中的对象。
     * 
     * @returns { Native } 原生好友对象。
     */
    getNative() {
        const buddyMap = app?.__vue_app__?.config?.globalProperties?.$store?.state?.common_Contact_buddy?.buddyMap;
        if (!buddyMap) {
            return null;
        }
        return buddyMap[this.#uid];
    }

    /**
     * 返回该好友的 `#uid` 属性。
     * 
     * @returns { String } 该好友的 `#uid` 属性。
     */
    getUid() {
        return this.#uid;
    }

    /**
     * 获取并返回该好友的生日。
     * 
     * @returns { Date } 生日。
     */
    getBirthday() {
        const buddy = this.getNative();
        if (!buddy || !buddy.baseInfo) {
            return null;
        }
        return new Date(buddy.baseInfo.birthday_year, buddy.baseInfo.birthday_month - 1, buddy.baseInfo.birthday_day);
    }

    /**
     * 获取并返回该好友的个性签名。
     * 
     * @returns { String } 个性签名。
     */
    getBio() {
        return this.getNative()?.baseInfo?.longNick;
    }

    /**
     * 获取并返回该好友的昵称。
     * 
     * @returns { String } 昵称。
     */
    getNick() {
        return this.getNative()?.coreInfo?.nick;
    }

    /**
     * 获取并返回该好友的 **qid**。
     * 
     * @returns { String } **qid**。
     */
    getQid() {
        return this.getNative()?.baseInfo?.qid;
    }

    /**
     * 获取并返回该好友的好友备注。
     * 
     * @returns { String } 好友备注。
     */
    getRemark() {
        return this.getNative()?.coreInfo?.remark;
    }

    /**
     * 构造并返回该好友所对应的 **peer** 对象。
     * 
     * @returns { Native } 该好友所对应的 **peer** 对象。
     */
    toPeer() {
        return {
            chatType: Friend.getChatType(),
            peerUid: this.#uid,
            guildId: ''
        };
    }

}

export default Friend