From 1d089665713089ede652d8217b7d11e7a4cd980f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 24 Aug 2025 15:50:08 +0800 Subject: [PATCH] feat: #1179 --- src/core/packet/context/operationContext.ts | 5 ++- .../packet/transformer/action/SetGroupTodo.ts | 24 ++++++++++++++ src/core/packet/transformer/action/index.ts | 1 + src/core/packet/transformer/proto/index.ts | 1 + .../transformer/proto/oidb/Oidb.0xf90_1.ts | 6 ++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/packet/SetGroupTodo.ts | 31 +++++++++++++++++++ src/onebot/action/router.ts | 1 + src/onebot/index.ts | 1 - 9 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/core/packet/transformer/action/SetGroupTodo.ts create mode 100644 src/core/packet/transformer/proto/oidb/Oidb.0xf90_1.ts create mode 100644 src/onebot/action/packet/SetGroupTodo.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 5a185299..9554b3d1 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -34,7 +34,10 @@ export class PacketOperationContext { const req = trans.SendPoke.build(is_group, peer, target ?? peer); await this.context.client.sendOidbPacket(req); } - + async SetGroupTodo(groupUin: number, msgSeq: string) { + const req = trans.SetGroupTodo.build(groupUin, msgSeq); + await this.context.client.sendOidbPacket(req, true); + } async FetchRkey() { const req = trans.FetchRkey.build(); const resp = await this.context.client.sendOidbPacket(req, true); diff --git a/src/core/packet/transformer/action/SetGroupTodo.ts b/src/core/packet/transformer/action/SetGroupTodo.ts new file mode 100644 index 00000000..e535d69d --- /dev/null +++ b/src/core/packet/transformer/action/SetGroupTodo.ts @@ -0,0 +1,24 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; +import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; + +class SetGroupTodo extends PacketTransformer { + constructor() { + super(); + } + + build(peer: number, msgSeq: string): OidbPacket { + const data = new NapProtoMsg(proto.OidbSvcTrpcTcp0XF90_1).encode({ + groupUin: peer, + msgSeq: BigInt(msgSeq) + }); + return OidbBase.build(0xF90, 1, data); + } + + parse(data: Buffer) { + return OidbBase.parse(data); + } +} + +export default new SetGroupTodo(); \ No newline at end of file diff --git a/src/core/packet/transformer/action/index.ts b/src/core/packet/transformer/action/index.ts index 03af3f35..f96312f8 100644 --- a/src/core/packet/transformer/action/index.ts +++ b/src/core/packet/transformer/action/index.ts @@ -8,3 +8,4 @@ export { default as SetSpecialTitle } from './SetSpecialTitle'; export { default as ImageOCR } from './ImageOCR'; export { default as MoveGroupFile } from './MoveGroupFile'; export { default as RenameGroupFile } from './RenameGroupFile'; +export { default as SetGroupTodo } from './SetGroupTodo'; \ No newline at end of file diff --git a/src/core/packet/transformer/proto/index.ts b/src/core/packet/transformer/proto/index.ts index 4f9534ab..59cf0b59 100644 --- a/src/core/packet/transformer/proto/index.ts +++ b/src/core/packet/transformer/proto/index.ts @@ -30,3 +30,4 @@ export * from './oidb/Oidb.0xED3_1'; export * from './oidb/Oidb.0XFE1_2'; export * from './oidb/OidbBase'; export * from './oidb/Oidb.0xE07'; +export * from './oidb/Oidb.0xf90_1'; diff --git a/src/core/packet/transformer/proto/oidb/Oidb.0xf90_1.ts b/src/core/packet/transformer/proto/oidb/Oidb.0xf90_1.ts new file mode 100644 index 00000000..98af201e --- /dev/null +++ b/src/core/packet/transformer/proto/oidb/Oidb.0xf90_1.ts @@ -0,0 +1,6 @@ +import { ProtoField, ScalarType } from "@napneko/nap-proto-core"; + +export const OidbSvcTrpcTcp0XF90_1 = { + groupUin: ProtoField(1, ScalarType.UINT32), + msgSeq: ProtoField(2, ScalarType.UINT64), +}; diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index e70c3c61..1e3af605 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -123,10 +123,12 @@ import SetGroupKickMembers from './extends/SetGroupKickMembers'; import { GetGroupDetailInfo } from './group/GetGroupDetailInfo'; import GetGroupAddRequest from './extends/GetGroupAddRequest'; import { GetCollectionList } from './extends/GetCollectionList'; +import { SetGroupTodo } from './packet/SetGroupTodo'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ + new SetGroupTodo(obContext, core), new GetGroupDetailInfo(obContext, core), new SetGroupKickMembers(obContext, core), new SetGroupAddOption(obContext, core), diff --git a/src/onebot/action/packet/SetGroupTodo.ts b/src/onebot/action/packet/SetGroupTodo.ts new file mode 100644 index 00000000..0fc1e3dd --- /dev/null +++ b/src/onebot/action/packet/SetGroupTodo.ts @@ -0,0 +1,31 @@ + +import { MessageUnique } from '@/common/message-unique'; +import { ChatType, Peer } from '@/core'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; +import { Static, Type } from '@sinclair/typebox'; +import { ActionName } from '../router'; + +const SchemaData = Type.Object({ + group_id: Type.String(), + message_id: Type.String(), + message_seq: Type.Optional(Type.String()) +}); + +type Payload = Static; +export class SetGroupTodo extends GetPacketStatusDepends { + override payloadSchema = SchemaData; + override actionName = ActionName.SetGroupTodo; + async _handle(payload: Payload) { + if (payload.message_seq) { + return await this.core.apis.PacketApi.pkt.operation.SetGroupTodo(+payload.group_id, payload.message_seq); + } + const peer: Peer = { + chatType: ChatType.KCHATTYPEGROUP, + peerUid: payload.group_id + }; + const { MsgId, Peer } = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id) ?? { Peer: peer, MsgId: payload.message_id }; + let msg = (await this.core.apis.MsgApi.getMsgsByMsgId(Peer, [MsgId])).msgList[0]; + if (!msg) throw new Error('消息不存在'); + await this.core.apis.PacketApi.pkt.operation.SetGroupTodo(+payload.group_id, msg.msgSeq); + } +} \ No newline at end of file diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index a0969976..593d6860 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -10,6 +10,7 @@ export interface InvalidCheckResult { } export const ActionName = { + SetGroupTodo: 'set_group_todo', SetGroupKickMembers: 'set_group_kick_members', SetGroupRobotAddOption: 'set_group_robot_add_option', SetGroupAddOption: 'set_group_add_option', diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 2bca8497..bc7d1cc8 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -40,7 +40,6 @@ import { OB11FriendRequestEvent } from '@/onebot/event/request/OB11FriendRequest 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 { BotOfflineEvent } from './event/notice/BotOfflineEvent'; import { NetworkAdapterConfig,