diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 3f3567fd..dfdca7f6 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -1,4 +1,11 @@ -import { ChatType, GrayTipElement, NapCatCore } from '@/core'; +import { + ChatType, + GrayTipElement, + NapCatCore, + NTGrayTipElementSubTypeV2, + RawMessage, + TipGroupElementType, +} from '@/core'; import { NapCatOneBot11Adapter } from '@/onebot'; import { OB11GroupBanEvent } from '../event/notice/OB11GroupBanEvent'; import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent'; @@ -6,6 +13,11 @@ import { OB11GroupDecreaseEvent } from '../event/notice/OB11GroupDecreaseEvent'; import fastXmlParser from 'fast-xml-parser'; import { OB11GroupMsgEmojiLikeEvent } from '../event/notice/OB11MsgEmojiLikeEvent'; import { MessageUnique } from '@/common/message-unique'; +import { OB11GroupCardEvent } from '@/onebot/event/notice/OB11GroupCardEvent'; +import { OB11GroupUploadNoticeEvent } from '@/onebot/event/notice/OB11GroupUploadNoticeEvent'; +import { OB11GroupPokeEvent } from '@/onebot/event/notice/OB11PokeEvent'; +import { OB11GroupEssenceEvent } from '@/onebot/event/notice/OB11GroupEssenceEvent'; +import { OB11GroupTitleEvent } from '@/onebot/event/notice/OB11GroupTitleEvent'; export class OneBotGroupApi { obContext: NapCatOneBot11Adapter; @@ -16,6 +28,126 @@ export class OneBotGroupApi { this.core = core; } + async parseGroupEvent(msg: RawMessage) { + const NTQQGroupApi = this.core.apis.GroupApi; + const NTQQUserApi = this.core.apis.UserApi; + const NTQQMsgApi = this.core.apis.MsgApi; + const logger = this.core.context.logger; + if (msg.chatType !== ChatType.KCHATTYPEGROUP) { + return; + } + //log("group msg", msg); + if (msg.senderUin && msg.senderUin !== '0') { + const member = await NTQQGroupApi.getGroupMember(msg.peerUid, msg.senderUin); + if (member && member.cardName !== msg.sendMemberName) { + const newCardName = msg.sendMemberName || ''; + const event = new OB11GroupCardEvent(this.core, parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName); + member.cardName = newCardName; + return event; + } + } + + for (const element of msg.elements) { + if (element.grayTipElement && element.grayTipElement.groupElement) { + const groupElement = element.grayTipElement.groupElement; + if (groupElement.type == TipGroupElementType.memberIncrease) { + const MemberIncreaseEvent = await this.obContext.apis.GroupApi.parseGroupMemberIncreaseEvent(msg.peerUid, element.grayTipElement); + if (MemberIncreaseEvent) return MemberIncreaseEvent; + } else if (groupElement.type === TipGroupElementType.ban) { + const BanEvent = await this.obContext.apis.GroupApi.parseGroupBanEvent(msg.peerUid, element.grayTipElement); + if (BanEvent) return BanEvent; + } else if (groupElement.type == TipGroupElementType.kicked) { + NTQQGroupApi.quitGroup(msg.peerUid).then(); + try { + const KickEvent = await this.obContext.apis.GroupApi.parseGroupKickEvent(msg.peerUid, element.grayTipElement); + if (KickEvent) return KickEvent; + } catch (e) { + return new OB11GroupDecreaseEvent( + this.core, + parseInt(msg.peerUid), + parseInt(this.core.selfInfo.uin), + 0, + 'leave', + ); + } + } + } else if (element.fileElement) { + return new OB11GroupUploadNoticeEvent( + this.core, + parseInt(msg.peerUid), parseInt(msg.senderUin || ''), + { + id: element.fileElement.fileUuid!, + name: element.fileElement.fileName, + size: parseInt(element.fileElement.fileSize), + busid: element.fileElement.fileBizId || 0, + }, + ); + } + if (element.grayTipElement) { + if (element.grayTipElement.xmlElement?.templId === '10382') { + const emojiLikeEvent = await this.obContext.apis.GroupApi.parseGroupEmojiLikeEventByGrayTip(msg.peerUid, element.grayTipElement); + if (emojiLikeEvent) return emojiLikeEvent; + } + if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_XMLMSG) { + const GroupIncreaseEvent = await this.obContext.apis.GroupApi.parseGroupIncreaseEvent(msg.peerUid, element.grayTipElement); + if (GroupIncreaseEvent) return GroupIncreaseEvent; + } + + //代码歧义 GrayTipElementSubType.MEMBER_NEW_TITLE + else if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_JSON) { + const json = JSON.parse(element.grayTipElement.jsonGrayTipElement.jsonStr); + if (element.grayTipElement.jsonGrayTipElement.busiId == 1061) { + //判断业务类型 + //Poke事件 + const pokedetail: any[] = json.items; + //筛选item带有uid的元素 + const poke_uid = pokedetail.filter(item => item.uid); + if (poke_uid.length == 2) { + return new OB11GroupPokeEvent( + this.core, + parseInt(msg.peerUid), + parseInt((await NTQQUserApi.getUinByUidV2(poke_uid[0].uid))!), + parseInt((await NTQQUserApi.getUinByUidV2(poke_uid[1].uid))!), + pokedetail, + ); + } + } + if (element.grayTipElement.jsonGrayTipElement.busiId == 2401) { + const searchParams = new URL(json.items[0].jp).searchParams; + const msgSeq = searchParams.get('msgSeq')!; + const Group = searchParams.get('groupCode'); + // const businessId = searchParams.get('businessid'); + const Peer = { + guildId: '', + chatType: ChatType.KCHATTYPEGROUP, + peerUid: Group!, + }; + const msgData = await NTQQMsgApi.getMsgsBySeqAndCount(Peer, msgSeq.toString(), 1, true, true); + return new OB11GroupEssenceEvent( + this.core, + parseInt(msg.peerUid), + MessageUnique.getShortIdByMsgId(msgData.msgList[0].msgId)!, + parseInt(msgData.msgList[0].senderUin), + ); + // 获取MsgSeq+Peer可获取具体消息 + } + if (element.grayTipElement.jsonGrayTipElement.busiId == 2407) { + //下面得改 上面也是错的grayTipElement.subElementType == GrayTipElementSubType.MEMBER_NEW_TITLE + const memberUin = json.items[1].param[0]; + const title = json.items[3].txt; + logger.logDebug('收到群成员新头衔消息', json); + return new OB11GroupTitleEvent( + this.core, + parseInt(msg.peerUid), + parseInt(memberUin), + title, + ); + } + } + } + } + } + async parseGroupBanEvent(GroupCode: string, grayTipElement: GrayTipElement) { const groupElement = grayTipElement?.groupElement; const NTQQGroupApi = this.core.apis.GroupApi; diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 9e70b5d6..61245792 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -9,7 +9,7 @@ import { FaceType, IdMusicSignPostData, MessageElement, - NapCatCore, + NapCatCore, NTGrayTipElementSubTypeV2, Peer, RawMessage, SendMessageElement, @@ -31,6 +31,7 @@ import { uri2local } from '@/common/file'; import { RequestUtil } from '@/common/request'; import fs from 'node:fs'; import fsPromise from 'node:fs/promises'; +import { OB11FriendAddNoticeEvent } from '@/onebot/event/notice/OB11FriendAddNoticeEvent'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -656,6 +657,28 @@ export class OneBotMsgApi { this.core = core; } + async parsePrivateMsgEvent(msg: RawMessage) { + if (msg.chatType !== ChatType.KCHATTYPEC2C) { + return; + } + for (const element of msg.elements) { + if (element.grayTipElement) { + if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_JSON) { + if (element.grayTipElement.jsonGrayTipElement.busiId == 1061) { + const PokeEvent = await this.obContext.apis.FriendApi.parsePrivatePokeEvent(element.grayTipElement); + if (PokeEvent) return PokeEvent; + } + } + if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_XMLMSG) { + //好友添加成功事件 + if (element.grayTipElement.xmlElement.templId === '10229' && msg.peerUin !== '') { + return new OB11FriendAddNoticeEvent(this.core, parseInt(msg.peerUin)); + } + } + } + } + } + async parseMessage( msg: RawMessage, messagePostFormat: string = this.obContext.configLoader.configData.messagePostFormat, diff --git a/src/onebot/helper/event.ts b/src/onebot/helper/event.ts deleted file mode 100644 index f220a414..00000000 --- a/src/onebot/helper/event.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { NapCatOneBot11Adapter } from '..'; -import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent'; -import { OB11FriendAddNoticeEvent } from '../event/notice/OB11FriendAddNoticeEvent'; -import { OB11GroupNoticeEvent } from '../event/notice/OB11GroupNoticeEvent'; -import { OB11GroupCardEvent } from '../event/notice/OB11GroupCardEvent'; -import { OB11GroupDecreaseEvent } from '../event/notice/OB11GroupDecreaseEvent'; -import { OB11GroupUploadNoticeEvent } from '../event/notice/OB11GroupUploadNoticeEvent'; -import { OB11GroupPokeEvent } from '../event/notice/OB11PokeEvent'; -import { OB11GroupEssenceEvent } from '../event/notice/OB11GroupEssenceEvent'; -import { MessageUnique } from '@/common/message-unique'; -import { OB11GroupTitleEvent } from '../event/notice/OB11GroupTitleEvent'; -import { ChatType, NapCatCore, NTGrayTipElementSubTypeV2, Peer, RawMessage, TipGroupElementType } from '@/core'; - -export async function NT2PrivateEvent(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg: RawMessage): Promise { - if (msg.chatType !== ChatType.KCHATTYPEC2C) { - return; - } - for (const element of msg.elements) { - if (element.grayTipElement) { - if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_JSON) { - if (element.grayTipElement.jsonGrayTipElement.busiId == 1061) { - const PokeEvent = await obContext.apis.FriendApi.parsePrivatePokeEvent(element.grayTipElement); - if (PokeEvent) return PokeEvent; - } - } - if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_XMLMSG) { - //好友添加成功事件 - if (element.grayTipElement.xmlElement.templId === '10229' && msg.peerUin !== '') { - return new OB11FriendAddNoticeEvent(core, parseInt(msg.peerUin)); - } - } - } - } -} - -export async function NT2GroupEvent(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg: RawMessage): Promise { - const NTQQGroupApi = core.apis.GroupApi; - const NTQQUserApi = core.apis.UserApi; - const NTQQMsgApi = core.apis.MsgApi; - const logger = core.context.logger; - if (msg.chatType !== ChatType.KCHATTYPEGROUP) { - return; - } - //log("group msg", msg); - if (msg.senderUin && msg.senderUin !== '0') { - const member = await NTQQGroupApi.getGroupMember(msg.peerUid, msg.senderUin); - if (member && member.cardName !== msg.sendMemberName) { - const newCardName = msg.sendMemberName || ''; - const event = new OB11GroupCardEvent(core, parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName); - member.cardName = newCardName; - return event; - } - } - - for (const element of msg.elements) { - if (element.grayTipElement && element.grayTipElement.groupElement) { - const groupElement = element.grayTipElement.groupElement; - if (groupElement.type == TipGroupElementType.memberIncrease) { - const MemberIncreaseEvent = await obContext.apis.GroupApi.parseGroupMemberIncreaseEvent(msg.peerUid, element.grayTipElement); - if (MemberIncreaseEvent) return MemberIncreaseEvent; - } else if (groupElement.type === TipGroupElementType.ban) { - const BanEvent = await obContext.apis.GroupApi.parseGroupBanEvent(msg.peerUid, element.grayTipElement); - if (BanEvent) return BanEvent; - } else if (groupElement.type == TipGroupElementType.kicked) { - NTQQGroupApi.quitGroup(msg.peerUid).then(); - try { - const KickEvent = await obContext.apis.GroupApi.parseGroupKickEvent(msg.peerUid, element.grayTipElement); - if (KickEvent) return KickEvent; - } catch (e) { - return new OB11GroupDecreaseEvent( - core, - parseInt(msg.peerUid), - parseInt(core.selfInfo.uin), - 0, - 'leave', - ); - } - } - } else if (element.fileElement) { - return new OB11GroupUploadNoticeEvent( - core, - parseInt(msg.peerUid), parseInt(msg.senderUin || ''), - { - id: element.fileElement.fileUuid!, - name: element.fileElement.fileName, - size: parseInt(element.fileElement.fileSize), - busid: element.fileElement.fileBizId || 0, - }, - ); - } - if (element.grayTipElement) { - if (element.grayTipElement.xmlElement?.templId === '10382') { - const emojiLikeEvent = await obContext.apis.GroupApi.parseGroupEmojiLikeEventByGrayTip(msg.peerUid, element.grayTipElement); - if (emojiLikeEvent) return emojiLikeEvent; - } - if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_XMLMSG) { - const GroupIncreaseEvent = await obContext.apis.GroupApi.parseGroupIncreaseEvent(msg.peerUid, element.grayTipElement); - if (GroupIncreaseEvent) return GroupIncreaseEvent; - } - - //代码歧义 GrayTipElementSubType.MEMBER_NEW_TITLE - else if (element.grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_JSON) { - const json = JSON.parse(element.grayTipElement.jsonGrayTipElement.jsonStr); - if (element.grayTipElement.jsonGrayTipElement.busiId == 1061) { - //判断业务类型 - //Poke事件 - const pokedetail: any[] = json.items; - //筛选item带有uid的元素 - const poke_uid = pokedetail.filter(item => item.uid); - if (poke_uid.length == 2) { - return new OB11GroupPokeEvent( - core, - parseInt(msg.peerUid), - parseInt((await NTQQUserApi.getUinByUidV2(poke_uid[0].uid))!), - parseInt((await NTQQUserApi.getUinByUidV2(poke_uid[1].uid))!), - pokedetail, - ); - } - } - if (element.grayTipElement.jsonGrayTipElement.busiId == 2401) { - const searchParams = new URL(json.items[0].jp).searchParams; - const msgSeq = searchParams.get('msgSeq')!; - const Group = searchParams.get('groupCode'); - // const businessId = searchParams.get('businessid'); - const Peer: Peer = { - guildId: '', - chatType: ChatType.KCHATTYPEGROUP, - peerUid: Group!, - }; - const msgData = await NTQQMsgApi.getMsgsBySeqAndCount(Peer, msgSeq.toString(), 1, true, true); - return new OB11GroupEssenceEvent( - core, - parseInt(msg.peerUid), - MessageUnique.getShortIdByMsgId(msgData.msgList[0].msgId)!, - parseInt(msgData.msgList[0].senderUin), - ); - // 获取MsgSeq+Peer可获取具体消息 - } - if (element.grayTipElement.jsonGrayTipElement.busiId == 2407) { - //下面得改 上面也是错的grayTipElement.subElementType == GrayTipElementSubType.MEMBER_NEW_TITLE - const memberUin = json.items[1].param[0]; - const title = json.items[3].txt; - logger.logDebug('收到群成员新头衔消息', json); - return new OB11GroupTitleEvent( - core, - parseInt(msg.peerUid), - parseInt(memberUin), - title, - ); - } - } - } - } -} diff --git a/src/onebot/helper/index.ts b/src/onebot/helper/index.ts index c32bcf4f..6e403291 100644 --- a/src/onebot/helper/index.ts +++ b/src/onebot/helper/index.ts @@ -1,3 +1,2 @@ export * from './config'; export * from './entities'; -export * from './event'; diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 75eb0f47..aa58860e 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -42,7 +42,6 @@ import { OB11GroupRequestEvent } from '@/onebot/event/request/OB11GroupRequest'; import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent'; import { LRUCache } from '@/common/lru-cache'; -import { NT2GroupEvent, NT2PrivateEvent } from './helper'; import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener'; import { SysMessage } from '@/core/proto/SysMessage'; import { GreyTipWrapper } from '@/core/proto/GreyTipWrapper'; @@ -527,14 +526,14 @@ export class NapCatOneBot11Adapter { this.networkManager.emitEvent(ob11Msg); }).catch(e => this.context.logger.logError('constructMessage error: ', e)); - NT2GroupEvent(this.core, this, message).then(groupEvent => { + this.apis.GroupApi.parseGroupEvent(message).then(groupEvent => { if (groupEvent) { // log("post group event", groupEvent); this.networkManager.emitEvent(groupEvent); } }).catch(e => this.context.logger.logError('constructGroupEvent error: ', e)); - NT2PrivateEvent(this.core, this, message).then(privateEvent => { + this.apis.MsgApi.parsePrivateMsgEvent(message).then(privateEvent => { if (privateEvent) { // log("post private event", privateEvent); this.networkManager.emitEvent(privateEvent);