diff --git a/package.json b/package.json index 28b726d..4291466 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "deploy-win": "cmd /c \"xcopy /C /S /Y dist\\* %LITELOADERQQNT_PROFILE%\\plugins\\LLOneBot\\\"", "format": "prettier -cw .", "check": "tsc", - "compile:proto": "pbjs --no-create --no-convert --no-encode --no-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js systemMessage.proto profileLikeTip.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js" + "compile:proto": "pbjs --no-create --no-convert --no-encode --no-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js systemMessage.proto profileLikeTip.proto groupMemberIncrease.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js" }, "author": "", "license": "MIT", @@ -43,7 +43,7 @@ "electron-vite": "^2.3.0", "protobufjs-cli": "^1.1.3", "typescript": "^5.6.3", - "vite": "^5.4.8", + "vite": "^5.4.9", "vite-plugin-cp": "^4.0.8" }, "packageManager": "yarn@4.5.0" diff --git a/src/ntqqapi/proto/compiled.d.ts b/src/ntqqapi/proto/compiled.d.ts index ee5b5f7..3d6e972 100644 --- a/src/ntqqapi/proto/compiled.d.ts +++ b/src/ntqqapi/proto/compiled.d.ts @@ -64,11 +64,8 @@ export namespace SysMsg { /** Properties of a SystemMessageHeader. */ interface ISystemMessageHeader { - /** SystemMessageHeader peerNumber */ - peerNumber?: (number|null); - - /** SystemMessageHeader peerString */ - peerString?: (string|null); + /** SystemMessageHeader peerUin */ + peerUin?: (number|null); /** SystemMessageHeader uin */ uin?: (number|null); @@ -86,11 +83,8 @@ export namespace SysMsg { */ constructor(properties?: SysMsg.ISystemMessageHeader); - /** SystemMessageHeader peerNumber. */ - public peerNumber: number; - - /** SystemMessageHeader peerString. */ - public peerString: string; + /** SystemMessageHeader peerUin. */ + public peerUin: number; /** SystemMessageHeader uin. */ public uin: number; @@ -160,10 +154,10 @@ export namespace SysMsg { public msgType: number; /** SystemMessageMsgSpec subType. */ - public subType: number; + public subType?: (number|null); /** SystemMessageMsgSpec subSubType. */ - public subSubType: number; + public subSubType?: (number|null); /** SystemMessageMsgSpec msgSeq. */ public msgSeq: number; @@ -172,7 +166,7 @@ export namespace SysMsg { public time: number; /** SystemMessageMsgSpec other. */ - public other: number; + public other?: (number|null); /** * Decodes a SystemMessageMsgSpec message from the specified reader or buffer. @@ -466,4 +460,68 @@ export namespace SysMsg { */ public static getTypeUrl(typeUrlPrefix?: string): string; } + + /** Properties of a GroupMemberIncrease. */ + interface IGroupMemberIncrease { + + /** GroupMemberIncrease groupCode */ + groupCode?: (number|null); + + /** GroupMemberIncrease memberUid */ + memberUid?: (string|null); + + /** GroupMemberIncrease type */ + type?: (number|null); + + /** GroupMemberIncrease adminUid */ + adminUid?: (string|null); + } + + /** Represents a GroupMemberIncrease. */ + class GroupMemberIncrease implements IGroupMemberIncrease { + + /** + * Constructs a new GroupMemberIncrease. + * @param [properties] Properties to set + */ + constructor(properties?: SysMsg.IGroupMemberIncrease); + + /** GroupMemberIncrease groupCode. */ + public groupCode: number; + + /** GroupMemberIncrease memberUid. */ + public memberUid: string; + + /** GroupMemberIncrease type. */ + public type: number; + + /** GroupMemberIncrease adminUid. */ + public adminUid: string; + + /** + * Decodes a GroupMemberIncrease message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GroupMemberIncrease + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): SysMsg.GroupMemberIncrease; + + /** + * Decodes a GroupMemberIncrease message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GroupMemberIncrease + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): SysMsg.GroupMemberIncrease; + + /** + * Gets the default type url for GroupMemberIncrease + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } } diff --git a/src/ntqqapi/proto/compiled.js b/src/ntqqapi/proto/compiled.js index 6cbe19c..1f0f50b 100644 --- a/src/ntqqapi/proto/compiled.js +++ b/src/ntqqapi/proto/compiled.js @@ -150,8 +150,7 @@ export const SysMsg = $root.SysMsg = (() => { * Properties of a SystemMessageHeader. * @memberof SysMsg * @interface ISystemMessageHeader - * @property {number|null} [peerNumber] SystemMessageHeader peerNumber - * @property {string|null} [peerString] SystemMessageHeader peerString + * @property {number|null} [peerUin] SystemMessageHeader peerUin * @property {number|null} [uin] SystemMessageHeader uin * @property {string|null} [uid] SystemMessageHeader uid */ @@ -172,20 +171,12 @@ export const SysMsg = $root.SysMsg = (() => { } /** - * SystemMessageHeader peerNumber. - * @member {number} peerNumber + * SystemMessageHeader peerUin. + * @member {number} peerUin * @memberof SysMsg.SystemMessageHeader * @instance */ - SystemMessageHeader.prototype.peerNumber = 0; - - /** - * SystemMessageHeader peerString. - * @member {string} peerString - * @memberof SysMsg.SystemMessageHeader - * @instance - */ - SystemMessageHeader.prototype.peerString = ""; + SystemMessageHeader.prototype.peerUin = 0; /** * SystemMessageHeader uin. @@ -231,11 +222,7 @@ export const SysMsg = $root.SysMsg = (() => { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.peerNumber = reader.uint32(); - break; - } - case 2: { - message.peerString = reader.string(); + message.peerUin = reader.uint32(); break; } case 5: { @@ -327,19 +314,19 @@ export const SysMsg = $root.SysMsg = (() => { /** * SystemMessageMsgSpec subType. - * @member {number} subType + * @member {number|null|undefined} subType * @memberof SysMsg.SystemMessageMsgSpec * @instance */ - SystemMessageMsgSpec.prototype.subType = 0; + SystemMessageMsgSpec.prototype.subType = null; /** * SystemMessageMsgSpec subSubType. - * @member {number} subSubType + * @member {number|null|undefined} subSubType * @memberof SysMsg.SystemMessageMsgSpec * @instance */ - SystemMessageMsgSpec.prototype.subSubType = 0; + SystemMessageMsgSpec.prototype.subSubType = null; /** * SystemMessageMsgSpec msgSeq. @@ -359,11 +346,32 @@ export const SysMsg = $root.SysMsg = (() => { /** * SystemMessageMsgSpec other. - * @member {number} other + * @member {number|null|undefined} other * @memberof SysMsg.SystemMessageMsgSpec * @instance */ - SystemMessageMsgSpec.prototype.other = 0; + SystemMessageMsgSpec.prototype.other = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + // Virtual OneOf for proto3 optional field + Object.defineProperty(SystemMessageMsgSpec.prototype, "_subType", { + get: $util.oneOfGetter($oneOfFields = ["subType"]), + set: $util.oneOfSetter($oneOfFields) + }); + + // Virtual OneOf for proto3 optional field + Object.defineProperty(SystemMessageMsgSpec.prototype, "_subSubType", { + get: $util.oneOfGetter($oneOfFields = ["subSubType"]), + set: $util.oneOfSetter($oneOfFields) + }); + + // Virtual OneOf for proto3 optional field + Object.defineProperty(SystemMessageMsgSpec.prototype, "_other", { + get: $util.oneOfGetter($oneOfFields = ["other"]), + set: $util.oneOfSetter($oneOfFields) + }); /** * Decodes a SystemMessageMsgSpec message from the specified reader or buffer. @@ -1007,6 +1015,141 @@ export const SysMsg = $root.SysMsg = (() => { return ProfileLikeTip; })(); + SysMsg.GroupMemberIncrease = (function() { + + /** + * Properties of a GroupMemberIncrease. + * @memberof SysMsg + * @interface IGroupMemberIncrease + * @property {number|null} [groupCode] GroupMemberIncrease groupCode + * @property {string|null} [memberUid] GroupMemberIncrease memberUid + * @property {number|null} [type] GroupMemberIncrease type + * @property {string|null} [adminUid] GroupMemberIncrease adminUid + */ + + /** + * Constructs a new GroupMemberIncrease. + * @memberof SysMsg + * @classdesc Represents a GroupMemberIncrease. + * @implements IGroupMemberIncrease + * @constructor + * @param {SysMsg.IGroupMemberIncrease=} [properties] Properties to set + */ + function GroupMemberIncrease(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupMemberIncrease groupCode. + * @member {number} groupCode + * @memberof SysMsg.GroupMemberIncrease + * @instance + */ + GroupMemberIncrease.prototype.groupCode = 0; + + /** + * GroupMemberIncrease memberUid. + * @member {string} memberUid + * @memberof SysMsg.GroupMemberIncrease + * @instance + */ + GroupMemberIncrease.prototype.memberUid = ""; + + /** + * GroupMemberIncrease type. + * @member {number} type + * @memberof SysMsg.GroupMemberIncrease + * @instance + */ + GroupMemberIncrease.prototype.type = 0; + + /** + * GroupMemberIncrease adminUid. + * @member {string} adminUid + * @memberof SysMsg.GroupMemberIncrease + * @instance + */ + GroupMemberIncrease.prototype.adminUid = ""; + + /** + * Decodes a GroupMemberIncrease message from the specified reader or buffer. + * @function decode + * @memberof SysMsg.GroupMemberIncrease + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {SysMsg.GroupMemberIncrease} GroupMemberIncrease + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberIncrease.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.SysMsg.GroupMemberIncrease(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.groupCode = reader.uint32(); + break; + } + case 3: { + message.memberUid = reader.string(); + break; + } + case 4: { + message.type = reader.uint32(); + break; + } + case 5: { + message.adminUid = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupMemberIncrease message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof SysMsg.GroupMemberIncrease + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {SysMsg.GroupMemberIncrease} GroupMemberIncrease + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberIncrease.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Gets the default type url for GroupMemberIncrease + * @function getTypeUrl + * @memberof SysMsg.GroupMemberIncrease + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GroupMemberIncrease.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/SysMsg.GroupMemberIncrease"; + }; + + return GroupMemberIncrease; + })(); + return SysMsg; })(); diff --git a/src/ntqqapi/proto/groupMemberIncrease.proto b/src/ntqqapi/proto/groupMemberIncrease.proto new file mode 100644 index 0000000..8b6a0bc --- /dev/null +++ b/src/ntqqapi/proto/groupMemberIncrease.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package SysMsg; + +// GroupChange? +message GroupMemberIncrease { + uint32 groupCode = 1; + string memberUid = 3; + uint32 type = 4; // 130:主动 131:被邀请 + string adminUid = 5; +} diff --git a/src/ntqqapi/proto/systemMessage.proto b/src/ntqqapi/proto/systemMessage.proto index 08f9dc3..13cdb9b 100644 --- a/src/ntqqapi/proto/systemMessage.proto +++ b/src/ntqqapi/proto/systemMessage.proto @@ -8,23 +8,22 @@ message SystemMessage { } message SystemMessageHeader { - uint32 peerNumber = 1; - string peerString = 2; + uint32 peerUin = 1; + //string peerUid = 2; uint32 uin = 5; optional string uid = 6; } message SystemMessageMsgSpec { uint32 msgType = 1; - uint32 subType = 2; - uint32 subSubType = 3; + optional uint32 subType = 2; + optional uint32 subSubType = 3; uint32 msgSeq = 5; uint32 time = 6; //uint64 msgId = 12; - uint32 other = 13; + optional uint32 other = 13; } message SystemMessageBodyWrapper { bytes body = 2; - // Find the first [08], or ignore the first 7 bytes? -} \ No newline at end of file +} diff --git a/src/onebot11/adapter.ts b/src/onebot11/adapter.ts index abc0cbb..85d9160 100644 --- a/src/onebot11/adapter.ts +++ b/src/onebot11/adapter.ts @@ -23,6 +23,7 @@ import { llonebotError } from '../common/globalVars' import { OB11GroupAdminNoticeEvent } from './event/notice/OB11GroupAdminNoticeEvent' import { OB11ProfileLikeEvent } from './event/notice/OB11ProfileLikeEvent' import { SysMsg } from '@/ntqqapi/proto/compiled' +import { OB11GroupIncreaseEvent } from './event/notice/OB11GroupIncreaseEvent' declare module 'cordis' { interface Context { @@ -349,7 +350,7 @@ class OneBot11Adapter extends Service { this.ctx.on('nt/friend-request', input => { this.handleFriendRequest(input) }) - this.ctx.on('nt/system-message-created', input => { + this.ctx.on('nt/system-message-created', async input => { const sysMsg = SysMsg.SystemMessage.decode(input) const { msgType, subType, subSubType } = sysMsg.msgSpec[0] ?? {} if (msgType === 528 && subType === 39 && subSubType === 39) { @@ -358,8 +359,16 @@ class OneBot11Adapter extends Service { const detail = tip.content?.msg?.detail if (!detail) return const [times] = detail.txt?.match(/\d+/) ?? ['0'] - const profileLikeEvent = new OB11ProfileLikeEvent(detail.uin!, detail.nickname!, +times) - this.dispatch(profileLikeEvent) + const event = new OB11ProfileLikeEvent(detail.uin!, detail.nickname!, +times) + this.dispatch(event) + } else if (msgType === 33) { + const tip = SysMsg.GroupMemberIncrease.decode(sysMsg.bodyWrapper!.body!) + if (tip.type !== 130) return + this.ctx.logger.info('群成员增加', tip) + const memberUin = await this.ctx.ntUserApi.getUinByUid(tip.memberUid) + const operatorUin = await this.ctx.ntUserApi.getUinByUid(tip.adminUid) + const event = new OB11GroupIncreaseEvent(tip.groupCode, +memberUin, +operatorUin) + this.dispatch(event) } }) } diff --git a/src/onebot11/entities.ts b/src/onebot11/entities.ts index 6b3d9f8..dd32cd7 100644 --- a/src/onebot11/entities.ts +++ b/src/onebot11/entities.ts @@ -423,11 +423,11 @@ export namespace OB11Entities { const groupElement = grayTipElement?.groupElement if (groupElement) { if (groupElement.type === TipGroupElementType.MemberIncrease) { - ctx.logger.info('收到群成员增加消息', groupElement) + /*ctx.logger.info('收到群成员增加消息', groupElement) const { memberUid, adminUid } = groupElement const memberUin = await ctx.ntUserApi.getUinByUid(memberUid) const operatorUin = adminUid ? await ctx.ntUserApi.getUinByUid(adminUid) : memberUin - return new OB11GroupIncreaseEvent(+msg.peerUid, +memberUin, +operatorUin) + return new OB11GroupIncreaseEvent(+msg.peerUid, +memberUin, +operatorUin)*/ } else if (groupElement.type === TipGroupElementType.Ban) { ctx.logger.info('收到群成员禁言提示', groupElement)