import { Cache, Contact, Member } from '../index.js';
/**
* `Group` 类型代表群聊。
*/
class Group extends Contact {
/**
* 返回该联系人类型所对应的 **chatType**,值为 **2**。
*
* @returns { Number } 该联系人类型所对应的 **chatType**,值为 **2**。
*/
static getChatType() {
return 2;
}
/**
* 构造一个 **群号** 为 `id` 的群聊。
*
* 该函数构造出的群聊全局只有一个实例,相同的 `id` 将会返回相同的对象。
*
* 在任何情况下,都应该使用该函数来构造群聊,而非直接使用构造器。
*
* @param { String } id 群聊的 **群号**。
* @returns { Group } 构造出的群聊。
*/
static make(id) {
return Cache.withCache(`group-${ id }`, () => new Group(id));
}
/**
* 构造一个 **群号** 为 `id` 的群聊。
*
* 注意:在任何情况下,都不应该直接使用该构造器来构造群聊。相反地,你应该使用 `Group.make(id)` 函数来构造群聊。
*
* @param { String } id 群聊的 **群号**。
*/
constructor(id) {
super(id);
}
/**
* 获取并返回该群聊在原生qq中的对象。
*
* @returns { Native } 原生群聊对象。
*/
getNative() {
const groupMap = app?.__vue_app__?.config?.globalProperties?.$store?.state?.common_Contact_group?.groupMap;
if (!groupMap) {
return null;
}
return groupMap[this.getId()];
}
/**
* 获取并返回该群聊的群聊名称。
*
* @returns { String } 群聊名称。
*/
getName() {
return this.getNative()?.groupName;
}
/**
* 获取并返回该群聊的群聊最大人数。
*
* @returns { Number } 群聊最大人数。
*/
getMaxMemberCount() {
return this.getNative()?.maxMember;
}
/**
* 获取并返回该群聊的群聊人数。
*
* @returns { Number } 群聊人数。
*/
getMemberCount() {
return this.getNative()?.memberCount;
}
/**
* 获取并返回该群聊的群聊备注。
*
* @returns { String } 群聊备注。
*/
getRemark() {
return this.getNative()?.remarkName;
}
/**
* 通过 **qq号** 获取该群聊的某个成员。
*
* 若不存在,则会返回 `null`。
*
* @param { String } uin 成员的 **qq号**。
* @returns { Member } 获取到的成员。
*/
getMemberFromUin(uin) {
const uid = euphonyNative.convertUinToUid(uin);
if (!uid) {
return null;
}
return Member.make(this, uin, uid);
}
/**
* 通过 **uid** 获取该群聊的某个成员。
*
* 若不存在,则会返回 `null`。
*
* @param { String } uid 成员的 **uid**。
* @returns { Member } 获取到的成员。
*/
getMemberFromUid(uid) {
const uin = euphonyNative.convertUidToUin(uid);
if (!uin) {
return null;
}
return Member.make(this, uin, uid);
}
/**
* 获取该群聊的所有成员。
*
* @returns { Array<Member> } 该群聊的所有成员。
*/
async getMembers() {
const sceneId = await euphonyNative.invokeNative('ns-ntApi', 'nodeIKernelGroupService/createMemberListScene', false, {
groupCode: this.getId(),
scene: 'groupMemberList_MainWindow'
});
const members = await euphonyNative.invokeNative('ns-ntApi', 'nodeIKernelGroupService/getNextMemberList', false, {
sceneId,
num: this.getMemberCount()
});
const result = [];
for (const [uid, nativeMember] of members.result.infos) {
result.push(Member.make(this, nativeMember.uin, uid));
}
return result;
}
/**
* 构造并返回该群聊所对应的 **peer** 对象。
*
* @returns { Native } 该群聊所对应的 **peer** 对象。
*/
toPeer() {
return {
chatType: Group.getChatType(),
peerUid: this.getId(),
guildId: ''
};
}
}
export default Group