This commit is contained in:
idranme 2024-10-24 17:40:35 +08:00
parent c9e39769dd
commit 91ca4e96c4
No known key found for this signature in database
GPG Key ID: D0F3677546E6ECD5
7 changed files with 254 additions and 52 deletions

View File

@ -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-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js profileLikeTip.proto groupMemberChange.proto message.proto richMedia.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js"
"compile:proto": "pbjs --no-create --no-convert --no-verify -t static-module -w es6 -p src/ntqqapi/proto -o src/ntqqapi/proto/compiled.js profileLikeTip.proto groupNotify.proto message.proto richMedia.proto && pbts -o src/ntqqapi/proto/compiled.d.ts src/ntqqapi/proto/compiled.js"
},
"author": "",
"license": "MIT",

View File

@ -366,6 +366,74 @@ export namespace SysMsg {
*/
public static getTypeUrl(typeUrlPrefix?: string): string;
}
/** Properties of a GroupInvite. */
interface IGroupInvite {
/** GroupInvite groupCode */
groupCode?: (number|null);
/** GroupInvite operatorUid */
operatorUid?: (string|null);
}
/** Represents a GroupInvite. */
class GroupInvite implements IGroupInvite {
/**
* Constructs a new GroupInvite.
* @param [properties] Properties to set
*/
constructor(properties?: SysMsg.IGroupInvite);
/** GroupInvite groupCode. */
public groupCode: number;
/** GroupInvite operatorUid. */
public operatorUid: string;
/**
* Encodes the specified GroupInvite message. Does not implicitly {@link SysMsg.GroupInvite.verify|verify} messages.
* @param message GroupInvite message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
public static encode(message: SysMsg.IGroupInvite, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Encodes the specified GroupInvite message, length delimited. Does not implicitly {@link SysMsg.GroupInvite.verify|verify} messages.
* @param message GroupInvite message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
public static encodeDelimited(message: SysMsg.IGroupInvite, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Decodes a GroupInvite message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns GroupInvite
* @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.GroupInvite;
/**
* Decodes a GroupInvite message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns GroupInvite
* @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.GroupInvite;
/**
* Gets the default type url for GroupInvite
* @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns The default type url
*/
public static getTypeUrl(typeUrlPrefix?: string): string;
}
}
/** Namespace Msg. */

View File

