From 20398af6486ff84d5161b9c7a6d652bc65c9b06a 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, 25 Jan 2026 16:32:36 +0800 Subject: [PATCH] Refactor type handling and improve message parsing Updated several actions to use more precise type casting and type guards, improving type safety and clarity. Enhanced message parsing logic for forward messages and group/friend message history. Standardized return schemas and error handling for avatar and group portrait actions. --- .../action/extends/GetAiCharacters.ts | 4 +- .../extends/GetUnidirectionalFriendList.ts | 8 ++-- .../action/extends/SendPacket.ts | 3 +- .../action/extends/SetQQAvatar.ts | 2 +- .../action/go-cqhttp/GetForwardMsg.ts | 38 +++++++++++++------ .../action/go-cqhttp/GetFriendMsgHistory.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 13 ++++--- .../action/go-cqhttp/GetGroupMsgHistory.ts | 4 +- .../action/go-cqhttp/SendForwardMsg.ts | 7 ++-- .../action/go-cqhttp/SetGroupPortrait.ts | 22 ++++++++--- 10 files changed, 67 insertions(+), 38 deletions(-) diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index 14476c2d..c482b972 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -1,6 +1,5 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; -import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Type, Static } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ @@ -33,7 +32,8 @@ export class GetAiCharacters extends GetPacketStatusDepends ({ type: item.category, characters: item.voices.map((voice) => ({ diff --git a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts index fc3610ee..546121f8 100644 --- a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts @@ -39,16 +39,18 @@ export class GetUnidirectionalFriendList extends OneBotAction }; const packed_data = await this.pack_data(JSON.stringify(req_json)); const data = Buffer.from(packed_data); - const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketBuf }; + const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as unknown as PacketBuf }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); - const block_list = JSON.parse(block_json.data).rpt_block_list as { + interface BlockItem { uint64_uin: number; str_uid: string; bytes_nick: string; uint32_age: number; bytes_source: string; - }[]; + } + const block_data: { rpt_block_list: BlockItem[]; } = JSON.parse(block_json.data); + const block_list = block_data.rpt_block_list; return block_list.map((block) => ({ uin: block.uint64_uin, diff --git a/packages/napcat-onebot/action/extends/SendPacket.ts b/packages/napcat-onebot/action/extends/SendPacket.ts index 1e702021..1b54a2d0 100644 --- a/packages/napcat-onebot/action/extends/SendPacket.ts +++ b/packages/napcat-onebot/action/extends/SendPacket.ts @@ -21,7 +21,8 @@ export class SendPacket extends GetPacketStatusDepends override actionName = ActionName.SendPacket; async _handle (payload: PayloadType) { const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true'; - const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: Buffer.from(payload.data, 'hex') as PacketBuf }, rsp); + const packetData = Buffer.from(payload.data, 'hex') as unknown as PacketBuf; + const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: packetData }, rsp); return typeof data === 'object' ? data.toString('hex') : undefined; } } diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index 953841f8..23b72767 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -31,7 +31,7 @@ export default class SetAvatar extends OneBotAction { throw new Error(`头像${payload.file}设置失败,api无返回`); } // log(`头像设置返回:${JSON.stringify(ret)}`) - if (ret.result as number === 1004022) { + if (Number(ret.result) === 1004022) { throw new Error(`头像${payload.file}设置失败,文件可能不是图片格式`); } else if (ret.result !== 0) { throw new Error(`头像${payload.file}设置失败,未知的错误,${ret.result}:${ret.errMsg}`); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index 393b47a6..b1543ced 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -14,11 +14,15 @@ const PayloadSchema = Type.Object({ type PayloadType = Static; const ReturnSchema = Type.Object({ - messages: Type.Optional(Type.Array(Type.Any(), { description: '消息列表' })), + messages: Type.Optional(Type.Array(Type.Unknown(), { description: '消息列表' })), }, { description: '合并转发消息' }); type ReturnType = Static; +function isForward (msg: OB11MessageData | string): msg is OB11MessageForward { + return typeof msg !== 'string' && msg.type === OB11MessageDataType.forward; +} + export class GoCQHTTPGetForwardMsgAction extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetForwardMsg; override payloadSchema = PayloadSchema; @@ -43,13 +47,18 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { - return { + const fakeMsg: RawMessage = { chatType: ChatType.KCHATTYPEGROUP, elements: [{ elementType: ElementType.MULTIFORWARD, @@ -80,7 +89,7 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { const ob = (await this.obContext.apis.MsgApi.parseMessageV2(createFakeForwardMsg(resId), true))?.arrayMsg; - if (ob) { + const firstMsg = ob?.message?.[0]; + if (firstMsg && isForward(firstMsg)) { return { - messages: (ob?.message?.[0] as OB11MessageForward)?.data?.content, + messages: firstMsg.data.content, }; } throw new Error('protocolFallbackLogic: 找不到相关的聊天记录'); @@ -138,9 +149,12 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url))) - ).filter(msg => msg !== undefined); - return { messages: ob11MsgList as OB11Message[] }; + ).filter((msg): msg is OB11Message => msg !== undefined); + return { messages: ob11MsgList }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index cf63bfa4..d22ea7b4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -13,8 +13,8 @@ const PayloadSchema = Type.Object({ type PayloadType = Static; const ReturnSchema = Type.Object({ - files: Type.Array(Type.Any(), { description: '文件列表' }), - folders: Type.Array(Type.Any(), { description: '文件夹列表' }), + files: Type.Array(Type.Unknown(), { description: '文件列表' }), + folders: Type.Array(Type.Unknown(), { description: '文件夹列表' }), }, { description: '群文件夹文件列表' }); type ReturnType = Static; @@ -23,19 +23,20 @@ export class GetGroupFilesByFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - async _handle (payload: PayloadType) { - const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { + async _handle (payload: PayloadType): Promise { + const retRaw = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, fileCount: +payload.file_count, startIndex: 0, sortOrder: 2, showOnlinedocFolder: 0, folderId: payload.folder ?? payload.folder_id ?? '', - }).catch(() => []); + }); + const ret = Array.isArray(retRaw) ? retRaw : []; return { files: ret.filter(item => item.fileInfo) .map(item => OB11Construct.file(item.peerId, item.fileInfo!)), - folders: [] as [], + folders: [], }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts index fbd6a8d1..71fe33bc 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -46,7 +46,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url, payload.quick_reply))) - ).filter(msg => msg !== undefined); - return { messages: ob11MsgList as OB11Message[] }; + ).filter((msg): msg is OB11Message => msg !== undefined); + return { messages: ob11MsgList }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index fd33ea2a..e56b375b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -1,8 +1,9 @@ +import { OB11MessageMixType } from '@/napcat-onebot/types'; import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName } from '@/napcat-onebot/action/router'; // 未验证 -type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: any; }; +type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: OB11MessageMixType; }; export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { @@ -20,14 +21,14 @@ export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; - override async _handle (payload: SendMsgPayload): Promise { + override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Private); } } export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendGroupForwardMsg; - override async _handle (payload: SendMsgPayload): Promise { + override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Group); } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index 0c68893d..8b3abb5b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -10,12 +10,19 @@ export const SetGroupPortraitPayloadSchema = Type.Object({ export type SetGroupPortraitPayload = Static; -export default class SetGroupPortrait extends OneBotAction { +const ReturnSchema = Type.Object({ + result: Type.Number(), + errMsg: Type.String(), +}, { description: '设置结果' }); + +export type ReturnType = Static; + +export default class SetGroupPortrait extends OneBotAction { override actionName = ActionName.SetGroupPortrait; override payloadSchema = SetGroupPortraitPayloadSchema; - override returnSchema = Type.Any({ description: '设置结果' }); + override returnSchema = ReturnSchema; - async _handle (payload: SetGroupPortraitPayload): Promise { + async _handle (payload: SetGroupPortraitPayload): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); if (!success) { throw new Error(`头像${payload.file}设置失败,file字段可能格式不正确`); @@ -27,12 +34,15 @@ export default class SetGroupPortrait extends OneBotAction { }); throw new Error(`头像${payload.file}设置失败,无法获取头像,文件可能不存在`);