refactor: sendtime/join time

This commit is contained in:
手瓜一十雪
2024-07-25 10:32:44 +08:00
parent 7bff1b61e8
commit 3be1ede847
4 changed files with 51 additions and 23 deletions

View File

@@ -18,7 +18,6 @@ export function PromiseTimer<T>(promise: Promise<T>, ms: number): Promise<T> {
); );
return Promise.race([promise, timeoutPromise]); return Promise.race([promise, timeoutPromise]);
} }
export async function runAllWithTimeout<T>(tasks: Promise<T>[], timeout: number): Promise<T[]> { export async function runAllWithTimeout<T>(tasks: Promise<T>[], timeout: number): Promise<T[]> {
const wrappedTasks = tasks.map(task => const wrappedTasks = tasks.map(task =>
PromiseTimer(task, timeout).then( PromiseTimer(task, timeout).then(

View File

@@ -3,7 +3,7 @@ import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core';
import { NTEventDispatch } from '@/common/utils/EventTask'; import { NTEventDispatch } from '@/common/utils/EventTask';
import { log } from '@/common/utils/log'; import { log } from '@/common/utils/log';
import { groupMembers } from '../data'; import { groupMembers } from '../data';
import { runAllWithTimeout } from '@/common/utils/helper'; import { CacheClassFuncAsyncExtend, runAllWithTimeout } from '@/common/utils/helper';
export class NTQQGroupApi { export class NTQQGroupApi {
static async setGroupAvatar(gc: string, filePath: string) { static async setGroupAvatar(gc: string, filePath: string) {
return napCatCore.session.getGroupService().setHeader(gc, filePath); return napCatCore.session.getGroupService().setHeader(gc, filePath);
@@ -21,6 +21,12 @@ export class NTQQGroupApi {
); );
return groupList; return groupList;
} }
@CacheClassFuncAsyncExtend(600, "LastestSendTime", () => true)
static async getGroupMemberLastestSendTimeCache(GroupCode: string) {
return NTQQGroupApi.getGroupMemberLastestSendTime(GroupCode);
}
/** /**
* 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存) * 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存)
* @param GroupCode 群号 * @param GroupCode 群号
@@ -84,7 +90,8 @@ export class NTQQGroupApi {
uids.push(uid); uids.push(uid);
} }
} catch (error) { } catch (error) {
log("getLastestMsg--->", error) log("getLastestMsg--->", error);
return undefined;
} }
} }
let ret = await napCatCore.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { let ret = await napCatCore.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', {

View File

@@ -1,11 +1,10 @@
import { OB11GroupMember } from '../../types'; import { OB11GroupMember } from '../../types';
import { getGroup, getGroupMember, groupMembers } from '@/core/data'; import { getGroup, getGroupMember, groupMembers, selfInfo } from '@/core/data';
import { OB11Constructor } from '../../constructor'; import { OB11Constructor } from '../../constructor';
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { NTQQUserApi } from '@/core/apis/user'; import { NTQQUserApi } from '@/core/apis/user';
import { log, logDebug } from '@/common/utils/log'; import { logDebug } from '@/common/utils/log';
import { isNull } from '../../../common/utils/helper';
import { WebApi } from '@/core/apis/webapi'; import { WebApi } from '@/core/apis/webapi';
import { NTQQGroupApi } from '@/core'; import { NTQQGroupApi } from '@/core';
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
@@ -28,17 +27,19 @@ class GetGroupMemberInfo extends BaseAction<Payload, OB11GroupMember> {
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
const group = await getGroup(payload.group_id.toString()); 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) { if (!group) {
throw (`群(${payload.group_id})不存在`); throw (`群(${payload.group_id})不存在`);
} }
const webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString());
if (payload.no_cache == true || payload.no_cache === 'true') { if (payload.no_cache == true || payload.no_cache === 'true') {
groupMembers.set(group.groupCode, await NTQQGroupApi.getGroupMembers(payload.group_id.toString())); groupMembers.set(group.groupCode, await NTQQGroupApi.getGroupMembers(payload.group_id.toString()));
} }
const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()); const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString());
// log(member); //早返回
if (member) { if (!member) {
logDebug('获取群成员详细信息'); throw (`群(${payload.group_id})成员${payload.user_id}不存在`);
}
try { try {
const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); const info = (await NTQQUserApi.getUserDetailInfo(member.uid));
logDebug('群成员详细信息结果', info); logDebug('群成员详细信息结果', info);
@@ -47,6 +48,8 @@ class GetGroupMemberInfo extends BaseAction<Payload, OB11GroupMember> {
logDebug('获取群成员详细信息失败, 只能返回基础信息', e); logDebug('获取群成员详细信息失败, 只能返回基础信息', e);
} }
const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); 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++) { for (let i = 0, len = webGroupMembers.length; i < len; i++) {
if (webGroupMembers[i]?.uin && webGroupMembers[i].uin === retMember.user_id) { if (webGroupMembers[i]?.uin && webGroupMembers[i].uin === retMember.user_id) {
retMember.join_time = webGroupMembers[i]?.join_time; retMember.join_time = webGroupMembers[i]?.join_time;
@@ -55,11 +58,17 @@ class GetGroupMemberInfo extends BaseAction<Payload, OB11GroupMember> {
retMember.level = webGroupMembers[i]?.lv.level.toString(); retMember.level = webGroupMembers[i]?.lv.level.toString();
} }
} }
return retMember;
} else { } 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;

View File

@@ -39,7 +39,11 @@ class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
const MemberMap: Map<number, OB11GroupMember> = new Map<number, OB11GroupMember>(); const MemberMap: Map<number, OB11GroupMember> = new Map<number, OB11GroupMember>();
// 转为Map 方便索引 // 转为Map 方便索引
let date = Math.round(Date.now() / 1000);
for (let i = 0, len = _groupMembers.length; i < len; i++) { 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]); MemberMap.set(_groupMembers[i].user_id, _groupMembers[i]);
} }
@@ -59,6 +63,15 @@ class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
MemberMap.set(webGroupMembers[i]?.uin, MemberData); 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 一同返回 // 还原索引到Array 一同返回