@ -781,6 +781,147 @@ export const SysMsg = $root.SysMsg = (() => {
return GroupMemberChange;
})();
SysMsg.GroupInvite = (function() {
/**
* Properties of a GroupInvite.
* @memberof SysMsg
* @interface IGroupInvite
* @property {number|null} [groupCode] GroupInvite groupCode
* @property {string|null} [operatorUid] GroupInvite operatorUid
*/
/**
* Constructs a new GroupInvite.
* @memberof SysMsg
* @classdesc Represents a GroupInvite.
* @implements IGroupInvite
* @constructor
* @param {SysMsg.IGroupInvite=} [properties] Properties to set
*/
function GroupInvite(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]];
}
/**
* GroupInvite groupCode.
* @member {number} groupCode
* @memberof SysMsg.GroupInvite
* @instance
*/
GroupInvite.prototype.groupCode = 0;
/**
* GroupInvite operatorUid.
* @member {string} operatorUid
* @memberof SysMsg.GroupInvite
* @instance
*/
GroupInvite.prototype.operatorUid = "";
/**
* Encodes the specified GroupInvite message. Does not implicitly {@link SysMsg.GroupInvite.verify|verify} messages.
* @function encode
* @memberof SysMsg.GroupInvite
* @static
* @param {SysMsg.IGroupInvite} message GroupInvite message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
GroupInvite.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.groupCode != null && Object.hasOwnProperty.call(message, "groupCode"))
writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.groupCode);
if (message.operatorUid != null && Object.hasOwnProperty.call(message, "operatorUid"))
writer.uint32(/* id 5, wireType 2 =*/42).string(message.operatorUid);
return writer;
};
/**
* Encodes the specified GroupInvite message, length delimited. Does not implicitly {@link SysMsg.GroupInvite.verify|verify} messages.
* @function encodeDelimited
* @memberof SysMsg.GroupInvite
* @static
* @param {SysMsg.IGroupInvite} message GroupInvite message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
GroupInvite.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a GroupInvite message from the specified reader or buffer.
* @function decode
* @memberof SysMsg.GroupInvite
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {SysMsg.GroupInvite} GroupInvite
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
GroupInvite.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.GroupInvite();
while (reader.pos < end) {
let tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
message.groupCode = reader.uint32();
break;
}
case 5: {
message.operatorUid = reader.string();
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a GroupInvite message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof SysMsg.GroupInvite
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {SysMsg.GroupInvite} GroupInvite
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
GroupInvite.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Gets the default type url for GroupInvite
* @function getTypeUrl
* @memberof SysMsg.GroupInvite
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
GroupInvite.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/SysMsg.GroupInvite";
};
return GroupInvite;
})();
return SysMsg;
})();

View File

@ -7,3 +7,8 @@ message GroupMemberChange {
uint32 type = 4; // 130: 131:
string adminUid = 5;
}
message GroupInvite {
uint32 groupCode = 1;
string operatorUid = 5;
}

View File

@ -20,7 +20,7 @@ class GetGroupMemberInfo extends BaseAction<Payload, OB11GroupMember> {
protected async _handle(payload: Payload) {
const groupCode = payload.group_id.toString()
const uid = await this.ctx.ntUserApi.getUidByUin(payload.user_id.toString())
const uid = await this.ctx.ntUserApi.getUidByUin(payload.user_id.toString(), groupCode)
if (!uid) throw new Error('无法获取用户信息')
const member = await this.ctx.ntGroupApi.getGroupMember(groupCode, uid, payload.no_cache)
if (member) {

View File

@ -9,7 +9,7 @@ import {
} from '../ntqqapi/types'
import { OB11GroupRequestEvent } from './event/request/OB11GroupRequest'
import { OB11FriendRequestEvent } from './event/request/OB11FriendRequest'
import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from './event/notice/OB11GroupDecreaseEvent'
import { OB11GroupDecreaseEvent } from './event/notice/OB11GroupDecreaseEvent'
import { selfInfo } from '../common/globalVars'
import { OB11Config, Config as LLOBConfig } from '../common/types'
import { OB11WebSocket, OB11WebSocketReverseManager } from './connect/ws'
@ -92,26 +92,19 @@ class OneBot11Adapter extends Service {
try {
const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type
if ([GroupNotifyType.MemberLeaveNotifyAdmin, GroupNotifyType.KickMemberNotifyAdmin].includes(notify.type)) {
this.ctx.logger.info('有成员退出通知', notify)
const member1Uin = await this.ctx.ntUserApi.getUinByUid(notify.user1.uid)
let operatorId = member1Uin
let subType: GroupDecreaseSubType = 'leave'
if (notify.user2.uid) {
// 是被踢的
const member2Uin = await this.ctx.ntUserApi.getUinByUid(notify.user2.uid)
if (member2Uin) {
operatorId = member2Uin
}
subType = 'kick'
}
this.ctx.logger.info('有群成员被踢', notify.group.groupCode, notify.user1.uid, notify.user2.uid)
const memberUin = await this.ctx.ntUserApi.getUinByUid(notify.user1.uid)
const adminUin = await this.ctx.ntUserApi.getUinByUid(notify.user2.uid)
const event = new OB11GroupDecreaseEvent(
parseInt(notify.group.groupCode),
parseInt(member1Uin),
parseInt(operatorId),
subType,
parseInt(memberUin),
parseInt(adminUin),
'kick',
)
this.dispatch(event)
}
}
else if (notify.type === GroupNotifyType.RequestJoinNeedAdminiStratorPass && notify.status === GroupNotifyStatus.Unhandle) {
this.ctx.logger.info('有加群请求')
const requestUin = await this.ctx.ntUserApi.getUinByUid(notify.user1.uid)
@ -369,15 +362,21 @@ class OneBot11Adapter extends Service {
const operatorUin = await this.ctx.ntUserApi.getUinByUid(tip.adminUid)
const event = new OB11GroupIncreaseEvent(tip.groupCode, +memberUin, +operatorUin)
this.dispatch(event)
}/* else if (msgType === 34) {
const tip = SysMsg.GroupMemberChange.decode(sysMsg.bodyWrapper!.body!)
} else if (msgType === 34) {
const tip = SysMsg.GroupMemberChange.decode(sysMsg.body!.msgContent!)
if (tip.type !== 130) return // adminUid: 0
this.ctx.logger.info('群成员减少', tip)
const memberUin = await this.ctx.ntUserApi.getUinByUid(tip.memberUid)
const operatorUin = await this.ctx.ntUserApi.getUinByUid(tip.adminUid) //0
const subType = tip.type === 130 ? 'leave' : 'kick'
const event = new OB11GroupDecreaseEvent(tip.groupCode, +memberUin, +operatorUin, subType)
const userId = Number(memberUin)
const event = new OB11GroupDecreaseEvent(tip.groupCode, userId, userId)
this.dispatch(event)
}*/
} else if (msgType === 87) {
const tip = SysMsg.GroupInvite.decode(sysMsg.body!.msgContent!)
this.ctx.logger.info('群成员增加', tip)
const operatorUin = await this.ctx.ntUserApi.getUinByUid(tip.operatorUid)
const event = new OB11GroupIncreaseEvent(tip.groupCode, +selfInfo.uin, +operatorUin, 'invite')
this.dispatch(event)
}
})
}
}

