This commit is contained in:
手瓜一十雪 2024-08-10 20:28:52 +08:00
commit 99f4752c89

View File

@ -2,93 +2,62 @@ import {
ChatType, ChatType,
Group, Group,
GroupMember, GroupMember,
GroupMemberCache,
GroupMemberRole, GroupMemberRole,
GroupNotify, GroupNotify,
GroupRequestOperateTypes, GroupRequestOperateTypes,
MemberExtSourceType, MemberExtSourceType,
} from '../entities'; NodeIKernelGroupListener,
} from '@/core';
import { GeneralCallResult, InstanceContext, NapCatCore, NodeIKernelGroupService } from '@/core'; import { GeneralCallResult, InstanceContext, NapCatCore, NodeIKernelGroupService } from '@/core';
import { isNumeric, runAllWithTimeout } from '@/common/utils/helper'; import { isNumeric, runAllWithTimeout } from '@/common/utils/helper';
import { NodeIKernelGroupListener } from '../listeners';
export class NTQQGroupApi { export class NTQQGroupApi {
context: InstanceContext; context: InstanceContext;
core: NapCatCore; core: NapCatCore;
public groupMembers: Map<string, Map<string, GroupMember>> = new Map<string, Map<string, GroupMember>>(); groupCache: Map<string, Group> = new Map<string, Group>();
public groups: Map<string, Group> = new Map<string, Group>(); groupMemberCache: Map<string, Map<string, GroupMember>> = new Map<string, Map<string, GroupMember>>();
constructor(context: InstanceContext, core: NapCatCore) { constructor(context: InstanceContext, core: NapCatCore) {
this.context = context; this.context = context;
this.core = core; this.core = core;
} }
async setGroupAvatar(gc: string, filePath: string) { async setGroupAvatar(gc: string, filePath: string) {
return this.context.session.getGroupService().setHeader(gc, filePath); return this.context.session.getGroupService().setHeader(gc, filePath);
} }
async getGroup(qq: string | number): Promise<Group | undefined> { async getGroups(forced = false) {
let group = this.groups.get(qq.toString()); type ListenerType = NodeIKernelGroupListener['onGroupListUpdate'];
const [_retData, _updateType, groupList] = await this.core.eventWrapper.CallNormalEvent <(force: boolean) => Promise<any>, ListenerType>
(
'NodeIKernelGroupService/getGroupList',
'NodeIKernelGroupListener/onGroupListUpdate',
1,
5000,
() => true,
forced,
);
return groupList;
}
async getGroup(groupCode: string, forced = false) {
let group = this.groupCache.get(groupCode.toString());
if (!group) { if (!group) {
try { try {
const _groups = await this.getGroups(); const groupList = await this.getGroups(forced);
if (_groups.length) { if (groupList.length) {
_groups.forEach(g => { groupList.forEach(g => {
this.groups.set(g.groupCode, g); this.groupCache.set(g.groupCode, g);
}); });
} }
} catch (e) { } catch (e) {
return undefined; return undefined;
} }
} }
group = this.groups.get(qq.toString()); group = this.groupCache.get(groupCode.toString());
return group; return group;
} }
async getGroupMember(groupQQ: string | number, memberUinOrUid: string | number) {
groupQQ = groupQQ.toString();
memberUinOrUid = memberUinOrUid.toString();
let members = this.groupMembers.get(groupQQ);
if (!members) {
try {
members = await this.getGroupMembers(groupQQ);
// 更新群成员列表
this.groupMembers.set(groupQQ, members);
}
catch (e) {
return null;
}
}
// log('getGroupMember', members);
const getMember = () => {
let member: GroupMember | undefined = undefined;
if (isNumeric(memberUinOrUid)) {
member = Array.from(members!.values()).find(member => member.uin === memberUinOrUid);
} else {
member = members!.get(memberUinOrUid);
}
return member;
};
let member = getMember();
if (!member) {
members = await this.getGroupMembers(groupQQ);
member = getMember();
}
return member;
}
async getGroups(forced = false) {
type ListenerType = NodeIKernelGroupListener['onGroupListUpdate'];
const [_retData, _updateType, groupList] = await this.core.eventWrapper.CallNormalEvent<(force: boolean) => Promise<any>, ListenerType>
(
'NodeIKernelGroupService/getGroupList',
'NodeIKernelGroupListener/onGroupListUpdate',
1,
5000,
(updateType) => true,
forced,
);
return groupList;
}
async getGroupMemberLatestSendTimeCache(GroupCode: string, uids: string[]) { async getGroupMemberLatestSendTimeCache(GroupCode: string, uids: string[]) {
return this.getGroupMemberLatestSendTime(GroupCode, uids); return this.getGroupMemberLatestSendTime(GroupCode, uids);
} }
@ -96,6 +65,7 @@ export class NTQQGroupApi {
/** /**
* QQ自带数据库获取群成员最后发言时间( ) * QQ自带数据库获取群成员最后发言时间( )
* @param GroupCode * @param GroupCode
* @param uids QQ号
* @returns Map<string, string> key: uin value: sendTime * @returns Map<string, string> key: uin value: sendTime
* @example * @example
* let ret = await NTQQGroupApi.getGroupMemberLastestSendTime('123456'); * let ret = await NTQQGroupApi.getGroupMemberLastestSendTime('123456');
@ -129,7 +99,7 @@ export class NTQQGroupApi {
} }
async getLatestMsgByUids(GroupCode: string, uids: string[]) { async getLatestMsgByUids(GroupCode: string, uids: string[]) {
const ret = await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', {
chatInfo: { chatInfo: {
peerUid: GroupCode, peerUid: GroupCode,
chatType: ChatType.group, chatType: ChatType.group,
@ -142,13 +112,46 @@ export class NTQQGroupApi {
isIncludeCurrent: true, isIncludeCurrent: true,
pageLimit: 1, pageLimit: 1,
}); });
return ret;
} }
async getGroupMemberAll(GroupCode: string, forced = false) { async getGroupMemberAll(GroupCode: string, forced = false) {
return this.context.session.getGroupService().getAllMemberList(GroupCode, forced); return this.context.session.getGroupService().getAllMemberList(GroupCode, forced);
} }
async getGroupMember(groupCode: string | number, memberUinOrUid: string | number) {
const groupCodeStr = groupCode.toString();
const memberUinOrUidStr = memberUinOrUid.toString();
let members = this.groupMemberCache.get(groupCodeStr);
if (!members) {
try {
members = await this.getGroupMembers(groupCodeStr);
// 更新群成员列表
this.groupMemberCache.set(groupCodeStr, members);
}
catch (e) {
return null;
}
}
// log('getGroupMember', members);
function getMember() {
let member: GroupMember | undefined;
if (isNumeric(memberUinOrUidStr)) {
member = Array.from(members!.values()).find(member => member.uin === memberUinOrUidStr);
} else {
member = members!.get(memberUinOrUidStr);
}
return member;
}
let member = getMember();
if (!member) {
members = await this.getGroupMembers(groupCodeStr);
member = getMember();
}
return member;
}
async getLatestMsg(GroupCode: string, uins: string[]) { async getLatestMsg(GroupCode: string, uins: string[]) {
const uids: Array<string> = []; const uids: Array<string> = [];
for (const uin of uins) { for (const uin of uins) {
@ -157,7 +160,7 @@ export class NTQQGroupApi {
uids.push(uid); uids.push(uid);
} }
} }
const ret = await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', {
chatInfo: { chatInfo: {
peerUid: GroupCode, peerUid: GroupCode,
chatType: ChatType.group, chatType: ChatType.group,
@ -170,7 +173,6 @@ export class NTQQGroupApi {
isIncludeCurrent: true, isIncludeCurrent: true,
pageLimit: 1, pageLimit: 1,
}); });
return ret;
} }
async getGroupRecommendContactArkJson(GroupCode: string) { async getGroupRecommendContactArkJson(GroupCode: string) {
@ -224,16 +226,16 @@ export class NTQQGroupApi {
} }
async getSingleScreenNotifies(num: number) { async getSingleScreenNotifies(num: number) {
const [_retData, _doubt, _seq, notifies] = await this.core.eventWrapper.CallNormalEvent<(arg1: boolean, arg2: string, arg3: number) => Promise<any>, (doubt: boolean, seq: string, notifies: GroupNotify[]) => void> const [_retData, _doubt, _seq, notifies] = await this.core.eventWrapper.CallNormalEvent <(arg1: boolean, arg2: string, arg3: number) => Promise<any>, (doubt: boolean, seq: string, notifies: GroupNotify[]) => void>
( (
'NodeIKernelGroupService/getSingleScreenNotifies', 'NodeIKernelGroupService/getSingleScreenNotifies',
'NodeIKernelGroupListener/onGroupSingleScreenNotifies', 'NodeIKernelGroupListener/onGroupSingleScreenNotifies',
1, 1,
5000, 5000,
() => true, () => true,
false, false,
'', '',
num, num,
); );
return notifies; return notifies;
} }
@ -243,17 +245,17 @@ export class NTQQGroupApi {
type EventType = NodeIKernelGroupService['getMemberInfo']; type EventType = NodeIKernelGroupService['getMemberInfo'];
// NTEventDispatch.CreatListenerFunction('NodeIKernelGroupListener/onGroupMemberInfoUpdate', // NTEventDispatch.CreatListenerFunction('NodeIKernelGroupListener/onGroupMemberInfoUpdate',
//return napCatCore.session.getGroupService().getMemberInfo(GroupCode, [uid], forced); //return napCatCore.session.getGroupService().getMemberInfo(GroupCode, [uid], forced);
const [ret, _groupCode, _changeType, _members] = await this.core.eventWrapper.CallNormalEvent<EventType, ListenerType> const [,,, _members] = await this.core.eventWrapper.CallNormalEvent<EventType, ListenerType>
( (
'NodeIKernelGroupService/getMemberInfo', 'NodeIKernelGroupService/getMemberInfo',
'NodeIKernelGroupListener/onMemberInfoChange', 'NodeIKernelGroupListener/onMemberInfoChange',
1, 1,
5000, 5000,
(groupCode: string, changeType: number, members: Map<string, GroupMember>) => { (groupCode: string, changeType: number, members: Map<string, GroupMember>) => {
return groupCode == GroupCode && members.has(uid); return groupCode == GroupCode && members.has(uid);
}, },
GroupCode, [uid], forced, GroupCode, [uid], forced,
); );
return _members.get(uid); return _members.get(uid);
} }
@ -296,7 +298,7 @@ export class NTQQGroupApi {
'NodeIKernelGroupService/getGroupRecommendContactArkJson', 'NodeIKernelGroupService/getGroupRecommendContactArkJson',
5000, 5000,
GroupCode, GroupCode,
); );
return ret.arkJson; return ret.arkJson;
} }
@ -355,9 +357,11 @@ export class NTQQGroupApi {
} }
// 头衔不可用 // 头衔不可用
/*
async setGroupTitle(groupQQ: string, uid: string, title: string) { async setGroupTitle(groupQQ: string, uid: string, title: string) {
} }
*/
async publishGroupBulletin(groupQQ: string, content: string, picInfo: { async publishGroupBulletin(groupQQ: string, content: string, picInfo: {
id: string, id: string,