From b1c6ce3885dec32a0e5144ac9b500431708eb6b7 Mon Sep 17 00:00:00 2001 From: Alen Date: Mon, 22 Jul 2024 01:22:38 +0800 Subject: [PATCH] =?UTF-8?q?BUG=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.尝试让所有人能收到group_admin事件 2.修复请求API: delete_msg(POST请求网址传参)将负数判定为文本导致无法调用的问题 --- src/core/src/core.ts | 14 ++++++++-- src/core/src/entities/group.ts | 1 + src/onebot11/action/msg/DeleteMsg.ts | 9 ++++-- src/onebot11/main.ts | 41 ++++++++++++++++++++++++++-- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/core/src/core.ts b/src/core/src/core.ts index 2ac4bcfb..f4ecc7d6 100644 --- a/src/core/src/core.ts +++ b/src/core/src/core.ts @@ -21,7 +21,7 @@ import { dbUtil } from '@/common/utils/db'; import { sleep } from '@/common/utils/helper'; import crypto from 'node:crypto'; import { rawFriends, friends, groupMembers, groups, selfInfo, stat } from '@/core/data'; -import { RawMessage } from '@/core/entities'; +import { GroupMember, RawMessage } from '@/core/entities'; import { NTEventDispatch } from '@/common/utils/EventTask'; import { enableConsoleLog, @@ -346,7 +346,7 @@ export class NapCatCore { // console.log('onMemberListChange', groupCode, arg); }; groupListener.onMemberInfoChange = (groupCode, changeType, members) => { - // console.log('onMemberInfoChange', arg); + //console.log('onMemberInfoChange', groupCode, changeType, members); if (changeType === 0 && members.get(selfInfo.uid)?.isDelete) { // 自身退群或者被踢退群 5s用于Api操作 之后不再出现 setTimeout(() => { @@ -359,6 +359,9 @@ export class NapCatCore { members.forEach((member, uid) => { const existMember = existMembers.get(uid); if (existMember) { + // 检查管理变动 + member.isChangeRole = this.checkAdminEvent(groupCode, member, existMember); + // 更新成员信息 Object.assign(existMember, member); } else { @@ -471,6 +474,13 @@ export class NapCatCore { const loginList = await this.loginService.getLoginList(); return loginList; } + checkAdminEvent(groupCode: string, memberNew: GroupMember, memberOld: GroupMember | undefined ) : boolean { + if (memberNew.role !== memberOld.role) { + log(`群 ${groupCode} ${memberNew.nick} 角色变更为 ${memberNew.role === 3 ? '管理员' : '群员' }`); + return true; + } + return false; + } } export const napCatCore = new NapCatCore(); diff --git a/src/core/src/entities/group.ts b/src/core/src/entities/group.ts index 8e8dde29..c05d2c2f 100644 --- a/src/core/src/entities/group.ts +++ b/src/core/src/entities/group.ts @@ -52,4 +52,5 @@ export interface GroupMember { isRobot: boolean; sex?: Sex qqLevel?: QQLevel + isChangeRole: boolean; } \ No newline at end of file diff --git a/src/onebot11/action/msg/DeleteMsg.ts b/src/onebot11/action/msg/DeleteMsg.ts index 99eeffc2..008cffe5 100644 --- a/src/onebot11/action/msg/DeleteMsg.ts +++ b/src/onebot11/action/msg/DeleteMsg.ts @@ -7,7 +7,12 @@ import { FromSchema, JSONSchema } from 'json-schema-to-ts'; const SchemaData = { type: 'object', properties: { - message_id: { type: 'number' }, + message_id: { + oneOf:[ + { type: 'number' }, + { type: 'string' } + ] + } }, required: ['message_id'] } as const satisfies JSONSchema; @@ -18,7 +23,7 @@ class DeleteMsg extends BaseAction { actionName = ActionName.DeleteMsg; PayloadSchema = SchemaData; protected async _handle(payload: Payload) { - const msg = await dbUtil.getMsgByShortId(payload.message_id); + const msg = await dbUtil.getMsgByShortId(Number(payload.message_id)); if (msg) { await NTQQMsgApi.recallMsg({ peerUid: msg.peerUid, chatType: msg.chatType }, [msg.msgId]); } diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index 51bcc381..71a3db09 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -19,7 +19,7 @@ import { OB11Config, ob11Config } from '@/onebot11/config'; import { httpHeart, ob11HTTPServer } from '@/onebot11/server/http'; import { ob11WebsocketServer } from '@/onebot11/server/ws/WebsocketServer'; import { ob11ReverseWebsockets } from '@/onebot11/server/ws/ReverseWebsocket'; -import { getGroup, getGroupMember, selfInfo, tempGroupCodeMap } from '@/core/data'; +import { getGroup, getGroupMember, groupMembers, selfInfo, tempGroupCodeMap } from '@/core/data'; import { dbUtil } from '@/common/utils/db'; import { BuddyListener, GroupListener, NodeIKernelBuddyListener } from '@/core/listeners'; import { OB11FriendRequestEvent } from '@/onebot11/event/request/OB11FriendRequest'; @@ -267,9 +267,46 @@ export class NapCatOnebot11 { const groupListener = new GroupListener(); groupListener.onGroupNotifiesUpdated = async (doubt, notifies) => { //console.log('ob11 onGroupNotifiesUpdated', notifies[0]); - this.postGroupNotifies(notifies).then().catch(e => logError('postGroupNotifies error: ', e)); + if (![GroupNotifyTypes.ADMIN_SET, GroupNotifyTypes.ADMIN_UNSET, GroupNotifyTypes.ADMIN_UNSET_OTHER].includes(notifies[0].type)) { + this.postGroupNotifies(notifies).then().catch(e => logError('postGroupNotifies error: ', e)); + }; }; groupListener.onMemberInfoChange = async (groupCode: string, changeType: number, members: Map) => { + //console.log("ob11 onMemberInfoChange", groupCode, changeType, members) + if (changeType === 1) { + let member; + for (const [key, value] of members) { + member = value; + break; + } + const existMembers = groupMembers.get(groupCode); + if (existMembers) { + const existMember = existMembers.get(member.uid); + if (existMember) { + if (existMember.isChangeRole) { + //console.log("ob11 onMemberInfoChange:eventMember:localMember", member, existMember) + const notify: GroupNotify[] = [ + { + time: Date.now(), + seq: (Date.now() * 1000 * 1000).toString(), + type: member.role === GroupMemberRole.admin ? GroupNotifyTypes.ADMIN_SET : GroupNotifyTypes.ADMIN_UNSET_OTHER, // 8 设置; 13 取消 + status: 0, + group: { groupCode: groupCode, groupName: '' }, + user1: { uid: member.uid, nickName: member.nick }, + user2: { uid: member.uid, nickName: member.nick }, + actionUser: { uid: '', nickName: '' }, + actionTime: '0', + invitationExt: { srcType: 0, groupCode: '0', waitStatus: 0 }, + postscript: '', + repeatSeqs: [], + warningTips: '' + } + ]; + this.postGroupNotifies(notify).then().catch(e => logError('postGroupNotifies error: ', e)); + } + } + } + } // 如果自身是非管理员也许要从这里获取Delete 成员变动 待测试与验证 const role = (await getGroupMember(groupCode, selfInfo.uin))?.role; const isPrivilege = role === 3 || role === 4;