View File

@ -423,6 +423,8 @@ export namespace OB11Entities {
for (const element of msg.elements) {
const grayTipElement = element.grayTipElement
const groupElement = grayTipElement?.groupElement
const xmlElement = grayTipElement?.xmlElement
if (groupElement) {
if (groupElement.type === TipGroupElementType.Ban) {
ctx.logger.info('收到群成员禁言提示', groupElement)
@ -485,11 +487,8 @@ export namespace OB11Entities {
busid: element.fileElement.fileBizId || 0,
})
}
if (grayTipElement) {
const xmlElement = grayTipElement.xmlElement
if (xmlElement?.templId === '10382') {
else if (xmlElement) {
if (xmlElement.templId === '10382') {
ctx.logger.info('收到表情回应我的消息', xmlElement.templParam)
try {
const senderUin = xmlElement.templParam.get('jp_uin')
@ -517,29 +516,19 @@ export namespace OB11Entities {
} catch (e) {
ctx.logger.error('解析表情回应消息失败', (e as Error).stack)
}
}
if (
grayTipElement.subElementType == GrayTipElementSubType.XmlMsg &&
xmlElement?.templId == '10179'
) {
ctx.logger.info('收到新人被邀请进群消息', grayTipElement)
if (xmlElement?.content) {
const regex = /jp="(\d+)"/g
const matches: string[] = []
let match: RegExpExecArray | null = null
while ((match = regex.exec(xmlElement.content)) !== null) {
matches.push(match[1])
}
if (matches.length === 2) {
const [invitor, invitee] = matches
} else if (xmlElement.templId == '10179') {
ctx.logger.info('收到新人被邀请进群消息', xmlElement)
const invitor = xmlElement.templParam.get('invitor')
const invitee = xmlElement.templParam.get('invitee')
if (invitee === selfInfo.uin) return
if (invitor && invitee) {
return new OB11GroupIncreaseEvent(+msg.peerUid, +invitee, +invitor, 'invite')
}
}
}
else if (grayTipElement.subElementType == GrayTipElementSubType.JSON) {
if (grayTipElement) {
if (grayTipElement.subElementType == GrayTipElementSubType.JSON) {
const json = JSON.parse(grayTipElement.jsonGrayTipElement!.jsonStr)
if (grayTipElement.jsonGrayTipElement?.busiId === '1061') {
const param = grayTipElement.jsonGrayTipElement.xmlToJsonParam