mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: GroupAdminChange
This commit is contained in:
@@ -260,29 +260,6 @@ export class NTQQGroupApi {
|
||||
return notifies;
|
||||
}
|
||||
|
||||
// async getGroupMemberV2(GroupCode: string, uid: string, forced = false) {
|
||||
// const Listener = this.core.eventWrapper.registerListen(
|
||||
// 'NodeIKernelGroupListener/onMemberInfoChange',
|
||||
// (params, _, members) => params === GroupCode && members.size > 0,
|
||||
// 1,
|
||||
// forced ? 5000 : 250,
|
||||
// );
|
||||
// const retData = await (
|
||||
// this.core.eventWrapper
|
||||
// .createEventFunction('NodeIKernelGroupService/getMemberInfo')
|
||||
// )!(GroupCode, [uid], forced);
|
||||
// if (retData.result !== 0) {
|
||||
// throw new Error(`${retData.errMsg}`);
|
||||
// }
|
||||
// const result = await Listener as unknown;
|
||||
// let member: GroupMember | undefined;
|
||||
// if (Array.isArray(result) && result?.[2] instanceof Map) {
|
||||
// const members = result[2] as Map<string, GroupMember>;
|
||||
// member = members.get(uid);
|
||||
// }
|
||||
// return member;
|
||||
// }
|
||||
|
||||
async searchGroup(groupCode: string) {
|
||||
const [, ret] = await this.core.eventWrapper.callNormalEventV2(
|
||||
'NodeIKernelSearchService/searchGroup',
|
||||
@@ -323,89 +300,6 @@ export class NTQQGroupApi {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// async tryGetGroupMembersV2(groupQQ: string, modeListener = false, num = 30, timeout = 100): Promise<{
|
||||
// infos: Map<string, GroupMember>;
|
||||
// finish: boolean;
|
||||
// hasNext: boolean | undefined;
|
||||
// }> {
|
||||
// const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
// const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
// .catch(() => { });
|
||||
// const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// let resMode2;
|
||||
// if (modeListener) {
|
||||
// const ret = (await once)?.[0];
|
||||
// if (ret) {
|
||||
// resMode2 = ret;
|
||||
// }
|
||||
// }
|
||||
// this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
// return {
|
||||
// infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
// finish: result.result.finish,
|
||||
// hasNext: resMode2?.hasNext,
|
||||
// };
|
||||
// }
|
||||
|
||||
// async GetGroupMembersV3(groupQQ: string, num = 3000, timeout = 2500): Promise<{
|
||||
// infos: Map<string, GroupMember>;
|
||||
// finish: boolean;
|
||||
// hasNext: boolean | undefined;
|
||||
// listenerMode: boolean;
|
||||
// }> {
|
||||
// const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
// const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
// .catch(() => { });
|
||||
// const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// let resMode2;
|
||||
// if (result.result.finish && result.result.infos.size === 0) {
|
||||
// const ret = (await once)?.[0];
|
||||
// if (ret) {
|
||||
// resMode2 = ret;
|
||||
// }
|
||||
// }
|
||||
// this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
// return {
|
||||
// infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
// finish: result.result.finish,
|
||||
// hasNext: resMode2?.hasNext,
|
||||
// listenerMode: resMode2?.hasNext !== undefined
|
||||
// };
|
||||
// }
|
||||
|
||||
// async getGroupMembersV2(groupQQ: string, num = 3000, no_cache: boolean = false): Promise<Map<string, GroupMember>> {
|
||||
// if (no_cache) {
|
||||
// return (await this.getGroupMemberAll(groupQQ, true)).result.infos;
|
||||
// }
|
||||
// let res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
// let ret = res.infos;
|
||||
// if (res.infos.size === 0 && !res.listenerMode) {
|
||||
// res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
// ret = res.infos;
|
||||
// }
|
||||
// if (res.infos.size === 0) {
|
||||
// ret = (await this.getGroupMemberAll(groupQQ)).result.infos;
|
||||
// }
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
// async getGroupMembers(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {
|
||||
// const groupService = this.context.session.getGroupService();
|
||||
// const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow');
|
||||
// const result = await groupService.getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// this.context.logger.logDebug(`获取群(${groupQQ})成员列表结果:`, `members: ${result.result.infos.size}`);
|
||||
// return result.result.infos;
|
||||
// }
|
||||
|
||||
async getGroupFileCount(group_ids: Array<string>) {
|
||||
return this.context.session.getRichMediaService().batchGetGroupFileCount(group_ids);
|
||||
}
|
||||
|
18
src/core/packet/transformer/proto/message/groupAdmin.ts
Normal file
18
src/core/packet/transformer/proto/message/groupAdmin.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { ProtoField, ScalarType } from "@napneko/nap-proto-core";
|
||||
|
||||
export const GroupAdminExtra = {
|
||||
adminUid: ProtoField(1, ScalarType.STRING),
|
||||
isPromote: ProtoField(2, ScalarType.BOOL),
|
||||
}
|
||||
|
||||
export const GroupAdminBody = {
|
||||
extraDisable: ProtoField(1, () => GroupAdminExtra),
|
||||
extraEnable: ProtoField(2, () => GroupAdminExtra),
|
||||
}
|
||||
|
||||
export const GroupAdmin = {
|
||||
groupUin: ProtoField(1, ScalarType.UINT32),
|
||||
flag: ProtoField(2, ScalarType.UINT32),
|
||||
isPromote: ProtoField(3, ScalarType.BOOL),
|
||||
body: ProtoField(4, () => GroupAdminBody),
|
||||
}
|
@@ -32,6 +32,8 @@ import { GroupChange, PushMsgBody } from "@/core/packet/transformer/proto";
|
||||
import { NapProtoMsg } from '@napneko/nap-proto-core';
|
||||
import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent';
|
||||
import { OB11GroupDecreaseEvent, GroupDecreaseSubType } from '../event/notice/OB11GroupDecreaseEvent';
|
||||
import { GroupAdmin } from '@/core/packet/transformer/proto/message/groupAdmin';
|
||||
import { OB11GroupAdminNoticeEvent } from '../event/notice/OB11GroupAdminNoticeEvent';
|
||||
|
||||
type RawToOb11Converters = {
|
||||
[Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: (
|
||||
@@ -965,8 +967,8 @@ export class OneBotMsgApi {
|
||||
}
|
||||
|
||||
async parseSysMessage(msg: number[]) {
|
||||
// Todo Refactor
|
||||
const SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg));
|
||||
console.log(Buffer.from(msg).toString('hex'));
|
||||
if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) {
|
||||
const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent);
|
||||
await this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString());
|
||||
@@ -987,6 +989,22 @@ export class OneBotMsgApi {
|
||||
groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0,
|
||||
this.groupChangDecreseType2String(groupChange.decreaseType),
|
||||
);
|
||||
} else if (SysMessage.contentHead.type == 44 && SysMessage.body?.msgContent) {
|
||||
const groupAmin = new NapProtoMsg(GroupAdmin).decode(SysMessage.body.msgContent);
|
||||
await this.core.apis.GroupApi.refreshGroupMemberCache(groupAmin.groupUin.toString());
|
||||
let enabled = false;
|
||||
let uid = groupAmin.body.extraEnable.adminUid;
|
||||
if (groupAmin.body.extraEnable != null) {
|
||||
enabled = true;
|
||||
} else if (groupAmin.body.extraDisable != null) {
|
||||
enabled = false;
|
||||
}
|
||||
return new OB11GroupAdminNoticeEvent(
|
||||
this.core,
|
||||
groupAmin.groupUin,
|
||||
+await this.core.apis.UserApi.getUinByUidV2(uid),
|
||||
enabled ? 'set' : 'unset'
|
||||
);
|
||||
} else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) {
|
||||
return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent);
|
||||
}
|
||||
|
@@ -1,8 +1,6 @@
|
||||
import {
|
||||
BuddyReqType,
|
||||
ChatType,
|
||||
DataSource,
|
||||
NTGroupMemberRole,
|
||||
GroupNotifyMsgStatus,
|
||||
GroupNotifyMsgType,
|
||||
InstanceContext,
|
||||
@@ -41,8 +39,6 @@ import { OB11InputStatusEvent } from '@/onebot/event/notice/OB11InputStatusEvent
|
||||
import { MessageUnique } from '@/common/message-unique';
|
||||
import { proxiedListenerOf } from '@/common/proxy-handler';
|
||||
import { OB11FriendRequestEvent } from '@/onebot/event/request/OB11FriendRequest';
|
||||
import { OB11GroupAdminNoticeEvent } from '@/onebot/event/notice/OB11GroupAdminNoticeEvent';
|
||||
// import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot/event/notice/OB11GroupDecreaseEvent';
|
||||
import { OB11GroupRequestEvent } from '@/onebot/event/request/OB11GroupRequest';
|
||||
import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent';
|
||||
import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent';
|
||||
@@ -373,47 +369,7 @@ export class NapCatOneBot11Adapter {
|
||||
|
||||
const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type;
|
||||
this.context.logger.logDebug('收到群通知', notify);
|
||||
|
||||
if (
|
||||
[
|
||||
GroupNotifyMsgType.SET_ADMIN,
|
||||
GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_CANCELED,
|
||||
GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_ADMIN,
|
||||
].includes(notify.type)
|
||||
) {
|
||||
const member1 = await this.core.apis.GroupApi.getGroupMember(
|
||||
notify.group.groupCode,
|
||||
notify.user1.uid
|
||||
);
|
||||
this.context.logger.logDebug('有管理员变动通知');
|
||||
// refreshGroupMembers(notify.group.groupCode).then();
|
||||
this.context.logger.logDebug('开始获取变动的管理员');
|
||||
if (member1) {
|
||||
this.context.logger.logDebug('变动管理员获取成功');
|
||||
const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent(
|
||||
this.core,
|
||||
parseInt(notify.group.groupCode),
|
||||
parseInt(member1.uin),
|
||||
[
|
||||
GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_CANCELED,
|
||||
GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_ADMIN,
|
||||
].includes(notify.type)
|
||||
? 'unset'
|
||||
: 'set'
|
||||
);
|
||||
this.networkManager
|
||||
.emitEvent(groupAdminNoticeEvent)
|
||||
.catch((e) =>
|
||||
this.context.logger.logError('处理群管理员变动失败', e)
|
||||
);
|
||||
} else {
|
||||
this.context.logger.logDebug(
|
||||
'获取群通知的成员信息失败',
|
||||
notify,
|
||||
this.core.apis.GroupApi.getGroup(notify.group.groupCode)
|
||||
);
|
||||
}
|
||||
} else if (
|
||||
[GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS].includes(notify.type) &&
|
||||
notify.status == GroupNotifyMsgStatus.KUNHANDLE
|
||||
) {
|
||||
@@ -483,33 +439,6 @@ export class NapCatOneBot11Adapter {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
groupListener.onMemberInfoChange = async (groupCode, dataSource, members) => {
|
||||
//this.context.logger.logDebug('收到群成员信息变动通知', groupCode, changeType);
|
||||
if (dataSource === DataSource.LOCAL) {
|
||||
const existMembers = this.core.apis.GroupApi.groupMemberCache.get(groupCode);
|
||||
if (!existMembers) return;
|
||||
members.forEach((member) => {
|
||||
const existMember = existMembers.get(member.uid);
|
||||
if (!existMember?.isChangeRole) return;
|
||||
this.context.logger.logDebug('变动管理员获取成功');
|
||||
const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent(
|
||||
this.core,
|
||||
parseInt(groupCode),
|
||||
parseInt(member.uin),
|
||||
member.role === NTGroupMemberRole.KADMIN ? 'set' : 'unset'
|
||||
);
|
||||
this.networkManager
|
||||
.emitEvent(groupAdminNoticeEvent)
|
||||
.catch((e) =>
|
||||
this.context.logger.logError('处理群管理员变动失败', e)
|
||||
);
|
||||
existMember.isChangeRole = false;
|
||||
this.context.logger.logDebug('群管理员变动处理完毕');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this.context.session
|
||||
.getGroupService()
|
||||
.addKernelGroupListener(proxiedListenerOf(groupListener, this.context.logger));
|
||||
|
Reference in New Issue
Block a user