mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: sendtime/join time
This commit is contained in:
@@ -18,9 +18,8 @@ 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(
|
||||||
result => ({ status: 'fulfilled', value: result }),
|
result => ({ status: 'fulfilled', value: result }),
|
||||||
error => ({ status: 'rejected', reason: error })
|
error => ({ status: 'rejected', reason: error })
|
||||||
|
@@ -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', {
|
||||||
|
@@ -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,25 +27,29 @@ 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 {
|
}
|
||||||
const info = (await NTQQUserApi.getUserDetailInfo(member.uid));
|
try {
|
||||||
logDebug('群成员详细信息结果', info);
|
const info = (await NTQQUserApi.getUserDetailInfo(member.uid));
|
||||||
Object.assign(member, info);
|
logDebug('群成员详细信息结果', info);
|
||||||
} catch (e) {
|
Object.assign(member, info);
|
||||||
logDebug('获取群成员详细信息失败, 只能返回基础信息', e);
|
} catch (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;
|
|
@@ -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 一同返回
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user