diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index 8f973b14..9b653c7a 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -18,9 +18,8 @@ export function PromiseTimer(promise: Promise, ms: number): Promise { ); return Promise.race([promise, timeoutPromise]); } - export async function runAllWithTimeout(tasks: Promise[], timeout: number): Promise { - const wrappedTasks = tasks.map(task => + const wrappedTasks = tasks.map(task => PromiseTimer(task, timeout).then( result => ({ status: 'fulfilled', value: result }), error => ({ status: 'rejected', reason: error }) diff --git a/src/core/src/apis/group.ts b/src/core/src/apis/group.ts index fa792058..2a47a1a0 100644 --- a/src/core/src/apis/group.ts +++ b/src/core/src/apis/group.ts @@ -3,7 +3,7 @@ import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; import { log } from '@/common/utils/log'; import { groupMembers } from '../data'; -import { runAllWithTimeout } from '@/common/utils/helper'; +import { CacheClassFuncAsyncExtend, runAllWithTimeout } from '@/common/utils/helper'; export class NTQQGroupApi { static async setGroupAvatar(gc: string, filePath: string) { return napCatCore.session.getGroupService().setHeader(gc, filePath); @@ -21,6 +21,12 @@ export class NTQQGroupApi { ); return groupList; } + + @CacheClassFuncAsyncExtend(600, "LastestSendTime", () => true) + static async getGroupMemberLastestSendTimeCache(GroupCode: string) { + return NTQQGroupApi.getGroupMemberLastestSendTime(GroupCode); + } + /** * 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存) * @param GroupCode 群号 @@ -84,7 +90,8 @@ export class NTQQGroupApi { uids.push(uid); } } catch (error) { - log("getLastestMsg--->", error) + log("getLastestMsg--->", error); + return undefined; } } let ret = await napCatCore.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { diff --git a/src/onebot11/action/group/GetGroupMemberInfo.ts b/src/onebot11/action/group/GetGroupMemberInfo.ts index fb0ddb54..4a1bbc41 100644 --- a/src/onebot11/action/group/GetGroupMemberInfo.ts +++ b/src/onebot11/action/group/GetGroupMemberInfo.ts @@ -1,11 +1,10 @@ import { OB11GroupMember } from '../../types'; -import { getGroup, getGroupMember, groupMembers } from '@/core/data'; +import { getGroup, getGroupMember, groupMembers, selfInfo } from '@/core/data'; import { OB11Constructor } from '../../constructor'; import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { NTQQUserApi } from '@/core/apis/user'; -import { log, logDebug } from '@/common/utils/log'; -import { isNull } from '../../../common/utils/helper'; +import { logDebug } from '@/common/utils/log'; import { WebApi } from '@/core/apis/webapi'; import { NTQQGroupApi } from '@/core'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; @@ -28,25 +27,29 @@ class GetGroupMemberInfo extends BaseAction { PayloadSchema = SchemaData; protected async _handle(payload: Payload) { const group = await getGroup(payload.group_id.toString()); + const role = (await getGroupMember(payload.group_id, selfInfo.uin))?.role; + const isPrivilege = role === 3 || role === 4; if (!group) { throw (`群(${payload.group_id})不存在`); } - const webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString()); if (payload.no_cache == true || payload.no_cache === 'true') { groupMembers.set(group.groupCode, await NTQQGroupApi.getGroupMembers(payload.group_id.toString())); } const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()); - // log(member); - if (member) { - logDebug('获取群成员详细信息'); - try { - const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); - logDebug('群成员详细信息结果', info); - Object.assign(member, info); - } catch (e) { - logDebug('获取群成员详细信息失败, 只能返回基础信息', e); - } - const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); + //早返回 + if (!member) { + throw (`群(${payload.group_id})成员${payload.user_id}不存在`); + } + try { + const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); + logDebug('群成员详细信息结果', info); + Object.assign(member, info); + } catch (e) { + logDebug('获取群成员详细信息失败, 只能返回基础信息', e); + } + const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); + if (isPrivilege) { + const webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString()); for (let i = 0, len = webGroupMembers.length; i < len; i++) { if (webGroupMembers[i]?.uin && webGroupMembers[i].uin === retMember.user_id) { retMember.join_time = webGroupMembers[i]?.join_time; @@ -55,11 +58,17 @@ class GetGroupMemberInfo extends BaseAction { retMember.level = webGroupMembers[i]?.lv.level.toString(); } } - return retMember; } else { - throw (`群(${payload.group_id})成员${payload.user_id}不存在`); + let LastestMsgList = await NTQQGroupApi.getLastestMsg(payload.group_id.toString(), [payload.user_id.toString()]); + if (LastestMsgList?.msgList?.length && LastestMsgList?.msgList?.length > 0) { + let last_send_time = LastestMsgList.msgList[0].msgTime; + if (last_send_time && last_send_time != '0' && last_send_time != '') { + retMember.last_sent_time = parseInt(last_send_time); + retMember.join_time = Math.round(Date.now() / 1000);//兜底数据 防止群管乱杀 + } + } } + return retMember; } } - -export default GetGroupMemberInfo; +export default GetGroupMemberInfo; \ No newline at end of file diff --git a/src/onebot11/action/group/GetGroupMemberList.ts b/src/onebot11/action/group/GetGroupMemberList.ts index 42b2e7cc..d49b405e 100644 --- a/src/onebot11/action/group/GetGroupMemberList.ts +++ b/src/onebot11/action/group/GetGroupMemberList.ts @@ -39,7 +39,11 @@ class GetGroupMemberList extends BaseAction { const MemberMap: Map = new Map(); // 转为Map 方便索引 + let date = Math.round(Date.now() / 1000); for (let i = 0, len = _groupMembers.length; i < len; i++) { + // 保证基础数据有这个 同时避免群管插件过于依赖这个杀了 + _groupMembers[i].join_time = date; + _groupMembers[i].last_sent_time = date; MemberMap.set(_groupMembers[i].user_id, _groupMembers[i]); } @@ -59,6 +63,15 @@ class GetGroupMemberList extends BaseAction { MemberMap.set(webGroupMembers[i]?.uin, MemberData); } } + } else { + const DateMap = await NTQQGroupApi.getGroupMemberLastestSendTimeCache(payload.group_id.toString());//开始从本地拉取 + for (let DateUin of DateMap.keys()) { + const MemberData = MemberMap.get(parseInt(DateUin)); + if (MemberData) { + MemberData.last_sent_time = parseInt(DateMap.get(DateUin)!); + //join_time 有基础数据兜底 + } + } } // 还原索引到Array 一同返回