contact_contact.js

import { SingleMessage, MessageSource, Friend, Group, MessageChain } from '../index.js';

/**
 * `Contact` 类型代表所有的联系人。
 * 
 * @property { String } #id 该联系人的标识,在 `Friend` 中表示好友的 **qq号**,在 `Group` 中表示群聊的 **群号**。
 */
class Contact {

    #id;

    /**
     * 返回当前窗口上正在进行的聊天对象。如果没有聊天对象,或聊天对象类型不受支持,则返回 `null`。
     * 
     * @returns { Contact } 当前窗口上正在进行的聊天对象。
     */
    static getCurrentContact() {
        const contact = app?.__vue_app__?.config?.globalProperties?.$store?.state?.common_Aio?.curAioData;
        const uin = contact?.header?.uin;
        const uid = contact?.header?.uid;
        if (!uin || !uid) {
            return null;
        }
        switch (contact.chatType) {
            case Friend.getChatType():
                return Friend.make(uin, uid);
            case Group.getChatType():
                return Group.make(uin);
        }
    }

    /**
     * (抽象函数,由子类实现)
     * 
     * 返回该联系人类型所对应的 **chatType**。
     * 
     * @returns { Number } 该联系人类型所对应的 **chatType**。
     */
    static getChatType() {
        throw new Error('Abstract method not implemented.');
    }

    /**
     * 仅供子类调用。
     * 
     * @param { String } id 在 `Friend` 中表示好友的 **qq号**,在 `Group` 中表示群聊的 **群号**。
     */
    constructor(id) {
        this.#id = id;
    }

    /**
     * 向该联系人发送一条消息,并返回其在服务器上的来源。
     * 
     * @param { MessageChain | SingleMessage } message 消息内容。
     * @param { String } msgId 消息的 **msgId**,如果此参数为空则会随机生成。
     * @returns { MessageSource } 发送的信息在服务器上的来源。
     */
    async sendMessage(message, msgId = undefined) {
        if (!msgId) {
            msgId = `7${ Array.from({ length: 18 }, () => Math.floor(Math.random() * 10)).join('') }`;
        }
        await euphonyNative.invokeNative('ns-ntApi', 'nodeIKernelMsgService/sendMsg', false, {
            msgId,
            peer: this.toPeer(),
            msgElements: message instanceof SingleMessage ? [ await message.toElement() ] : await message.toElements(),
            msgAttributeInfos: new Map()
        });
        return new MessageSource(msgId, this);
    }

    /**
     * 返回该联系人的 `#id` 属性。
     * 
     * @returns { String } 该联系人的 `#id` 属性。
     */
    getId() {
        return this.#id;
    }

    /**
     * (抽象函数,由子类实现)
     * 
     * 构造并返回该联系人所对应的 **peer** 对象。
     * 
     * @returns { Native } 该联系人所对应的 **peer** 对象。
     */
    toPeer() {
        throw new Error('Abstract method not implemented.');
    }

}

export default Contact